diff --git a/OpenRA.Game/Actor.cs b/OpenRA.Game/Actor.cs index ffc1609ad8..516a006348 100644 --- a/OpenRA.Game/Actor.cs +++ b/OpenRA.Game/Actor.cs @@ -138,7 +138,7 @@ namespace OpenRA Rectangle DetermineRenderBounds() { - var size = TraitsImplementing().Select(x => x.SelectionSize(this)).FirstOrDefault(); + var size = TraitsImplementing().Select(x => x.RenderSize(this)).FirstOrDefault(Exts.IsTraitEnabled); var offset = -size / 2; return new Rectangle(offset.X, offset.Y, size.X, size.Y); diff --git a/OpenRA.Game/Traits/TraitsInterfaces.cs b/OpenRA.Game/Traits/TraitsInterfaces.cs index 5f5654f6a6..1fff327143 100644 --- a/OpenRA.Game/Traits/TraitsInterfaces.cs +++ b/OpenRA.Game/Traits/TraitsInterfaces.cs @@ -101,6 +101,9 @@ namespace OpenRA.Traits public interface IAutoSelectionSizeInfo : ITraitInfoInterface { } public interface IAutoSelectionSize { int2 SelectionSize(Actor self); } + public interface IAutoRenderSizeInfo : ITraitInfoInterface { } + public interface IAutoRenderSize { int2 RenderSize(Actor self); } + public interface IIssueOrder { IEnumerable Orders { get; } diff --git a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj index 7eb026eb70..346cb88720 100644 --- a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj +++ b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj @@ -328,6 +328,7 @@ + @@ -417,6 +418,7 @@ + diff --git a/OpenRA.Mods.Common/Traits/Render/AutoRenderSize.cs b/OpenRA.Mods.Common/Traits/Render/AutoRenderSize.cs new file mode 100644 index 0000000000..d04750fd11 --- /dev/null +++ b/OpenRA.Mods.Common/Traits/Render/AutoRenderSize.cs @@ -0,0 +1,32 @@ +#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. + */ +#endregion + +using OpenRA.Traits; + +namespace OpenRA.Mods.Common.Traits.Render +{ + [Desc("Automatically calculates the screen map boundaries from the sprite size.")] + public class AutoRenderSizeInfo : ITraitInfo, Requires, IAutoRenderSizeInfo + { + public object Create(ActorInitializer init) { return new AutoRenderSize(this); } + } + + public class AutoRenderSize : IAutoRenderSize + { + public AutoRenderSize(AutoRenderSizeInfo info) { } + + public int2 RenderSize(Actor self) + { + var rs = self.Trait(); + return rs.AutoRenderSize(self); + } + } +} diff --git a/OpenRA.Mods.Common/Traits/Render/CustomRenderSize.cs b/OpenRA.Mods.Common/Traits/Render/CustomRenderSize.cs new file mode 100644 index 0000000000..7c6ad0dd8c --- /dev/null +++ b/OpenRA.Mods.Common/Traits/Render/CustomRenderSize.cs @@ -0,0 +1,35 @@ +#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. + */ +#endregion + +using OpenRA.Traits; + +namespace OpenRA.Mods.Common.Traits +{ + [Desc("Special case trait for actors that need to define targetable area and screen map bounds manually.")] + public class CustomRenderSizeInfo : ITraitInfo, IAutoRenderSizeInfo + { + [FieldLoader.Require] + public readonly int[] CustomBounds = null; + + public object Create(ActorInitializer init) { return new CustomRenderSize(this); } + } + + public class CustomRenderSize : IAutoRenderSize + { + readonly CustomRenderSizeInfo info; + public CustomRenderSize(CustomRenderSizeInfo info) { this.info = info; } + + public int2 RenderSize(Actor self) + { + return new int2(info.CustomBounds[0], info.CustomBounds[1]); + } + } +} diff --git a/OpenRA.Mods.Common/Traits/Render/RenderSprites.cs b/OpenRA.Mods.Common/Traits/Render/RenderSprites.cs index b7f599c5d5..dbefb874f3 100644 --- a/OpenRA.Mods.Common/Traits/Render/RenderSprites.cs +++ b/OpenRA.Mods.Common/Traits/Render/RenderSprites.cs @@ -238,6 +238,12 @@ namespace OpenRA.Mods.Common.Traits.Render // Required by WithSpriteBody and WithInfantryBody public int2 AutoSelectionSize(Actor self) + { + return AutoRenderSize(self); + } + + // Required by WithSpriteBody and WithInfantryBody + public int2 AutoRenderSize(Actor self) { return anims.Where(b => b.IsVisible && b.Animation.Animation.CurrentSequence != null) diff --git a/OpenRA.Mods.Common/Traits/Render/WithVoxelBody.cs b/OpenRA.Mods.Common/Traits/Render/WithVoxelBody.cs index 9b5d45389f..caf3b97b03 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithVoxelBody.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithVoxelBody.cs @@ -19,7 +19,7 @@ using OpenRA.Traits; namespace OpenRA.Mods.Common.Traits.Render { [Desc("Also returns a default selection size that is calculated automatically from the voxel dimensions.")] - public class WithVoxelBodyInfo : ConditionalTraitInfo, IRenderActorPreviewVoxelsInfo, Requires, IAutoSelectionSizeInfo + public class WithVoxelBodyInfo : ConditionalTraitInfo, IRenderActorPreviewVoxelsInfo, Requires, IAutoSelectionSizeInfo, IAutoRenderSizeInfo { public readonly string Sequence = "idle"; @@ -39,7 +39,7 @@ namespace OpenRA.Mods.Common.Traits.Render } } - public class WithVoxelBody : ConditionalTrait, IAutoSelectionSize + public class WithVoxelBody : ConditionalTrait, IAutoSelectionSize, IAutoRenderSize { readonly int2 size; @@ -61,5 +61,6 @@ namespace OpenRA.Mods.Common.Traits.Render } public int2 SelectionSize(Actor self) { return size; } + public int2 RenderSize(Actor self) { return size; } } } diff --git a/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs b/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs index 136f89c24f..a6cc2924c7 100644 --- a/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs +++ b/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs @@ -1234,6 +1234,25 @@ namespace OpenRA.Mods.Common.UtilityCommands } } + // Split Selection- and RenderSize + if (engineVersion < 20171115) + { + var autoSelSize = node.Value.Nodes.FirstOrDefault(n => n.Key.StartsWith("AutoSelectionSize", StringComparison.Ordinal)); + if (autoSelSize != null) + node.Value.Nodes.Add(new MiniYamlNode("AutoRenderSize", "")); + + var customSelSize = node.Value.Nodes.FirstOrDefault(n => n.Key.StartsWith("CustomSelectionSize", StringComparison.Ordinal)); + if (customSelSize != null) + { + var bounds = customSelSize.Value.Nodes.FirstOrDefault(n => n.Key == "CustomBounds"); + var customRenderSize = new MiniYamlNode("CustomRenderSize", ""); + if (bounds != null) + customRenderSize.Value.Nodes.Add(bounds); + + node.Value.Nodes.Add(customRenderSize); + } + } + UpgradeActorRules(modData, engineVersion, ref node.Value.Nodes, node, depth + 1); } diff --git a/mods/cnc/rules/civilian.yaml b/mods/cnc/rules/civilian.yaml index 18d7f4aa8f..965bac1e1a 100644 --- a/mods/cnc/rules/civilian.yaml +++ b/mods/cnc/rules/civilian.yaml @@ -417,6 +417,8 @@ BRIDGE1: FreeActor@south: Actor: bridgehut SpawnOffset: 0,2 + CustomRenderSize: + CustomBounds: 96,96 BRIDGE2: Inherits: ^Bridge @@ -434,6 +436,8 @@ BRIDGE2: FreeActor@south: Actor: bridgehut SpawnOffset: 2,2 + CustomRenderSize: + CustomBounds: 120,120 BRIDGE3: Inherits: ^Bridge @@ -451,6 +455,8 @@ BRIDGE3: FreeActor@south: Actor: bridgehut SpawnOffset: 1,2 + CustomRenderSize: + CustomBounds: 144,120 BRIDGE4: Inherits: ^Bridge @@ -468,6 +474,8 @@ BRIDGE4: FreeActor@south: Actor: bridgehut SpawnOffset: 3,2 + CustomRenderSize: + CustomBounds: 144,96 BRIDGEHUT: AlwaysVisible: @@ -479,6 +487,8 @@ BRIDGEHUT: LegacyBridgeHut: Targetable: TargetTypes: BridgeHut, C4 + CustomRenderSize: + CustomBounds: 48,48 C1: Inherits: ^CivInfantry diff --git a/mods/cnc/rules/defaults.yaml b/mods/cnc/rules/defaults.yaml index 6512cd4a4d..944b692e45 100644 --- a/mods/cnc/rules/defaults.yaml +++ b/mods/cnc/rules/defaults.yaml @@ -13,6 +13,7 @@ QuantizeFacingsFromSequence: AutoSelectionSize: RenderSprites: + AutoRenderSize: ^1x1Shape: HitShape: diff --git a/mods/cnc/rules/misc.yaml b/mods/cnc/rules/misc.yaml index b6a1ebab81..5f67ea24ef 100644 --- a/mods/cnc/rules/misc.yaml +++ b/mods/cnc/rules/misc.yaml @@ -134,3 +134,4 @@ FLARE: AutoSelectionSize: EditorTilesetFilter: Categories: System + AutoRenderSize: diff --git a/mods/cnc/rules/structures.yaml b/mods/cnc/rules/structures.yaml index 5f16dc3aed..5c8c5ea4a1 100644 --- a/mods/cnc/rules/structures.yaml +++ b/mods/cnc/rules/structures.yaml @@ -243,6 +243,7 @@ SILO: SelectionDecorations: VisualBounds: 49,30 -AcceptsDeliveredCash: + AutoRenderSize: PYLE: Inherits: ^BaseBuilding @@ -814,6 +815,7 @@ SAM: Amount: -20 BodyOrientation: UseClassicFacingFudge: True + AutoRenderSize: OBLI: Inherits: ^Defense diff --git a/mods/d2k/maps/atreides-04/rules.yaml b/mods/d2k/maps/atreides-04/rules.yaml index cbb338ed89..0b866a11a3 100644 --- a/mods/d2k/maps/atreides-04/rules.yaml +++ b/mods/d2k/maps/atreides-04/rules.yaml @@ -88,6 +88,7 @@ tile475: BodyOrientation: QuantizedFacings: 1 AutoSelectionSize: + AutoRenderSize: # Placed after the sietch is destroyed so that the cliff is still unpassable invisibleBlocker: diff --git a/mods/d2k/rules/arrakis.yaml b/mods/d2k/rules/arrakis.yaml index f0603a8471..73a657a900 100644 --- a/mods/d2k/rules/arrakis.yaml +++ b/mods/d2k/rules/arrakis.yaml @@ -63,6 +63,7 @@ spicebloom: Radius: 512 EditorTilesetFilter: Categories: System + AutoRenderSize: sandworm: Inherits@1: ^SpriteActor diff --git a/mods/d2k/rules/defaults.yaml b/mods/d2k/rules/defaults.yaml index 13858b6c7b..d01bfb332a 100644 --- a/mods/d2k/rules/defaults.yaml +++ b/mods/d2k/rules/defaults.yaml @@ -13,6 +13,7 @@ QuantizeFacingsFromSequence: AutoSelectionSize: RenderSprites: + AutoRenderSize: ^GainsExperience: GainsExperience: diff --git a/mods/d2k/rules/misc.yaml b/mods/d2k/rules/misc.yaml index 5bb109e94e..4635659e32 100644 --- a/mods/d2k/rules/misc.yaml +++ b/mods/d2k/rules/misc.yaml @@ -138,6 +138,8 @@ crate: CustomBounds: 20,20 EditorTilesetFilter: Categories: System + CustomRenderSize: + CustomBounds: 20,20 mpspawn: EditorOnlyTooltip: diff --git a/mods/ra/maps/allies-01/rules.yaml b/mods/ra/maps/allies-01/rules.yaml index 8abf380c4d..2c69b0a1ae 100644 --- a/mods/ra/maps/allies-01/rules.yaml +++ b/mods/ra/maps/allies-01/rules.yaml @@ -22,6 +22,7 @@ TRAN.Extraction: AutoSelectionSize: RenderSprites: Image: tran + AutoRenderSize: TRAN.Insertion: Inherits: TRAN.Extraction @@ -31,6 +32,7 @@ TRAN.Insertion: AutoSelectionSize: RenderSprites: Image: tran + AutoRenderSize: EINSTEIN: Passenger: diff --git a/mods/ra/rules/civilian.yaml b/mods/ra/rules/civilian.yaml index aac076b050..d2e3cc5d1f 100644 --- a/mods/ra/rules/civilian.yaml +++ b/mods/ra/rules/civilian.yaml @@ -320,6 +320,8 @@ BARL: -Demolishable: EditorTilesetFilter: Categories: Decoration + CustomRenderSize: + CustomBounds: 24,24 BRL3: Inherits: ^TechBuilding @@ -344,6 +346,8 @@ BRL3: -Demolishable: EditorTilesetFilter: Categories: Decoration + CustomRenderSize: + CustomBounds: 24,24 AMMOBOX1: Inherits: ^AmmoBox @@ -491,6 +495,8 @@ BRIDGE1: FreeActor@south: Actor: bridgehut SpawnOffset: 0,1 + CustomRenderSize: + CustomBounds: 120,72 BRIDGE2: Inherits: ^Bridge @@ -509,6 +515,8 @@ BRIDGE2: FreeActor@south: Actor: bridgehut SpawnOffset: 2,1 + CustomRenderSize: + CustomBounds: 120,48 SBRIDGE1: Inherits: ^Bridge @@ -527,6 +535,8 @@ SBRIDGE1: FreeActor@south: Actor: bridgehut.small SpawnOffset: 1,1 + CustomRenderSize: + CustomBounds: 72,48 SBRIDGE2: Inherits: ^Bridge @@ -545,6 +555,8 @@ SBRIDGE2: FreeActor@east: Actor: bridgehut.small SpawnOffset: 1,1 + CustomRenderSize: + CustomBounds: 48,72 SBRIDGE3: Inherits: ^Bridge diff --git a/mods/ra/rules/defaults.yaml b/mods/ra/rules/defaults.yaml index 41639c62a5..2ff0f17882 100644 --- a/mods/ra/rules/defaults.yaml +++ b/mods/ra/rules/defaults.yaml @@ -12,6 +12,7 @@ QuantizeFacingsFromSequence: AutoSelectionSize: RenderSprites: + AutoRenderSize: ^1x1Shape: HitShape: @@ -786,6 +787,8 @@ Type: Light EditorTilesetFilter: Categories: Decoration + CustomRenderSize: + CustomBounds: 24,24 ^CivBuilding: Inherits: ^TechBuilding @@ -974,6 +977,8 @@ ScriptTriggers: BodyOrientation: QuantizedFacings: 1 + CustomRenderSize: + CustomBounds: 96,48 ^Rock: Inherits@1: ^SpriteActor diff --git a/mods/ra/rules/misc.yaml b/mods/ra/rules/misc.yaml index febc414ca7..9570861b5c 100644 --- a/mods/ra/rules/misc.yaml +++ b/mods/ra/rules/misc.yaml @@ -201,6 +201,7 @@ FLARE: AutoSelectionSize: EditorTilesetFilter: Categories: Decoration + AutoRenderSize: MINE: Inherits@1: ^SpriteActor diff --git a/mods/ts/rules/aircraft.yaml b/mods/ts/rules/aircraft.yaml index 3263b89405..421695ad3b 100644 --- a/mods/ts/rules/aircraft.yaml +++ b/mods/ts/rules/aircraft.yaml @@ -381,3 +381,4 @@ HUNTER: HitShape: EditorTilesetFilter: Categories: System + AutoRenderSize: diff --git a/mods/ts/rules/bridges.yaml b/mods/ts/rules/bridges.yaml index 6579dfd774..3d2166e6ae 100644 --- a/mods/ts/rules/bridges.yaml +++ b/mods/ts/rules/bridges.yaml @@ -34,6 +34,7 @@ CABHUT: Name: Bridge EditorTilesetFilter: Categories: Bridge + AutoRenderSize: ^LowBridge: Inherits: ^LowBridgeRamp @@ -81,6 +82,8 @@ LOBRDG_A_D: BOffset: 1,1 CustomSelectionSize: CustomBounds: 96, 48 + CustomRenderSize: + CustomBounds: 96, 48 LOBRDG_B: Inherits: ^LowBridge @@ -117,6 +120,8 @@ LOBRDG_B_D: BOffset: -1,1 CustomSelectionSize: CustomBounds: 96, 48 + CustomRenderSize: + CustomBounds: 96, 48 LOBRDG_R_SE: Inherits: ^LowBridgeRamp @@ -177,6 +182,8 @@ LOBRDG_R_SW: CustomBounds: 96, 144 EditorTilesetFilter: Categories: Bridge + CustomRenderSize: + CustomBounds: 96, 144 BRIDGE1: Inherits: ^ElevatedBridgePlaceholder diff --git a/mods/ts/rules/defaults.yaml b/mods/ts/rules/defaults.yaml index 345667ee5e..2e28104beb 100644 --- a/mods/ts/rules/defaults.yaml +++ b/mods/ts/rules/defaults.yaml @@ -15,6 +15,7 @@ QuantizeFacingsFromSequence: AutoSelectionSize: RenderSprites: + AutoRenderSize: ^GainsExperience: GainsExperience: @@ -431,6 +432,8 @@ CustomBounds: 24,24 EditorTilesetFilter: Categories: System + CustomRenderSize: + CustomBounds: 24,24 ^Wall: Inherits@1: ^SpriteActor @@ -1099,6 +1102,7 @@ TerrainType: Rail EditorTilesetFilter: Categories: Railway + AutoRenderSize: ^Tunnel: RenderSprites: @@ -1118,6 +1122,8 @@ Dimensions: 3, 3 EditorTilesetFilter: Categories: Tunnel + CustomRenderSize: + CustomBounds: 144, 144 ^Gate: Inherits: ^Building diff --git a/mods/ts/rules/gdi-infantry.yaml b/mods/ts/rules/gdi-infantry.yaml index 01685acbfd..7f071521cb 100644 --- a/mods/ts/rules/gdi-infantry.yaml +++ b/mods/ts/rules/gdi-infantry.yaml @@ -188,6 +188,7 @@ JUMPJET.Husk: FallbackSequence: die-splash EditorTilesetFilter: Categories: Husk + AutoRenderSize: GHOST: Inherits: ^Soldier diff --git a/mods/ts/rules/nod-support.yaml b/mods/ts/rules/nod-support.yaml index ac1772e048..21178fc64f 100644 --- a/mods/ts/rules/nod-support.yaml +++ b/mods/ts/rules/nod-support.yaml @@ -129,6 +129,8 @@ NAFNCE: Weapons: SmallDebris Pieces: 0, 1 Range: 2c0, 5c0 + CustomRenderSize: + CustomBounds: 48, 24 NALASR: Inherits: ^Defense diff --git a/mods/ts/rules/trees.yaml b/mods/ts/rules/trees.yaml index 03b424a43b..09627ee25f 100644 --- a/mods/ts/rules/trees.yaml +++ b/mods/ts/rules/trees.yaml @@ -118,6 +118,7 @@ VEINHOLE: AutoSelectionSize: EditorTilesetFilter: Categories: Resource spawn + AutoRenderSize: ^TibFlora: Inherits: ^Tree