diff --git a/OpenRA.Mods.Common/Traits/Buildings/ActorPreviewPlaceBuildingPreview.cs b/OpenRA.Mods.Common/Traits/Buildings/ActorPreviewPlaceBuildingPreview.cs index d30d9f7b69..4039414584 100644 --- a/OpenRA.Mods.Common/Traits/Buildings/ActorPreviewPlaceBuildingPreview.cs +++ b/OpenRA.Mods.Common/Traits/Buildings/ActorPreviewPlaceBuildingPreview.cs @@ -51,7 +51,7 @@ namespace OpenRA.Mods.Common.Traits public class ActorPreviewPlaceBuildingPreview { } - class ActorPreviewPlaceBuildingPreviewPreview : FootprintPlaceBuildingPreviewPreview + public class ActorPreviewPlaceBuildingPreviewPreview : FootprintPlaceBuildingPreviewPreview { readonly ActorPreviewPlaceBuildingPreviewInfo info; readonly PaletteReference palette; diff --git a/OpenRA.Mods.Common/Traits/Buildings/FootprintPlaceBuildingPreview.cs b/OpenRA.Mods.Common/Traits/Buildings/FootprintPlaceBuildingPreview.cs index c569b2354e..742516efd8 100644 --- a/OpenRA.Mods.Common/Traits/Buildings/FootprintPlaceBuildingPreview.cs +++ b/OpenRA.Mods.Common/Traits/Buildings/FootprintPlaceBuildingPreview.cs @@ -42,7 +42,7 @@ namespace OpenRA.Mods.Common.Traits public class FootprintPlaceBuildingPreview { } - class FootprintPlaceBuildingPreviewPreview : IPlaceBuildingPreview + public class FootprintPlaceBuildingPreviewPreview : IPlaceBuildingPreview { protected readonly ActorInfo actorInfo; protected readonly WVec centerOffset; @@ -72,7 +72,7 @@ namespace OpenRA.Mods.Common.Traits protected virtual void TickInner() { } - protected IEnumerable RenderFootprint(WorldRenderer wr, CPos topLeft, Dictionary footprint, + protected virtual IEnumerable RenderFootprint(WorldRenderer wr, CPos topLeft, Dictionary footprint, PlaceBuildingCellType filter = PlaceBuildingCellType.Invalid | PlaceBuildingCellType.Valid | PlaceBuildingCellType.LineBuild) { var cellPalette = wr.Palette(info.Palette); diff --git a/OpenRA.Mods.D2k/Traits/Buildings/D2kActorPreviewPlaceBuildingPreview.cs b/OpenRA.Mods.D2k/Traits/Buildings/D2kActorPreviewPlaceBuildingPreview.cs new file mode 100644 index 0000000000..3dd6c3eae5 --- /dev/null +++ b/OpenRA.Mods.D2k/Traits/Buildings/D2kActorPreviewPlaceBuildingPreview.cs @@ -0,0 +1,88 @@ +#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.Collections.Generic; +using System.Linq; +using OpenRA.Graphics; +using OpenRA.Mods.Common.Orders; +using OpenRA.Primitives; +using OpenRA.Widgets; + +namespace OpenRA.Mods.Common.Traits +{ + [Desc("Creates a building placement preview based on the map editor actor preview.")] + public class D2kActorPreviewPlaceBuildingPreviewInfo : ActorPreviewPlaceBuildingPreviewInfo + { + [Desc("Terrain types that should show the 'unsafe' footprint tile.")] + public readonly HashSet UnsafeTerrainTypes = new HashSet { "Rock" }; + + protected override IPlaceBuildingPreview CreatePreview(WorldRenderer wr, ActorInfo ai, TypeDictionary init) + { + return new D2kActorPreviewPlaceBuildingPreviewPreview(wr, ai, this, init); + } + + public override object Create(ActorInitializer init) + { + return new D2kActorPreviewPlaceBuildingPreview(); + } + } + + public class D2kActorPreviewPlaceBuildingPreview { } + + class D2kActorPreviewPlaceBuildingPreviewPreview : ActorPreviewPlaceBuildingPreviewPreview + { + readonly D2kActorPreviewPlaceBuildingPreviewInfo info; + readonly Sprite buildOk; + readonly Sprite buildUnsafe; + readonly Sprite buildBlocked; + readonly CachedTransform> unpathableCells; + + public D2kActorPreviewPlaceBuildingPreviewPreview(WorldRenderer wr, ActorInfo ai, D2kActorPreviewPlaceBuildingPreviewInfo info, TypeDictionary init) + : base(wr, ai, info, init) + { + this.info = info; + + var world = wr.World; + var sequences = world.Map.Rules.Sequences; + + buildOk = sequences.GetSequence("overlay", "build-valid").GetSprite(0); + buildUnsafe = sequences.GetSequence("overlay", "build-unsafe").GetSprite(0); + buildBlocked = sequences.GetSequence("overlay", "build-invalid").GetSprite(0); + + var buildingInfo = ai.TraitInfo(); + unpathableCells = new CachedTransform>(topLeft => buildingInfo.UnpathableTiles(topLeft).ToList()); + } + + protected override IEnumerable RenderFootprint(WorldRenderer wr, CPos topLeft, Dictionary footprint, + PlaceBuildingCellType filter = PlaceBuildingCellType.Invalid | PlaceBuildingCellType.Valid | PlaceBuildingCellType.LineBuild) + { + var cellPalette = wr.Palette(info.Palette); + var linePalette = wr.Palette(info.LineBuildSegmentPalette); + var topLeftPos = wr.World.Map.CenterOfCell(topLeft); + + var candidateSafeTiles = unpathableCells.Update(topLeft); + foreach (var c in footprint) + { + if ((c.Value & filter) == 0) + continue; + + var tile = c.Value.HasFlag(PlaceBuildingCellType.Invalid) ? buildBlocked : + candidateSafeTiles.Contains(c.Key) && info.UnsafeTerrainTypes.Contains(wr.World.Map.GetTerrainInfo(c.Key).Type) + ? buildUnsafe : buildOk; + + var pal = c.Value.HasFlag(PlaceBuildingCellType.LineBuild) ? linePalette : cellPalette; + var pos = wr.World.Map.CenterOfCell(c.Key); + var offset = new WVec(0, 0, topLeftPos.Z - pos.Z); + yield return new SpriteRenderable(tile, pos, offset, -511, pal, 1f, true); + } + } + } +} diff --git a/mods/d2k/bits/concfoot.shp b/mods/d2k/bits/concfoot.shp new file mode 100644 index 0000000000..cdff3edf27 Binary files /dev/null and b/mods/d2k/bits/concfoot.shp differ diff --git a/mods/d2k/rules/defaults.yaml b/mods/d2k/rules/defaults.yaml index 24d093789a..6ab7986e45 100644 --- a/mods/d2k/rules/defaults.yaml +++ b/mods/d2k/rules/defaults.yaml @@ -385,7 +385,7 @@ Footprint: x TerrainTypes: Rock, Concrete BuildSounds: BUILD1.WAV - ActorPreviewPlaceBuildingPreview: + D2kActorPreviewPlaceBuildingPreview: OverridePalette: placebuilding RequiresBuildableArea: AreaTypes: building diff --git a/mods/d2k/sequences/misc.yaml b/mods/d2k/sequences/misc.yaml index 65529baf52..c345ae72af 100644 --- a/mods/d2k/sequences/misc.yaml +++ b/mods/d2k/sequences/misc.yaml @@ -169,12 +169,14 @@ rank: overlay: Defaults: DATA.R8 Offset: -16,-16 - build-valid-arrakis: + build-valid: + build-unsafe: concfoot.shp + Offset: 0, 0 build-invalid: Start: 1 target-select: Start: 2 - target-valid-arrakis: + target-valid: target-invalid: Start: 1