diff --git a/OpenRA.Game/Actor.cs b/OpenRA.Game/Actor.cs index 3f8599470e..e8d704cf59 100644 --- a/OpenRA.Game/Actor.cs +++ b/OpenRA.Game/Actor.cs @@ -41,12 +41,14 @@ namespace OpenRA public int Generation; Lazy bounds; + Lazy visualBounds; Lazy facing; Lazy health; Lazy occupySpace; Lazy effectiveOwner; public Rectangle Bounds { get { return bounds.Value; } } + public Rectangle VisualBounds { get { return visualBounds.Value; } } public IOccupySpace OccupiesSpace { get { return occupySpace.Value; } } public IEffectiveOwner EffectiveOwner { get { return effectiveOwner.Value; } } @@ -110,6 +112,21 @@ namespace OpenRA return new Rectangle(offset.X, offset.Y, size.X, size.Y); }); + visualBounds = Exts.Lazy(() => + { + var sd = Info.Traits.GetOrDefault(); + if (sd == null || sd.SelectionBoxBounds == null) + return bounds.Value; + + var size = new int2(sd.SelectionBoxBounds[0], sd.SelectionBoxBounds[1]); + + var offset = -size / 2; + if (sd.SelectionBoxBounds.Length > 2) + offset += new int2(sd.SelectionBoxBounds[2], sd.SelectionBoxBounds[3]); + + return new Rectangle(offset.X, offset.Y, size.X, size.Y); + }); + renderModifiers = TraitsImplementing().ToArray(); renders = TraitsImplementing().ToArray(); disables = TraitsImplementing().ToArray(); diff --git a/OpenRA.Game/Graphics/SelectionBarsRenderable.cs b/OpenRA.Game/Graphics/SelectionBarsRenderable.cs index a297a14e35..45cf7b9e36 100644 --- a/OpenRA.Game/Graphics/SelectionBarsRenderable.cs +++ b/OpenRA.Game/Graphics/SelectionBarsRenderable.cs @@ -158,7 +158,7 @@ namespace OpenRA.Graphics var health = actor.TraitOrDefault(); var screenPos = wr.ScreenPxPosition(pos); - var bounds = actor.Bounds; + var bounds = actor.VisualBounds; bounds.Offset(screenPos.X, screenPos.Y); var start = new float2(bounds.Left + 1, bounds.Top); diff --git a/OpenRA.Game/Graphics/WorldRenderer.cs b/OpenRA.Game/Graphics/WorldRenderer.cs index 4663496448..55d0e0f8af 100644 --- a/OpenRA.Game/Graphics/WorldRenderer.cs +++ b/OpenRA.Game/Graphics/WorldRenderer.cs @@ -190,12 +190,8 @@ namespace OpenRA.Graphics public void DrawRollover(Actor unit) { - var selectable = unit.TraitOrDefault(); - if (selectable != null) - { - if (selectable.Info.Selectable) - new SelectionBarsRenderable(unit).Render(this); - } + if (unit.HasTrait()) + new SelectionBarsRenderable(unit).Render(this); } public void DrawRangeCircle(WPos pos, WRange range, Color c) diff --git a/OpenRA.Game/OpenRA.Game.csproj b/OpenRA.Game/OpenRA.Game.csproj index e986b98116..6f66baceeb 100644 --- a/OpenRA.Game/OpenRA.Game.csproj +++ b/OpenRA.Game/OpenRA.Game.csproj @@ -180,7 +180,6 @@ - @@ -235,7 +234,6 @@ - diff --git a/OpenRA.Game/Orders/UnitOrderGenerator.cs b/OpenRA.Game/Orders/UnitOrderGenerator.cs index faaee0190d..899d6ba3f3 100644 --- a/OpenRA.Game/Orders/UnitOrderGenerator.cs +++ b/OpenRA.Game/Orders/UnitOrderGenerator.cs @@ -63,8 +63,7 @@ namespace OpenRA.Orders if (underCursor != null && (mi.Modifiers.HasModifier(Modifiers.Shift) || !world.Selection.Actors.Any())) { - var selectable = underCursor.TraitOrDefault(); - if (selectable != null && selectable.Info.Selectable) + if (underCursor.HasTrait()) useSelect = true; } diff --git a/OpenRA.Game/Traits/Selectable.cs b/OpenRA.Game/Traits/Selectable.cs index ed1df48ec1..727515a047 100644 --- a/OpenRA.Game/Traits/Selectable.cs +++ b/OpenRA.Game/Traits/Selectable.cs @@ -8,17 +8,14 @@ */ #endregion -using System.Collections.Generic; -using System.Drawing; -using System.Linq; -using OpenRA.Graphics; - namespace OpenRA.Traits { + [Desc("This actor is selectable. Defines bounds of selectable area, selection class and selection priority.")] public class SelectableInfo : ITraitInfo { - public readonly bool Selectable = true; public readonly int Priority = 10; + + [Desc("Bounds for the selectable area.")] public readonly int[] Bounds = null; [Desc("All units having the same selection class specified will be selected with select-by-type commands (e.g. double-click). " @@ -28,46 +25,13 @@ namespace OpenRA.Traits public object Create(ActorInitializer init) { return new Selectable(init.Self, this); } } - public class Selectable : IPostRenderSelection + public class Selectable { public readonly string Class = null; - public SelectableInfo Info; - readonly Actor self; - public Selectable(Actor self, SelectableInfo info) { - this.self = self; - Info = info; Class = string.IsNullOrEmpty(info.Class) ? self.Info.Name : info.Class; } - - IEnumerable ActivityTargetPath() - { - if (!self.IsInWorld || self.IsDead) - yield break; - - var activity = self.GetCurrentActivity(); - if (activity != null) - { - var targets = activity.GetTargets(self); - yield return self.CenterPosition; - - foreach (var t in targets.Where(t => t.Type != TargetType.Invalid)) - yield return t.CenterPosition; - } - } - - public IEnumerable RenderAfterWorld(WorldRenderer wr) - { - if (!Info.Selectable) - yield break; - - yield return new SelectionBoxRenderable(self, Color.White); - yield return new SelectionBarsRenderable(self); - - if (self.World.LocalPlayer != null && self.World.LocalPlayer.PlayerActor.Trait().PathDebug) - yield return new TargetLineRenderable(ActivityTargetPath(), Color.Green); - } } } diff --git a/OpenRA.Game/Traits/TraitsInterfaces.cs b/OpenRA.Game/Traits/TraitsInterfaces.cs index 2e82851707..c2e7e154df 100644 --- a/OpenRA.Game/Traits/TraitsInterfaces.cs +++ b/OpenRA.Game/Traits/TraitsInterfaces.cs @@ -110,6 +110,11 @@ namespace OpenRA.Traits public interface ISeedableResource { void Seed(Actor self); } + public interface ISelectionDecorationsInfo + { + int[] SelectionBoxBounds { get; } + } + public interface IVoiced { string VoiceSet { get; } diff --git a/OpenRA.Game/Widgets/WorldInteractionControllerWidget.cs b/OpenRA.Game/Widgets/WorldInteractionControllerWidget.cs index ca07f6d9fb..af381f97e5 100644 --- a/OpenRA.Game/Widgets/WorldInteractionControllerWidget.cs +++ b/OpenRA.Game/Widgets/WorldInteractionControllerWidget.cs @@ -92,7 +92,7 @@ namespace OpenRA.Widgets { if (!hasBox && World.Selection.Actors.Any() && !multiClick) { - if (!(World.ScreenMap.ActorsAt(xy).Where(x => x.HasTrait() && x.Trait().Info.Selectable && + if (!(World.ScreenMap.ActorsAt(xy).Where(x => x.HasTrait() && (x.Owner.IsAlliedWith(World.RenderPlayer) || !World.FogObscures(x))).Any() && !mi.Modifiers.HasModifier(Modifiers.Ctrl) && !mi.Modifiers.HasModifier(Modifiers.Alt) && UnitOrderGenerator.InputOverridesSelection(World, xy, mi))) { @@ -292,7 +292,7 @@ namespace OpenRA.Widgets var s = a.TraitOrDefault(); // sc == null means that units, that meet all other criteria, get selected - return s != null && s.Info.Selectable && (selectionClasses == null || selectionClasses.Contains(s.Class)); + return s != null && (selectionClasses == null || selectionClasses.Contains(s.Class)); }); } @@ -303,11 +303,7 @@ namespace OpenRA.Widgets a = b; return world.ScreenMap.ActorsInBox(a, b) - .Where(x => - { - var s = x.TraitOrDefault(); - return s != null && s.Info.Selectable && (x.Owner.IsAlliedWith(world.RenderPlayer) || !world.FogObscures(x)); - }) + .Where(x => x.HasTrait() && (x.Owner.IsAlliedWith(world.RenderPlayer) || !world.FogObscures(x))) .GroupBy(x => x.GetSelectionPriority()) .OrderByDescending(g => g.Key) .Select(g => g.AsEnumerable()) diff --git a/OpenRA.Game/Graphics/SelectionBoxRenderable.cs b/OpenRA.Mods.Common/Graphics/SelectionBoxRenderable.cs similarity index 80% rename from OpenRA.Game/Graphics/SelectionBoxRenderable.cs rename to OpenRA.Mods.Common/Graphics/SelectionBoxRenderable.cs index 825314c0a5..fd1bb1f099 100644 --- a/OpenRA.Game/Graphics/SelectionBoxRenderable.cs +++ b/OpenRA.Mods.Common/Graphics/SelectionBoxRenderable.cs @@ -12,22 +12,22 @@ using System.Drawing; using OpenRA.Graphics; using OpenRA.Traits; -namespace OpenRA.Graphics +namespace OpenRA.Mods.Common.Graphics { public struct SelectionBoxRenderable : IRenderable, IFinalizedRenderable { readonly WPos pos; readonly float scale; - readonly Rectangle bounds; + readonly Rectangle visualBounds; readonly Color color; public SelectionBoxRenderable(Actor actor, Color color) - : this(actor.CenterPosition, actor.Bounds, 1f, color) { } + : this(actor.CenterPosition, actor.VisualBounds, 1f, color) { } - public SelectionBoxRenderable(WPos pos, Rectangle bounds, float scale, Color color) + public SelectionBoxRenderable(WPos pos, Rectangle visualBounds, float scale, Color color) { this.pos = pos; - this.bounds = bounds; + this.visualBounds = visualBounds; this.scale = scale; this.color = color; } @@ -40,15 +40,15 @@ namespace OpenRA.Graphics public IRenderable WithPalette(PaletteReference newPalette) { return this; } public IRenderable WithZOffset(int newOffset) { return this; } - public IRenderable OffsetBy(WVec vec) { return new SelectionBoxRenderable(pos + vec, bounds, scale, color); } + public IRenderable OffsetBy(WVec vec) { return new SelectionBoxRenderable(pos + vec, visualBounds, scale, color); } public IRenderable AsDecoration() { return this; } public IFinalizedRenderable PrepareRender(WorldRenderer wr) { return this; } public void Render(WorldRenderer wr) { var screenPos = wr.ScreenPxPosition(pos); - var tl = screenPos + scale * new float2(bounds.Left, bounds.Top); - var br = screenPos + scale * new float2(bounds.Right, bounds.Bottom); + var tl = screenPos + scale * new float2(visualBounds.Left, visualBounds.Top); + var br = screenPos + scale * new float2(visualBounds.Right, visualBounds.Bottom); var tr = new float2(br.X, tl.Y); var bl = new float2(tl.X, br.Y); var u = new float2(4f / wr.Viewport.Zoom, 0); diff --git a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj index b42d802411..44e8c69a92 100644 --- a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj +++ b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj @@ -171,6 +171,7 @@ + @@ -309,6 +310,7 @@ + @@ -438,6 +440,7 @@ + diff --git a/OpenRA.Mods.Common/Traits/CustomSelectionSize.cs b/OpenRA.Mods.Common/Traits/CustomSelectionSize.cs new file mode 100644 index 0000000000..e3eca9e5dd --- /dev/null +++ b/OpenRA.Mods.Common/Traits/CustomSelectionSize.cs @@ -0,0 +1,36 @@ +#region Copyright & License Information +/* + * Copyright 2007-2015 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. For more information, + * see COPYING. + */ +#endregion + +using System; +using OpenRA.Traits; + +namespace OpenRA.Mods.Common.Traits +{ + [Desc("Special case trait for unselectable actors that need to define targetable area bounds", + "for special cases like C4, engineer repair and tooltips.", + "Examples: bridge huts and crates.")] + public class CustomSelectionSizeInfo : ITraitInfo + { + public readonly int[] CustomBounds = null; + + public object Create(ActorInitializer init) { return new CustomSelectionSize(this); } + } + + public class CustomSelectionSize : IAutoSelectionSize + { + readonly CustomSelectionSizeInfo info; + public CustomSelectionSize(CustomSelectionSizeInfo info) { this.info = info; } + + public int2 SelectionSize(Actor self) + { + return new int2(info.CustomBounds[0], info.CustomBounds[1]); + } + } +} diff --git a/OpenRA.Game/Traits/SelectionDecorations.cs b/OpenRA.Mods.Common/Traits/Render/SelectionDecorations.cs similarity index 70% rename from OpenRA.Game/Traits/SelectionDecorations.cs rename to OpenRA.Mods.Common/Traits/Render/SelectionDecorations.cs index 072a556243..ce4a3dea52 100644 --- a/OpenRA.Game/Traits/SelectionDecorations.cs +++ b/OpenRA.Mods.Common/Traits/Render/SelectionDecorations.cs @@ -9,16 +9,33 @@ #endregion using System.Collections.Generic; +using System.Drawing; using System.Linq; using OpenRA.Graphics; +using OpenRA.Mods.Common.Graphics; +using OpenRA.Traits; -namespace OpenRA.Traits +namespace OpenRA.Mods.Common.Traits { - public class SelectionDecorationsInfo : ITraitInfo + public class SelectionDecorationsInfo : ITraitInfo, ISelectionDecorationsInfo { public readonly string Palette = "chrome"; + [Desc("Visual bounds for selection box. If null, it uses AutoSelectionSize.", + "The first two values define the bounds' size, the optional third and fourth", + "values specify the position relative to the actors' center. Defaults to selectable bounds.")] + public readonly int[] VisualBounds = null; + + [Desc("Health bar, production progress bar etc.")] + public readonly bool RenderSelectionBars = true; + + public readonly bool RenderSelectionBox = true; + + public readonly Color SelectionBoxColor = Color.White; + public object Create(ActorInitializer init) { return new SelectionDecorations(init.Self, this); } + + public int[] SelectionBoxBounds { get { return VisualBounds; } } } public class SelectionDecorations : IPostRenderSelection @@ -27,7 +44,7 @@ namespace OpenRA.Traits static readonly string[] PipStrings = { "pip-empty", "pip-green", "pip-yellow", "pip-red", "pip-gray", "pip-blue", "pip-ammo", "pip-ammoempty" }; static readonly string[] TagStrings = { "", "tag-fake", "tag-primary" }; - public SelectionDecorationsInfo Info; + public readonly SelectionDecorationsInfo Info; readonly Actor self; public SelectionDecorations(Actor self, SelectionDecorationsInfo info) @@ -36,12 +53,37 @@ namespace OpenRA.Traits Info = info; } + IEnumerable ActivityTargetPath() + { + if (!self.IsInWorld || self.IsDead) + yield break; + + var activity = self.GetCurrentActivity(); + if (activity != null) + { + var targets = activity.GetTargets(self); + yield return self.CenterPosition; + + foreach (var t in targets.Where(t => t.Type != TargetType.Invalid)) + yield return t.CenterPosition; + } + } + public IEnumerable RenderAfterWorld(WorldRenderer wr) { if (!self.Owner.IsAlliedWith(self.World.RenderPlayer) || self.World.FogObscures(self)) yield break; - var b = self.Bounds; + if (Info.RenderSelectionBox) + yield return new SelectionBoxRenderable(self, Info.SelectionBoxColor); + + if (Info.RenderSelectionBars) + yield return new SelectionBarsRenderable(self); + + if (self.World.LocalPlayer != null && self.World.LocalPlayer.PlayerActor.Trait().PathDebug) + yield return new TargetLineRenderable(ActivityTargetPath(), Color.Green); + + var b = self.VisualBounds; var pos = wr.ScreenPxPosition(self.CenterPosition); var tl = wr.Viewport.WorldToViewPx(pos + new int2(b.Left, b.Top)); var bl = wr.Viewport.WorldToViewPx(pos + new int2(b.Left, b.Bottom)); @@ -85,7 +127,7 @@ namespace OpenRA.Traits var pipxyBase = basePosition + new int2(1 - pipSize.X / 2, -(3 + pipSize.Y / 2)); var pipxyOffset = new int2(0, 0); var pal = wr.Palette(Info.Palette); - var width = self.Bounds.Width; + var width = self.VisualBounds.Width; foreach (var pips in pipSources) { diff --git a/OpenRA.Mods.Common/Traits/SupportPowers/GrantUpgradePower.cs b/OpenRA.Mods.Common/Traits/SupportPowers/GrantUpgradePower.cs index 76080d3239..18f2e1aaae 100644 --- a/OpenRA.Mods.Common/Traits/SupportPowers/GrantUpgradePower.cs +++ b/OpenRA.Mods.Common/Traits/SupportPowers/GrantUpgradePower.cs @@ -12,6 +12,7 @@ using System.Collections.Generic; using System.Drawing; using System.Linq; using OpenRA.Graphics; +using OpenRA.Mods.Common.Graphics; using OpenRA.Traits; namespace OpenRA.Mods.Common.Traits diff --git a/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs b/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs index 765bb75321..ee98153315 100644 --- a/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs +++ b/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs @@ -1152,6 +1152,29 @@ namespace OpenRA.Mods.Common.UtilityCommands } } + // 'Selectable' boolean was removed from selectable trait. + if (engineVersion < 20150619) + { + if (depth == 1 && node.Value.Nodes.Exists(n => n.Key == "Selectable")) + { + var selectable = node.Value.Nodes.FirstOrDefault(n => n.Key == "Selectable"); + if (node.Key == "Selectable" && selectable.Value.Value == "false") + node.Key = "SelectableRemoveMe"; + + // To cover rare cases where the boolean was 'true' + if (node.Key == "Selectable" && selectable.Value.Value == "true") + node.Value.Nodes.Remove(selectable); + } + + if (depth == 0 && node.Value.Nodes.Exists(n => n.Key == "SelectableRemoveMe")) + node.Value.Nodes.RemoveAll(n => n.Key == "SelectableRemoveMe"); + Console.WriteLine("The 'Selectable' boolean has been removed from the Selectable trait."); + Console.WriteLine("If you just want to disable an inherited Selectable trait, use -Selectable instead."); + Console.WriteLine("For special cases like bridge huts, which need bounds to be targetable by C4 and engineers,"); + Console.WriteLine("give them the CustomSelectionSize trait with CustomBounds."); + Console.WriteLine("See RA and C&C bridge huts or crates for reference."); + } + UpgradeActorRules(engineVersion, ref node.Value.Nodes, node, depth + 1); } } diff --git a/OpenRA.Mods.RA/Traits/SupportPowers/ChronoshiftPower.cs b/OpenRA.Mods.RA/Traits/SupportPowers/ChronoshiftPower.cs index c6438fe380..642c4983d9 100644 --- a/OpenRA.Mods.RA/Traits/SupportPowers/ChronoshiftPower.cs +++ b/OpenRA.Mods.RA/Traits/SupportPowers/ChronoshiftPower.cs @@ -12,6 +12,7 @@ using System.Collections.Generic; using System.Drawing; using System.Linq; using OpenRA.Graphics; +using OpenRA.Mods.Common.Graphics; using OpenRA.Mods.Common.Traits; using OpenRA.Mods.RA.Activities; diff --git a/mods/cnc/maps/nod04b/map.yaml b/mods/cnc/maps/nod04b/map.yaml index 1a7af70e06..9565289096 100644 --- a/mods/cnc/maps/nod04b/map.yaml +++ b/mods/cnc/maps/nod04b/map.yaml @@ -545,8 +545,7 @@ Rules: ShowOwnerRow: false TRAN: RejectsOrders: - Selectable: - Selectable: false + -Selectable: RevealsShroud: Range: 5c0 diff --git a/mods/cnc/rules/aircraft.yaml b/mods/cnc/rules/aircraft.yaml index 2e346a3fc7..6cbdb96c33 100644 --- a/mods/cnc/rules/aircraft.yaml +++ b/mods/cnc/rules/aircraft.yaml @@ -9,8 +9,6 @@ TRAN: BuildPaletteOrder: 10 Prerequisites: hpad Queue: Aircraft.GDI, Aircraft.Nod - Selectable: - Bounds: 41,41 Helicopter: LandWhenIdle: true ROT: 5 @@ -42,6 +40,8 @@ TRAN: EmptyWeapon: HeliExplode AutoSelectionSize: RenderSprites: + SelectionDecorations: + VisualBounds: 41,41 HELI: Inherits: ^Helicopter @@ -54,8 +54,6 @@ HELI: BuildPaletteOrder: 20 Prerequisites: hpad, anyhq, ~techlevel.medium Queue: Aircraft.Nod - Selectable: - Bounds: 30,24 Helicopter: RearmBuildings: hpad ROT: 4 @@ -95,6 +93,8 @@ HELI: EmptyWeapon: HeliExplode AutoSelectionSize: RenderSprites: + SelectionDecorations: + VisualBounds: 30,24 ORCA: Inherits: ^Helicopter @@ -107,8 +107,6 @@ ORCA: BuildPaletteOrder: 20 Prerequisites: hpad, anyhq, ~techlevel.medium Queue: Aircraft.GDI - Selectable: - Bounds: 30,24 Helicopter: RearmBuildings: hpad ROT: 4 @@ -144,6 +142,8 @@ ORCA: AutoSelectionSize: WithMoveAnimation: MoveSequence: move + SelectionDecorations: + VisualBounds: 30,24 C17: ParaDrop: diff --git a/mods/cnc/rules/civilian.yaml b/mods/cnc/rules/civilian.yaml index 0ed6a8ffd4..c2097631c5 100644 --- a/mods/cnc/rules/civilian.yaml +++ b/mods/cnc/rules/civilian.yaml @@ -370,10 +370,8 @@ BRIDGEHUT: Building: Footprint: __ __ Dimensions: 2,2 - Selectable: - Selectable: false - Bounds: 48,48 - Priority: 2 + CustomSelectionSize: + CustomBounds: 48,48 BridgeHut: TargetableBuilding: TargetTypes: BridgeHut, C4 @@ -438,7 +436,10 @@ VICE: Tiberium: 100 BlueTiberium: 100 Beach: 60 + SelectionDecorations: + VisualBounds: 24,24 Selectable: + Bounds: 24,24 TargetableUnit: TargetTypes: Ground AutoTarget: diff --git a/mods/cnc/rules/defaults.yaml b/mods/cnc/rules/defaults.yaml index 0b459c094d..cf5195edfc 100644 --- a/mods/cnc/rules/defaults.yaml +++ b/mods/cnc/rules/defaults.yaml @@ -34,6 +34,7 @@ ROT: 5 SelectionDecorations: Selectable: + Bounds: 24,24 TargetableUnit: TargetTypes: Ground, Vehicle Repairable: @@ -81,6 +82,7 @@ ROT: 5 SelectionDecorations: Selectable: + Bounds: 24,24 TargetableUnit: TargetTypes: Ground, Vehicle Repairable: @@ -125,6 +127,7 @@ GroundedTargetTypes: Ground SelectionDecorations: Selectable: + Bounds: 24,24 Helicopter: RepairBuildings: hpad RearmBuildings: @@ -248,7 +251,6 @@ -AutoTarget: -TakeCover: AppearsOnRadar: - SelectionDecorations: Valued: Cost: 70 Tooltip: @@ -298,7 +300,9 @@ Tiberium: 70 BlueTiberium: 70 Beach: 80 + SelectionDecorations: Selectable: + Bounds: 24,24 TargetableUnit: TargetTypes: Ground, Infantry HiddenUnderFog: @@ -329,6 +333,7 @@ UseLocation: yes SelectionDecorations: Selectable: + Bounds: 24,24 TargetableUnit: TargetTypes: Air HiddenUnderFog: @@ -661,7 +666,6 @@ Image: crate WithCrateBody: XmasImages: xcratea, xcrateb, xcratec, xcrated - Selectable: - Selectable: false - Bounds: 15,15,-1,-1 + CustomSelectionSize: + CustomBounds: 16,16 diff --git a/mods/cnc/rules/infantry.yaml b/mods/cnc/rules/infantry.yaml index 88f5852d0a..95e1c43bd5 100644 --- a/mods/cnc/rules/infantry.yaml +++ b/mods/cnc/rules/infantry.yaml @@ -225,8 +225,6 @@ STEG: WithDeathAnimation: DeathSequencePalette: terrain DeathPaletteIsPlayerPalette: false - Selectable: - Bounds: 24,20,0,4 TREX: Inherits: ^DINO @@ -236,7 +234,9 @@ TREX: Armament: Weapon: teeth Selectable: - Bounds: 52,38 + Bounds: 48,36,2,1 + SelectionDecorations: + VisualBounds: 52,38 TRIC: Inherits: ^DINO @@ -245,8 +245,8 @@ TRIC: Description: Quadruped with large bony frill and three horns Armament: Weapon: horn - Selectable: - Bounds: 34,24,0,2 + SelectionDecorations: + VisualBounds: 34,24,0,2 RAPT: Inherits: ^DINO @@ -255,6 +255,4 @@ RAPT: Description: Bipedal with enlarged sickle-shaped claw on each hindfoot Armament: Weapon: claw - Selectable: - Bounds: 20,20 diff --git a/mods/cnc/rules/ships.yaml b/mods/cnc/rules/ships.yaml index 0cf681618b..bb26dd8d6e 100644 --- a/mods/cnc/rules/ships.yaml +++ b/mods/cnc/rules/ships.yaml @@ -29,6 +29,8 @@ BOAT: AllowMovement: false WithSmoke: RejectsOrders: + SelectionDecorations: + VisualBounds: 42,24 LST: Inherits: ^Ship diff --git a/mods/cnc/rules/structures.yaml b/mods/cnc/rules/structures.yaml index 976285795f..d043c3a41e 100644 --- a/mods/cnc/rules/structures.yaml +++ b/mods/cnc/rules/structures.yaml @@ -108,7 +108,7 @@ NUKE: Prerequisites: fact Queue: Building.GDI, Building.Nod Building: - Footprint: x_ xx + Footprint: xx xx Dimensions: 2,2 Health: HP: 500 @@ -133,7 +133,7 @@ NUK2: Prerequisites: anyhq, ~techlevel.medium Queue: Building.GDI, Building.Nod Building: - Footprint: x_ xx + Footprint: xx xx Dimensions: 2,2 Health: HP: 700 @@ -167,7 +167,7 @@ PROC: DockAngle: 112 DockOffset: 0,2 IsDragRequired: True - DragOffset: -640,341,0 + DragOffset: -554,512,0 DragLength: 12 TickRate: 15 StoresResources: @@ -175,7 +175,7 @@ PROC: PipCount: 10 Capacity: 2000 Selectable: - Bounds: 73,72 + Bounds: 72,56,0,12 CustomSellValue: Value: 500 FreeActor: @@ -187,6 +187,8 @@ PROC: Power: Amount: -50 ProvidesPrerequisite@buildingname: + SelectionDecorations: + VisualBounds: 73,72 SILO: Inherits: ^BaseBuilding @@ -214,14 +216,14 @@ SILO: PipCount: 10 PipColor: Green Capacity: 2000 - Selectable: - Bounds: 49,30 -RenderBuilding: -EmitInfantryOnSell: Power: Amount: -10 MustBeDestroyed: RequiredForShortGame: false + SelectionDecorations: + VisualBounds: 49,30 PYLE: Inherits: ^BaseBuilding @@ -301,6 +303,8 @@ HAND: Power: Amount: -20 ProvidesPrerequisite@buildingname: + Selectable: + Bounds: 48,48,0,10 AFLD: Inherits: ^BaseBuilding @@ -361,6 +365,8 @@ WEAP: Building: Footprint: ___ xxx === Dimensions: 3,3 + Selectable: + Bounds: 72,48,0,12 Health: HP: 1000 RevealsShroud: @@ -449,6 +455,8 @@ HQ: Building: Footprint: x_ xx Dimensions: 2,2 + Selectable: + Bounds: 48,36,0,12 RequiresPower: CanPowerDown: DisabledOverlay: @@ -499,6 +507,10 @@ FIX: Building: Footprint: _x_ xxx _x_ Dimensions: 3,3 + Selectable: + Bounds: 64,34,0,3 + SelectionDecorations: + VisualBounds: 72,48 Health: HP: 400 RevealsShroud: @@ -529,6 +541,8 @@ EYE: Building: Footprint: x_ xx Dimensions: 2,2 + Selectable: + Bounds: 48,36,0,12 RequiresPower: CanPowerDown: DisabledOverlay: @@ -578,6 +592,8 @@ TMPL: Building: Footprint: ___ xxx xxx Dimensions: 3,3 + Selectable: + Bounds: 72,48,0,16 RequiresPower: CanPowerDown: DisabledOverlay: @@ -713,6 +729,8 @@ OBLI: Building: Footprint: _ x Dimensions: 1,2 + Selectable: + Bounds: 24,24,0,12 RequiresPower: DisabledOverlay: -GivesBuildableArea: @@ -802,6 +820,8 @@ ATWR: Building: Footprint: _ x Dimensions: 1,2 + Selectable: + Bounds: 24,24,0,12 RequiresPower: DisabledOverlay: -GivesBuildableArea: diff --git a/mods/cnc/rules/vehicles.yaml b/mods/cnc/rules/vehicles.yaml index 28375f9e83..c2fd3bfe38 100644 --- a/mods/cnc/rules/vehicles.yaml +++ b/mods/cnc/rules/vehicles.yaml @@ -39,6 +39,8 @@ MCV: EmptyWeapon: UnitExplodeSmall AutoSelectionSize: RenderSprites: + SelectionDecorations: + VisualBounds: 36,36 HARV: Inherits: ^Tank @@ -55,7 +57,6 @@ HARV: InitialActivity: FindResources Selectable: Priority: 7 - Bounds: 36,36 Harvester: Resources: Tiberium, BlueTiberium PipCount: 7 @@ -78,6 +79,8 @@ HARV: RenderHarvester: Explodes: Weapon: TiberiumExplosion + SelectionDecorations: + VisualBounds: 36,36 APC: Inherits: ^Tank @@ -391,10 +394,10 @@ MTNK: Explodes: Weapon: UnitExplodeSmall EmptyWeapon: UnitExplodeSmall - Selectable: - Bounds: 28,28 AutoSelectionSize: RenderSprites: + SelectionDecorations: + VisualBounds: 28,28 HTNK: Inherits: ^Tank @@ -446,10 +449,10 @@ HTNK: Explodes: Weapon: UnitExplodeSmall EmptyWeapon: UnitExplodeSmall - Selectable: - Bounds: 34,34,0,-3 AutoSelectionSize: RenderSprites: + SelectionDecorations: + VisualBounds: 34,34,0,-3 MSAM: Inherits: ^Tank diff --git a/mods/cnc/sequences/structures.yaml b/mods/cnc/sequences/structures.yaml index f49502ba1c..7aa23c2e56 100644 --- a/mods/cnc/sequences/structures.yaml +++ b/mods/cnc/sequences/structures.yaml @@ -49,23 +49,27 @@ proc: idle: Length: 6 Tick: 120 + Offset: 2,4 damaged-idle: Start: 30 Length: 6 Tick: 120 + Offset: 2,4 dead: Start: 60 Tick: 800 + Offset: 2,4 make: procmake Length: * Tick: 80 + Offset: 2,4 resources: proctwr Length: 6 - Offset: -32,-21 + Offset: -30,-17 damaged-resources: proctwr Start: 6 Length: 6 - Offset: -32,-21 + Offset: -30,-17 bib: bib2 UseTilesetExtension: true Length: * diff --git a/mods/d2k/rules/aircraft.yaml b/mods/d2k/rules/aircraft.yaml index bdc5bd81d3..263b5ac493 100644 --- a/mods/d2k/rules/aircraft.yaml +++ b/mods/d2k/rules/aircraft.yaml @@ -145,12 +145,12 @@ orni: RearmBuildings: WithFacingSpriteBody: WithShadow: - Selectable: - Bounds: 38,32,0,0 LeavesHusk: HuskActor: orni.husk AutoSelectionSize: RenderSprites: + SelectionDecorations: + VisualBounds: 38,32,0,0 orni.bomber: AttackBomber: diff --git a/mods/d2k/rules/defaults.yaml b/mods/d2k/rules/defaults.yaml index 88f32fcc80..f05b780298 100644 --- a/mods/d2k/rules/defaults.yaml +++ b/mods/d2k/rules/defaults.yaml @@ -35,6 +35,7 @@ ROT: 5 SelectionDecorations: Selectable: + Bounds: 32,32 TargetableUnit: TargetTypes: Ground, C4 Passenger: @@ -90,6 +91,7 @@ ROT: 5 SelectionDecorations: Selectable: + Bounds: 32,32 TargetableUnit: TargetTypes: Ground, C4 Passenger: @@ -271,6 +273,7 @@ UseLocation: yes SelectionDecorations: Selectable: + Bounds: 32,32 TargetableAircraft: TargetTypes: Air GroundedTargetTypes: Ground diff --git a/mods/d2k/rules/misc.yaml b/mods/d2k/rules/misc.yaml index 2e6426df5a..a0b57b81c0 100644 --- a/mods/d2k/rules/misc.yaml +++ b/mods/d2k/rules/misc.yaml @@ -109,10 +109,9 @@ crate: RenderSprites: Palette: effect WithCrateBody: - Selectable: - Selectable: false - Bounds: 15,15,-1,-1 Passenger: + CustomSelectionSize: + CustomBounds: 16,16 mpspawn: Immobile: diff --git a/mods/d2k/rules/structures.yaml b/mods/d2k/rules/structures.yaml index 230fc5d859..d4446ec149 100644 --- a/mods/d2k/rules/structures.yaml +++ b/mods/d2k/rules/structures.yaml @@ -76,6 +76,8 @@ conyard: WithBuildingPlacedOverlay: Palette: d2k PrimaryBuilding: + SelectionDecorations: + VisualBounds: 96,64 power: Inherits: ^Building @@ -110,6 +112,8 @@ power: Amount: 100 ScalePowerWithHealth: ProvidesPrerequisite@buildingname: + SelectionDecorations: + VisualBounds: 64,64 barracks: Inherits: ^Building @@ -125,7 +129,7 @@ barracks: Name: Barracks Description: Trains infantry Building: - Footprint: =x xx + Footprint: xx xx Dimensions: 2,2 Bib: Health: @@ -166,6 +170,8 @@ barracks: atreides: barracks.atreides ordos: barracks.ordos ProvidesPrerequisite@buildingname: + SelectionDecorations: + VisualBounds: 64,64 refinery: Inherits: ^Building @@ -219,6 +225,8 @@ refinery: WithIdleOverlay@TOP: Sequence: idle-top ProvidesPrerequisite@buildingname: + SelectionDecorations: + VisualBounds: 96,64 silo: Inherits: ^Building @@ -257,6 +265,8 @@ silo: Amount: -5 MustBeDestroyed: RequiredForShortGame: false + SelectionDecorations: + VisualBounds: 32,32 light: Inherits: ^Building @@ -314,6 +324,8 @@ light: Sequence: idle-top Power: Amount: -20 + SelectionDecorations: + VisualBounds: 96,64 heavy: Inherits: ^Building @@ -322,7 +334,7 @@ heavy: Queue: Building BuildPaletteOrder: 100 Selectable: - Bounds: 96,96 + Bounds: 96,68,0,12 Valued: Cost: 2000 Tooltip: @@ -372,6 +384,8 @@ heavy: Power: Amount: -30 ProvidesPrerequisite@buildingname: + SelectionDecorations: + VisualBounds: 96,96 radar: Inherits: ^Building @@ -414,6 +428,8 @@ radar: Power: Amount: -40 ProvidesPrerequisite@buildingname: + SelectionDecorations: + VisualBounds: 96,64 starport: Inherits: ^Building @@ -473,6 +489,8 @@ starport: Power: Amount: -40 ProvidesPrerequisite@buildingname: + SelectionDecorations: + VisualBounds: 96,64 wall: Buildable: @@ -540,7 +558,7 @@ guntower: Sellable: SellSounds: CHUNG.WAV Selectable: - Bounds: 32,40,0,-8 + Bounds: 32,32 Priority: 3 -GivesBuildableArea: Health: @@ -576,6 +594,8 @@ guntower: Amount: -20 MustBeDestroyed: RequiredForShortGame: false + SelectionDecorations: + VisualBounds: 32,40,0,-8 rockettower: Inherits: ^Building @@ -594,7 +614,7 @@ rockettower: Sellable: SellSounds: CHUNG.WAV Selectable: - Bounds: 32,40,0,-8 + Bounds: 32,32 Priority: 3 -GivesBuildableArea: Health: @@ -631,6 +651,8 @@ rockettower: Amount: -30 MustBeDestroyed: RequiredForShortGame: false + SelectionDecorations: + VisualBounds: 32,40,0,-8 repair: Inherits: ^Building @@ -652,6 +674,10 @@ repair: Type: Concrete RevealsShroud: Range: 5c0 + Selectable: + Bounds: 96,64 + SelectionDecorations: + VisualBounds: 96,80 Reservable: RepairsUnits: Interval: 15 @@ -677,7 +703,7 @@ hightech: Queue: Building BuildPaletteOrder: 110 Selectable: - Bounds: 96,96 + Bounds: 96,68,0,12 Valued: Cost: 750 Tooltip: @@ -722,6 +748,8 @@ hightech: Sequence: production-welding Power: Amount: -40 + SelectionDecorations: + VisualBounds: 96,96 research: Inherits: ^Building @@ -730,7 +758,7 @@ research: Prerequisites: radar, heavy, upgrade.heavy, ~techlevel.high BuildPaletteOrder: 140 Selectable: - Bounds: 96,64 + Bounds: 96,64,0,16 Valued: Cost: 1500 Tooltip: @@ -767,6 +795,8 @@ research: Power: Amount: -40 ProvidesPrerequisite@buildingname: + SelectionDecorations: + VisualBounds: 96,80 palace: Inherits: ^Building @@ -828,6 +858,8 @@ palace: RequiresPower: SupportPowerChargeBar: ProvidesPrerequisite@buildingname: + SelectionDecorations: + VisualBounds: 96,96 conyard.atreides: Inherits: conyard diff --git a/mods/d2k/rules/vehicles.yaml b/mods/d2k/rules/vehicles.yaml index d475b4480d..877a651c4d 100644 --- a/mods/d2k/rules/vehicles.yaml +++ b/mods/d2k/rules/vehicles.yaml @@ -38,6 +38,8 @@ mcv: HuskActor: mcv.husk AttractsWorms: Intensity: 700 + SelectionDecorations: + VisualBounds: 42,42 harvester: Inherits: ^Vehicle @@ -85,6 +87,8 @@ harvester: Palette: effect50alpha AttractsWorms: Intensity: 700 + SelectionDecorations: + VisualBounds: 42,42 trike: Inherits: ^Vehicle @@ -99,7 +103,6 @@ trike: Description: Fast Scout\n Strong vs Infantry\n Weak vs Tanks, Aircraft Selectable: Class: trike - Bounds: 24,24 Health: HP: 100 Armor: @@ -155,7 +158,6 @@ quad: EmptyWeapon: UnitExplodeTiny Selectable: Class: quad - Bounds: 24,24 AttractsWorms: Intensity: 470 @@ -200,7 +202,6 @@ siegetank: InitialStance: Defend Selectable: Class: siegetank - Bounds: 30,30 LeavesHusk: HuskActor: siegetank.husk AttractsWorms: @@ -241,7 +242,6 @@ missiletank: EmptyWeapon: UnitExplodeScale Selectable: Class: missiletank - Bounds: 30,30 LeavesHusk: HuskActor: missiletank.husk AttractsWorms: @@ -258,8 +258,6 @@ sonictank: Tooltip: Name: Sonic Tank Description: Fires sonic shocks\n Strong vs Infantry, Vehicles\n Weak vs Artillery, Aircraft - Selectable: - Bounds: 30,30 Health: HP: 130 Armor: @@ -315,14 +313,14 @@ devast: Explodes: Weapon: UnitExplodeScale EmptyWeapon: UnitExplodeScale - Selectable: - Bounds: 44,38,0,0 LeavesHusk: HuskActor: devast.husk AttractsWorms: Intensity: 700 AutoSelectionSize: RenderSprites: + SelectionDecorations: + VisualBounds: 44,38,0,0 raider: Inherits: ^Vehicle @@ -335,8 +333,6 @@ raider: Tooltip: Name: Raider Trike Description: Improved Scout\n Strong vs Infantry, Light Vehicles - Selectable: - Bounds: 24,24 Health: HP: 110 Armor: @@ -408,8 +404,6 @@ deviatortank: Explodes: Weapon: UnitExplodeSmall EmptyWeapon: UnitExplodeSmall - Selectable: - Bounds: 30,30 LeavesHusk: HuskActor: deviatortank.husk AttractsWorms: @@ -456,7 +450,6 @@ deviatortank: EmptyWeapon: UnitExplodeSmall Selectable: Class: combat - Bounds: 30,30 AttractsWorms: Intensity: 520 AutoSelectionSize: diff --git a/mods/ra/rules/aircraft.yaml b/mods/ra/rules/aircraft.yaml index d6c8daaeb3..56343c4a39 100644 --- a/mods/ra/rules/aircraft.yaml +++ b/mods/ra/rules/aircraft.yaml @@ -114,7 +114,9 @@ MIG: Ammo: 8 ReturnOnIdle: Selectable: - Bounds: 40,29,0,1 + Bounds: 36,28,0,2 + SelectionDecorations: + VisualBounds: 40,29,0,1 Contrail@1: Offset: -598,-683,0 Contrail@2: @@ -173,8 +175,8 @@ YAK: PipCount: 6 ReloadTicks: 11 ReturnOnIdle: - Selectable: - Bounds: 30,28,0,2 + SelectionDecorations: + VisualBounds: 30,28,0,2 WithMuzzleFlash: Contrail: Offset: -853,0,0 @@ -269,8 +271,8 @@ HELI: Offset: 0,0,85 AmmoPool: Ammo: 8 - Selectable: - Bounds: 36,28,0,0 + SelectionDecorations: + VisualBounds: 36,28,0,0 LeavesHusk: HuskActor: HELI.Husk SmokeTrailWhenDamaged: @@ -322,8 +324,8 @@ HIND: Ammo: 24 PipCount: 6 ReloadTicks: 8 - Selectable: - Bounds: 38,32,0,0 + SelectionDecorations: + VisualBounds: 38,32,0,0 WithMuzzleFlash: LeavesHusk: HuskActor: HIND.Husk diff --git a/mods/ra/rules/civilian.yaml b/mods/ra/rules/civilian.yaml index ac6688191c..b365048b99 100644 --- a/mods/ra/rules/civilian.yaml +++ b/mods/ra/rules/civilian.yaml @@ -3,7 +3,6 @@ C1: C2: Inherits: ^CivInfantry - Selectable: Voiced: VoiceSet: CivilianFemaleVoice @@ -12,7 +11,6 @@ C3: C4: Inherits: ^CivInfantry - Selectable: WithInfantryBody: RenderSprites: Image: C2 @@ -27,7 +25,6 @@ C5: C6: Inherits: ^CivInfantry - Selectable: WithInfantryBody: RenderSprites: Image: C2 @@ -42,7 +39,6 @@ C7: C8: Inherits: ^CivInfantry - Selectable: WithInfantryBody: RenderSprites: Image: C2 @@ -57,7 +53,6 @@ C9: C10: Inherits: ^CivInfantry - Selectable: WithInfantryBody: RenderSprites: Image: C2 @@ -495,10 +490,8 @@ BRIDGEHUT: Building: Footprint: __ __ Dimensions: 2,2 - Selectable: - Selectable: false - Bounds: 48,48 - Priority: 2 + CustomSelectionSize: + CustomBounds: 48,48 BridgeHut: TargetableBuilding: TargetTypes: BridgeHut, C4 @@ -507,10 +500,8 @@ BRIDGEHUT.small: Building: Footprint: _ Dimensions: 1,1 - Selectable: - Selectable: false - Bounds: 24,24 - Priority: 2 + CustomSelectionSize: + CustomBounds: 24,24 BridgeHut: TargetableBuilding: TargetTypes: BridgeHut, C4 @@ -639,22 +630,26 @@ LHUS: EditorTilesetFilter: RequireTilesets: TEMPERAT Selectable: - Bounds: 24,48 + Bounds: 24,24,0,16 + SelectionDecorations: + VisualBounds: 24,48 Tooltip: Name: Lighthouse Building: - Footprint: _ x - Dimensions: 1,2 + Footprint: x + Dimensions: 1,1 WINDMILL: Inherits: ^CivBuilding EditorTilesetFilter: RequireTilesets: TEMPERAT Selectable: - Bounds: 36,36 + Bounds: 24,24,0,8 + SelectionDecorations: + VisualBounds: 36,36 Tooltip: Name: Windmill Building: - Footprint: _ x - Dimensions: 1,2 + Footprint: x + Dimensions: 1,1 diff --git a/mods/ra/rules/defaults.yaml b/mods/ra/rules/defaults.yaml index a647a3b5c9..9de3e1a045 100644 --- a/mods/ra/rules/defaults.yaml +++ b/mods/ra/rules/defaults.yaml @@ -58,6 +58,7 @@ ROT: 5 SelectionDecorations: Selectable: + Bounds: 24, 24 TargetableUnit: TargetTypes: Ground, Repair, Vehicle Repairable: @@ -112,6 +113,7 @@ ROT: 5 SelectionDecorations: Selectable: + Bounds: 24, 24 TargetableUnit: TargetTypes: Ground, C4, Repair, Tank Repairable: @@ -180,7 +182,7 @@ Beach: 80 SelectionDecorations: Selectable: - Bounds: 12,18,0,-6 + Bounds: 12,18,0,-8 TargetableUnit: TargetTypes: Ground, Infantry, Disguise TakeCover: @@ -257,6 +259,7 @@ Water: 100 SelectionDecorations: Selectable: + Bounds: 24,24 TargetableUnit: TargetTypes: Ground, Water, Repair HiddenUnderFog: @@ -289,6 +292,7 @@ UseLocation: true SelectionDecorations: Selectable: + Bounds: 24,24 TargetableAircraft: TargetTypes: Air GroundedTargetTypes: Ground, Repair @@ -660,11 +664,10 @@ Image: scrate WithCrateBody: XmasImages: xcratea, xcrateb, xcratec, xcrated - Selectable: - Selectable: false - Bounds: 15,15,-1,-1 Parachutable: KilledOnImpassableTerrain: false ParachuteSequence: parach Passenger: + CustomSelectionSize: + CustomBounds: 16,16 diff --git a/mods/ra/rules/infantry.yaml b/mods/ra/rules/infantry.yaml index 962033e668..ed6e532d14 100644 --- a/mods/ra/rules/infantry.yaml +++ b/mods/ra/rules/infantry.yaml @@ -13,6 +13,8 @@ DOG: GenericName: Dog Selectable: Bounds: 12,17,-1,-4 + SelectionDecorations: + VisualBounds: 12,17,-1,-4 Health: HP: 12 Mobile: @@ -561,7 +563,9 @@ Ant: BuildPaletteOrder: 1954 Prerequisites: ~bio Selectable: - Bounds: 30,30,0,-2 + Bounds: 24,24,0,-5 + SelectionDecorations: + VisualBounds: 30,30,0,-2 Health: HP: 750 Radius: 469 diff --git a/mods/ra/rules/misc.yaml b/mods/ra/rules/misc.yaml index 4496de2172..2328f4441e 100644 --- a/mods/ra/rules/misc.yaml +++ b/mods/ra/rules/misc.yaml @@ -217,9 +217,6 @@ FLARE: Tooltip: Name: Flare ShowOwnerRow: false - Selectable: - Selectable: false - Bounds: 25,25 BodyOrientation: MINE: diff --git a/mods/ra/rules/ships.yaml b/mods/ra/rules/ships.yaml index a443786328..8386cc1bb4 100644 --- a/mods/ra/rules/ships.yaml +++ b/mods/ra/rules/ships.yaml @@ -35,8 +35,8 @@ SS: LocalOffset: 0,-171,0, 0,171,0 FireDelay: 2 AttackFrontal: - Selectable: - Bounds: 38,38 + SelectionDecorations: + VisualBounds: 38,38 Chronoshiftable: RepairableNear: AutoTarget: @@ -89,8 +89,8 @@ MSUB: LocalOffset: 0,-171,0, 0,171,0 FireDelay: 2 AttackFrontal: - Selectable: - Bounds: 44,44 + SelectionDecorations: + VisualBounds: 44,44 Chronoshiftable: RepairableNear: AutoTarget: @@ -145,6 +145,8 @@ DD: AttackTurreted: Selectable: Bounds: 38,38 + SelectionDecorations: + VisualBounds: 38,38 WithFacingSpriteBody: WithTurret: AutoTarget: @@ -208,6 +210,8 @@ CA: WithMuzzleFlash: Selectable: Bounds: 44,44 + SelectionDecorations: + VisualBounds: 44,44 WithFacingSpriteBody: WithTurret@PRIMARY: Turret: primary @@ -242,6 +246,8 @@ LST: Speed: 113 RevealsShroud: Range: 6c0 + SelectionDecorations: + VisualBounds: 36,36 RenderLandingCraft: OpenTerrainTypes: Clear, Rough, Road, Ore, Gems, Beach Cargo: @@ -290,6 +296,8 @@ PT: WithMuzzleFlash: Selectable: Bounds: 32,32 + SelectionDecorations: + VisualBounds: 32,32 WithFacingSpriteBody: WithTurret: AutoTarget: diff --git a/mods/ra/rules/structures.yaml b/mods/ra/rules/structures.yaml index fc704d339e..606b70fad4 100644 --- a/mods/ra/rules/structures.yaml +++ b/mods/ra/rules/structures.yaml @@ -61,6 +61,10 @@ GAP: Building: Footprint: _ x Dimensions: 1,2 + Selectable: + Bounds: 24,28,0,12 + SelectionDecorations: + VisualBounds: 24,40,0,0 RequiresPower: CanPowerDown: DisabledOverlay: @@ -269,7 +273,9 @@ IRON: CanPowerDown: DisabledOverlay: Selectable: - Bounds: 50,50,0,-12 + Bounds: 48,28,0,2 + SelectionDecorations: + VisualBounds: 50,50,0,-12 Health: HP: 1000 Armor: @@ -380,6 +386,10 @@ TSLA: Footprint: _ x Dimensions: 1,2 RequiresPower: + Selectable: + Bounds: 24,24,0,16 + SelectionDecorations: + VisualBounds: 24,36,0,4 CanPowerDown: DisabledOverlay: -GivesBuildableArea: @@ -424,6 +434,10 @@ AGUN: Building: Footprint: _ x Dimensions: 1,2 + Selectable: + Bounds: 24,28,0,16 + SelectionDecorations: + VisualBounds: 24,36,0,12 RequiresPower: CanPowerDown: DisabledOverlay: @@ -929,6 +943,10 @@ PROC: Building: Footprint: _x_ xxx x== Dimensions: 3,3 + Selectable: + Bounds: 72,50,0,12 + SelectionDecorations: + VisualBounds: 72,70,0,-2 TargetableBuilding: TargetTypes: Ground, C4, DetonateAttack, SpyInfiltrate Health: @@ -1220,6 +1238,10 @@ APWR: Building: Footprint: ___ xxx xxx Dimensions: 3,3 + Selectable: + Bounds: 72,48,0,12 + SelectionDecorations: + VisualBounds: 72,64,0,-2 Health: HP: 700 Armor: @@ -1447,6 +1469,10 @@ FIX: Building: Footprint: _x_ xxx _x_ Dimensions: 3,3 + Selectable: + Bounds: 68,34,0,3 + SelectionDecorations: + VisualBounds: 72,48 Health: HP: 800 Armor: diff --git a/mods/ra/rules/vehicles.yaml b/mods/ra/rules/vehicles.yaml index 81917d5c0b..b6f342a3f1 100644 --- a/mods/ra/rules/vehicles.yaml +++ b/mods/ra/rules/vehicles.yaml @@ -20,6 +20,8 @@ V2RL: Armament: Weapon: SCUD AttackFrontal: + SelectionDecorations: + VisualBounds: 28,28 RenderSprites: AutoTarget: Explodes: @@ -111,10 +113,10 @@ V2RL: EmptyWeapon: UnitExplodeSmall LeavesHusk: HuskActor: 2TNK.Husk - Selectable: - Bounds: 30,30 AutoSelectionSize: RenderSprites: + SelectionDecorations: + VisualBounds: 28,28 3TNK: Inherits: ^Tank @@ -154,10 +156,10 @@ V2RL: EmptyWeapon: UnitExplodeSmall LeavesHusk: HuskActor: 3TNK.Husk - Selectable: - Bounds: 30,30 AutoSelectionSize: RenderSprites: + SelectionDecorations: + VisualBounds: 28,28 4TNK: Inherits: ^Tank @@ -211,10 +213,10 @@ V2RL: Ticks: 3 HealIfBelow: 50% DamageCooldown: 150 - Selectable: - Bounds: 44,38,0,-4 AutoSelectionSize: RenderSprites: + SelectionDecorations: + VisualBounds: 44,38,0,-4 ARTY: Inherits: ^Tank @@ -265,7 +267,8 @@ HARV: Description: Collects Ore and Gems for processing.\n Unarmed Selectable: Priority: 7 - Bounds: 42,42 + SelectionDecorations: + VisualBounds: 42,42 Harvester: Capacity: 20 Resources: Ore,Gems @@ -309,7 +312,8 @@ MCV: Description: Deploys into another Construction Yard.\n Unarmed Selectable: Priority: 4 - Bounds: 42,42 + SelectionDecorations: + VisualBounds: 42,42 Health: HP: 600 Armor: @@ -618,8 +622,8 @@ TTNK: WithFacingSpriteBody: WithIdleOverlay@SPINNER: Sequence: spinner - Selectable: - Bounds: 28,28,0,0 + SelectionDecorations: + VisualBounds: 30,30 AutoTarget: Explodes: Weapon: UnitExplodeSmall @@ -663,10 +667,10 @@ FTRK: Explodes: Weapon: UnitExplodeSmall EmptyWeapon: UnitExplodeSmall - Selectable: - Bounds: 28,28,0,0 AutoSelectionSize: RenderSprites: + SelectionDecorations: + VisualBounds: 28,28 DTRK: Inherits: ^Vehicle @@ -712,8 +716,8 @@ CTNK: Tooltip: Name: Chrono Tank Description: Chrono Tank, teleports to areas within range.\n Strong vs Vehicles, Buildings\n Weak vs Infantry, Aircraft\n Special ability: Can teleport - Selectable: - Bounds: 28,28 + SelectionDecorations: + VisualBounds: 30,30 Health: HP: 400 Armor: @@ -761,9 +765,9 @@ QTNK: Crushes: wall, mine, crate, infantry RevealsShroud: Range: 6c0 - Selectable: - Bounds: 44,38,0,-4 WithFacingSpriteBody: + SelectionDecorations: + VisualBounds: 44,38,0,-4 Explodes: Weapon: UnitExplodeSmall MadTank: @@ -784,8 +788,8 @@ STNK: Tooltip: Name: Phase Transport Description: Lightly armored infantry transport\nwhich can cloak. Can detect cloaked units.\n Strong vs Light armor\n Weak vs Infantry, Tanks, Aircraft - Selectable: - Bounds: 28,28 + SelectionDecorations: + VisualBounds: 26,26 Health: HP: 300 Armor: diff --git a/mods/ra/sequences/decorations.yaml b/mods/ra/sequences/decorations.yaml index 63f7701fb2..a7b67df73b 100644 --- a/mods/ra/sequences/decorations.yaml +++ b/mods/ra/sequences/decorations.yaml @@ -806,6 +806,8 @@ snowhut: Tick: 120 lhus: + Defaults: + Offset: 0,-16 idle: Length: 16 Tick: 180 @@ -815,6 +817,8 @@ lhus: Length: 8 windmill: + Defaults: + Offset: 0,-16 idle: Length: 8 Tick: 80 diff --git a/mods/ts/rules/aircraft.yaml b/mods/ts/rules/aircraft.yaml index 72fefc42cf..cdf343eb56 100644 --- a/mods/ts/rules/aircraft.yaml +++ b/mods/ts/rules/aircraft.yaml @@ -95,6 +95,8 @@ ORCA: RenderVoxels: WithVoxelBody: Hovers: + SelectionDecorations: + VisualBounds: 30,24 ORCAB: Inherits: ^Plane @@ -136,6 +138,8 @@ ORCAB: RenderVoxels: WithVoxelBody: Hovers: + SelectionDecorations: + VisualBounds: 30,24 ORCATRAN: Inherits: ^Helicopter @@ -230,6 +234,8 @@ SCRIN: RenderSprites: RenderVoxels: WithVoxelBody: + SelectionDecorations: + VisualBounds: 30,24 APACHE: Inherits: ^Helicopter @@ -270,3 +276,6 @@ APACHE: RenderVoxels: WithVoxelBody: Hovers: + SelectionDecorations: + VisualBounds: 30,24 + diff --git a/mods/ts/rules/civilian-structures.yaml b/mods/ts/rules/civilian-structures.yaml index c306a6c81d..a844475741 100644 --- a/mods/ts/rules/civilian-structures.yaml +++ b/mods/ts/rules/civilian-structures.yaml @@ -1302,7 +1302,7 @@ GASPOT: Footprint: x Dimensions: 1, 1 Selectable: - Bounds: 48, 82, 0, -25 + Bounds: 48, 30, 0, -4 Power: Amount: -10 Armor: @@ -1313,6 +1313,8 @@ GASPOT: Range: 6c0 WithIdleOverlay@LIGHTS: Sequence: idle-lights + SelectionDecorations: + VisualBounds: 48, 82, 0, -25 GALITE: Inherits: ^Building @@ -1336,10 +1338,12 @@ GALITE: Sequence: lighting Palette: alpha Selectable: - Bounds: 25, 35, 0, -12 + Bounds: 24, 24, 0, -4 Buildable: Queue: Defense Prerequisites: ~disabled + SelectionDecorations: + VisualBounds: 25, 35, 0, -12 GAICBM: Inherits: ^Building @@ -1410,3 +1414,6 @@ UFO: Type: Heavy EditorTilesetFilter: RequireTilesets: TEMPERAT + SelectionDecorations: + VisualBounds: 144, 72, 0, 0 + diff --git a/mods/ts/rules/defaults.yaml b/mods/ts/rules/defaults.yaml index 95c5d57726..0415035970 100644 --- a/mods/ts/rules/defaults.yaml +++ b/mods/ts/rules/defaults.yaml @@ -136,9 +136,8 @@ Palette: terrain WithCrateBody: Images: crate - Selectable: - Selectable: false - Bounds: 25,25,-1,-1 + CustomSelectionSize: + CustomBounds: 24,24 ^Wall: AppearsOnRadar: @@ -279,8 +278,6 @@ ^CivilianInfantry: Inherits: ^Infantry - Selectable: - Bounds: 12,17,0,-9 Voiced: VoiceSet: Civilian Valued: diff --git a/mods/ts/rules/gdi-structures.yaml b/mods/ts/rules/gdi-structures.yaml index 2afaf69112..63921bffac 100644 --- a/mods/ts/rules/gdi-structures.yaml +++ b/mods/ts/rules/gdi-structures.yaml @@ -25,7 +25,7 @@ GAPOWR: WithIdleOverlay@PLUG: Sequence: idle-plug Selectable: - Bounds: 90, 84, 0, -12 + Bounds: 90, 48, 0, -6 Power: Amount: 100 InfiltrateForPowerOutage: @@ -59,6 +59,8 @@ GAPOWR: UpgradeMinEnabledLevel: 1 Amount: 50 ProvidesPrerequisite@buildingname: + SelectionDecorations: + VisualBounds: 90, 84, 0, -12 GAPILE: Inherits: ^Building @@ -77,7 +79,7 @@ GAPILE: Footprint: xx xx Dimensions: 2,2 Selectable: - Bounds: 88, 56, 0, -8 + Bounds: 88, 48, 0, -8 Health: HP: 800 Armor: @@ -102,6 +104,8 @@ GAPILE: Power: Amount: -20 ProvidesPrerequisite@buildingname: + SelectionDecorations: + VisualBounds: 88, 56, 0, -8 GAWEAP: Inherits: ^Building @@ -120,7 +124,7 @@ GAWEAP: Footprint: xxx= xxx= xxx= Dimensions: 4,3 Selectable: - Bounds: 154, 100, -2, -12 + Bounds: 154, 96, -2, -12 Health: HP: 1000 RevealsShroud: @@ -149,6 +153,8 @@ GAWEAP: Power: Amount: -30 ProvidesPrerequisite@buildingname: + SelectionDecorations: + VisualBounds: 154, 100, -2, -12 GAHPAD: Inherits: ^Building @@ -189,6 +195,8 @@ GAHPAD: Selectable: Bounds: 88, 66, 0, -5 ProvidesPrerequisite@buildingname: + SelectionDecorations: + VisualBounds: 88, 66, 0, -5 GADEPT: Inherits: ^Building @@ -205,7 +213,7 @@ GADEPT: Footprint: =x= xxx =x= Dimensions: 3,3 Selectable: - Bounds: 98, 68, -6, -6 + Bounds: 96, 64, -6, -6 Health: HP: 1100 RevealsShroud: @@ -229,6 +237,8 @@ GADEPT: Power: Amount: -30 ProvidesPrerequisite@buildingname: + SelectionDecorations: + VisualBounds: 98, 68, -6, -6 GARADR: Inherits: ^Building @@ -247,7 +257,7 @@ GARADR: Footprint: xx xx Dimensions: 2,2 Selectable: - Bounds: 96, 118, 0, -38 + Bounds: 96, 48, 0, -6 Health: HP: 800 Armor: @@ -270,6 +280,8 @@ GARADR: Power: Amount: -50 ProvidesPrerequisite@buildingname: + SelectionDecorations: + VisualBounds: 96, 118, 0, -38 GATECH: Inherits: ^Building @@ -300,6 +312,8 @@ GATECH: Power: Amount: -150 ProvidesPrerequisite@buildingname: + SelectionDecorations: + VisualBounds: 110, 60, 3, -4 GAPLUG: Inherits: ^Building @@ -309,7 +323,7 @@ GAPLUG: Name: GDI Upgrade Center Description: Can be upgraded for additional technology. Selectable: - Bounds: 115,104,0,-24 + Bounds: 115,72,0,-12 Buildable: BuildPaletteOrder: 100 Prerequisites: proc, gatech @@ -373,3 +387,6 @@ GAPLUG: UpgradeMinEnabledLevel: 1 Sequence: idle-ioncannonb ProvidesPrerequisite@buildingname: + SelectionDecorations: + VisualBounds: 115,104,0,-24 + diff --git a/mods/ts/rules/gdi-support.yaml b/mods/ts/rules/gdi-support.yaml index 5a84ac6bfa..825ce60465 100644 --- a/mods/ts/rules/gdi-support.yaml +++ b/mods/ts/rules/gdi-support.yaml @@ -36,7 +36,7 @@ GACTWR: Prerequisites: gapile, ~structures.gdi Building: Selectable: - Bounds: 48, 48, 0, -12 + Bounds: 48, 36, 0, -6 DisabledOverlay: -GivesBuildableArea: Health: @@ -128,6 +128,8 @@ GACTWR: tower.rocket: tower, tower.rocket tower.sam: tower, tower.sam ProvidesPrerequisite@buildingname: + SelectionDecorations: + VisualBounds: 48, 48, 0, -12 GAVULC: Inherits: ^BuildingPlug diff --git a/mods/ts/rules/gdi-vehicles.yaml b/mods/ts/rules/gdi-vehicles.yaml index c3cc680dfd..eaef2bfeed 100644 --- a/mods/ts/rules/gdi-vehicles.yaml +++ b/mods/ts/rules/gdi-vehicles.yaml @@ -115,6 +115,8 @@ SMECH: MoveSequence: run Selectable: Bounds: 20, 32, 0, -8 + SelectionDecorations: + VisualBounds: 20, 32, 0, -8 MMCH: Inherits: ^Tank @@ -154,6 +156,8 @@ MMCH: AutoTarget: Selectable: Bounds: 30, 42, 0, -8 + SelectionDecorations: + VisualBounds: 30, 42, 0, -8 HMEC: Inherits: ^Tank diff --git a/mods/ts/rules/nod-infantry.yaml b/mods/ts/rules/nod-infantry.yaml index a536817863..873ec14e7d 100644 --- a/mods/ts/rules/nod-infantry.yaml +++ b/mods/ts/rules/nod-infantry.yaml @@ -56,6 +56,8 @@ CYBORG: WithInfantryBody: IdleSequences: idle1,idle2 WithPermanentInjury: + SelectionDecorations: + VisualBounds: 16,31,0,-10 CYC2: Inherits: ^Infantry @@ -92,6 +94,8 @@ CYC2: WithInfantryBody: IdleSequences: idle1,idle2 WithPermanentInjury: + SelectionDecorations: + VisualBounds: 16,32,-1,-12 MHIJACK: Inherits: ^Infantry diff --git a/mods/ts/rules/nod-structures.yaml b/mods/ts/rules/nod-structures.yaml index b53dcc6f76..dcbfd3ca11 100644 --- a/mods/ts/rules/nod-structures.yaml +++ b/mods/ts/rules/nod-structures.yaml @@ -15,7 +15,7 @@ NAPOWR: Footprint: xx xx Dimensions: 2,2 Selectable: - Bounds: 88, 80, 2, -12 + Bounds: 88, 48, 2, -6 Health: HP: 750 Armor: @@ -32,6 +32,8 @@ NAPOWR: TargetTypes: Ground, C4, DetonateAttack, SpyInfiltrate ScalePowerWithHealth: DisabledOverlay: + SelectionDecorations: + VisualBounds: 88, 80, 2, -12 NAAPWR: Inherits: ^Building @@ -50,7 +52,7 @@ NAAPWR: Footprint: xxx xxx Dimensions: 2,3 Selectable: - Bounds: 100, 74, 0, -12 + Bounds: 100, 54, 0, -4 Health: HP: 900 Armor: @@ -67,6 +69,8 @@ NAAPWR: TargetTypes: Ground, C4, DetonateAttack, SpyInfiltrate ScalePowerWithHealth: DisabledOverlay: + SelectionDecorations: + VisualBounds: 100, 74, 0, -12 NAHAND: Inherits: ^Building @@ -85,7 +89,7 @@ NAHAND: Footprint: xxx xxx Dimensions: 3,2 Selectable: - Bounds: 116, 78, 3, -8 + Bounds: 116, 60, 3, -6 Health: HP: 800 Armor: @@ -108,6 +112,8 @@ NAHAND: Power: Amount: -20 ProvidesPrerequisite@buildingname: + SelectionDecorations: + VisualBounds: 116, 78, 3, -8 NAWEAP: Inherits: ^Building @@ -126,7 +132,7 @@ NAWEAP: Footprint: xxx= xxx= xxx= Dimensions: 4,3 Selectable: - Bounds: 149, 116, -3, -20 + Bounds: 149, 80, -3, -10 Health: HP: 1000 RevealsShroud: @@ -151,6 +157,8 @@ NAWEAP: Power: Amount: -30 ProvidesPrerequisite@buildingname: + SelectionDecorations: + VisualBounds: 149, 116, -3, -20 NAHPAD: Inherits: ^Building @@ -189,8 +197,10 @@ NAHPAD: Power: Amount: -10 Selectable: - Bounds: 78, 54, 0, -8 + Bounds: 78, 48, 0, -6 ProvidesPrerequisite@buildingname: + SelectionDecorations: + VisualBounds: 78, 54, 0, -8 NARADR: Inherits: ^Building @@ -209,7 +219,7 @@ NARADR: Footprint: xx xx Dimensions: 2,2 Selectable: - Bounds: 96, 82, 0, -17 + Bounds: 96, 48, 0, -6 Health: HP: 800 Armor: @@ -232,6 +242,8 @@ NARADR: Power: Amount: -50 ProvidesPrerequisite@buildingname: + SelectionDecorations: + VisualBounds: 96, 72, 0, -12 NATECH: Inherits: ^Building @@ -250,7 +262,7 @@ NATECH: Footprint: xx xx Dimensions: 2,2 Selectable: - Bounds: 86, 58, 0, -4 + Bounds: 86, 48, 0, -4 Health: HP: 500 Armor: @@ -262,6 +274,8 @@ NATECH: Power: Amount: -150 ProvidesPrerequisite@buildingname: + SelectionDecorations: + VisualBounds: 86, 58, 0, -4 NASTLH: Inherits: ^Building @@ -301,4 +315,7 @@ NASTLH: DisableSound: cloak5.aud AffectsParent: true Selectable: - Bounds: 106, 60, 8, -15 + Bounds: 106, 48, 8, -6 + SelectionDecorations: + VisualBounds: 106, 60, 8, -15 + diff --git a/mods/ts/rules/nod-support.yaml b/mods/ts/rules/nod-support.yaml index 3d699dc15f..bbed7dd7af 100644 --- a/mods/ts/rules/nod-support.yaml +++ b/mods/ts/rules/nod-support.yaml @@ -36,7 +36,7 @@ NALASR: BuildPaletteOrder: 50 Building: Selectable: - Bounds: 40, 36, -8, -8 + Bounds: 40, 30, -8, -6 RequiresPower: DisabledOverlay: -GivesBuildableArea: @@ -62,6 +62,8 @@ NALASR: AutoTarget: Power: Amount: -40 + SelectionDecorations: + VisualBounds: 40, 36, -8, -8 NAOBEL: Inherits: ^Building @@ -78,7 +80,7 @@ NAOBEL: Footprint: xx xx Dimensions: 2,2 Selectable: - Bounds: 88, 74, 0, -14 + Bounds: 88, 42, 0, -6 RequiresPower: DisabledOverlay: -GivesBuildableArea: @@ -108,6 +110,8 @@ NAOBEL: Sequence: idle-lights Power: Amount: -150 + SelectionDecorations: + VisualBounds: 88, 72, 0, -12 NASAM: Inherits: ^Building @@ -122,7 +126,7 @@ NASAM: BuildPaletteOrder: 60 Building: Selectable: - Bounds: 40, 36, -3, -8 + Bounds: 40, 30, -3, -8 RequiresPower: DisabledOverlay: -GivesBuildableArea: @@ -150,6 +154,8 @@ NASAM: LocalOffset: 512,0,512 Power: Amount: -30 + SelectionDecorations: + VisualBounds: 40, 36, -3, -8 GATICK: Inherits: ^Building @@ -300,3 +306,6 @@ NAMISL: DisplayRadarPing: True BeaconPoster: CameraActor: camera + SelectionDecorations: + VisualBounds: 75,48 + diff --git a/mods/ts/rules/shared-structures.yaml b/mods/ts/rules/shared-structures.yaml index 4fd803e3d3..18f95a456a 100644 --- a/mods/ts/rules/shared-structures.yaml +++ b/mods/ts/rules/shared-structures.yaml @@ -42,13 +42,15 @@ GACNST: Power: Amount: 0 Selectable: - Bounds: 144, 80, 0, -12 + Bounds: 144, 60, 0, -6 ProvidesPrerequisite@gdi: Race: gdi Prerequisite: structures.gdi ProvidesPrerequisite@nod: Race: nod Prerequisite: structures.nod + SelectionDecorations: + VisualBounds: 144, 80, 0, -12 PROC: Inherits: ^Building @@ -65,7 +67,7 @@ PROC: Footprint: xxx= xx== xxx= Dimensions: 4,3 Selectable: - Bounds: 134, 122, 0, -18 + Bounds: 134, 96, 0, -12 Health: HP: 900 RevealsShroud: @@ -94,6 +96,8 @@ PROC: Power: Amount: -30 ProvidesPrerequisite@buildingname: + SelectionDecorations: + VisualBounds: 134, 122, 0, -18 GASILO: Inherits: ^Building @@ -129,6 +133,8 @@ GASILO: Capacity: 1500 Power: Amount: -10 + SelectionDecorations: + VisualBounds: 80, 48, -5, 0 ANYPOWER: Tooltip: diff --git a/mods/ts/rules/shared-support.yaml b/mods/ts/rules/shared-support.yaml index c6627222f6..f9d8f22241 100644 --- a/mods/ts/rules/shared-support.yaml +++ b/mods/ts/rules/shared-support.yaml @@ -62,3 +62,6 @@ NAPULS: Sequence: turret Power: Amount: -150 + SelectionDecorations: + VisualBounds: 78, 54, 0, -12 + diff --git a/mods/ts/rules/shared-vehicles.yaml b/mods/ts/rules/shared-vehicles.yaml index bdbc0b43a7..2e6be2ea30 100644 --- a/mods/ts/rules/shared-vehicles.yaml +++ b/mods/ts/rules/shared-vehicles.yaml @@ -33,6 +33,8 @@ MCV: RenderSprites: RenderVoxels: WithVoxelBody: + SelectionDecorations: + VisualBounds: 42,42 HARV: Inherits: ^Vehicle @@ -84,6 +86,8 @@ HARV: WithHarvestAnimation: Offset: 384,0,0 Palette: effect + SelectionDecorations: + VisualBounds: 36,36 LPST: Inherits: ^Vehicle