Implement elevated bridge placeholders.
This commit is contained in:
@@ -798,6 +798,8 @@
|
|||||||
<Compile Include="Traits\World\TerrainTunnel.cs" />
|
<Compile Include="Traits\World\TerrainTunnel.cs" />
|
||||||
<Compile Include="Traits\World\SubterraneanActorLayer.cs" />
|
<Compile Include="Traits\World\SubterraneanActorLayer.cs" />
|
||||||
<Compile Include="Traits\World\JumpjetActorLayer.cs" />
|
<Compile Include="Traits\World\JumpjetActorLayer.cs" />
|
||||||
|
<Compile Include="Traits\World\ElevatedBridgeLayer.cs" />
|
||||||
|
<Compile Include="Traits\World\ElevatedBridgePlaceholder.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
<Target Name="AfterBuild">
|
<Target Name="AfterBuild">
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
public const byte Tunnel = 1;
|
public const byte Tunnel = 1;
|
||||||
public const byte Subterranean = 2;
|
public const byte Subterranean = 2;
|
||||||
public const byte Jumpjet = 3;
|
public const byte Jumpjet = 3;
|
||||||
|
public const byte ElevatedBridge = 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
[Desc("Unit is able to move.")]
|
[Desc("Unit is able to move.")]
|
||||||
|
|||||||
95
OpenRA.Mods.Common/Traits/World/ElevatedBridgeLayer.cs
Normal file
95
OpenRA.Mods.Common/Traits/World/ElevatedBridgeLayer.cs
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
#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 System.Collections.Generic;
|
||||||
|
using OpenRA.Graphics;
|
||||||
|
using OpenRA.Traits;
|
||||||
|
|
||||||
|
namespace OpenRA.Mods.Common.Traits
|
||||||
|
{
|
||||||
|
public class ElevatedBridgeLayerInfo : ITraitInfo, Requires<DomainIndexInfo>, ILobbyCustomRulesIgnore
|
||||||
|
{
|
||||||
|
[Desc("Terrain type used by cells outside any elevated bridge footprint.")]
|
||||||
|
public readonly string ImpassableTerrainType = "Impassable";
|
||||||
|
|
||||||
|
public object Create(ActorInitializer init) { return new ElevatedBridgeLayer(init.Self, this); }
|
||||||
|
}
|
||||||
|
|
||||||
|
// For now this is mostly copies TerrainTunnelLayer. This will change once bridge destruction is implemented
|
||||||
|
public class ElevatedBridgeLayer : ICustomMovementLayer, IWorldLoaded
|
||||||
|
{
|
||||||
|
readonly Map map;
|
||||||
|
readonly CellLayer<WPos> cellCenters;
|
||||||
|
readonly CellLayer<byte> terrainIndices;
|
||||||
|
readonly HashSet<CPos> ends = new HashSet<CPos>();
|
||||||
|
bool enabled;
|
||||||
|
|
||||||
|
public ElevatedBridgeLayer(Actor self, ElevatedBridgeLayerInfo info)
|
||||||
|
{
|
||||||
|
map = self.World.Map;
|
||||||
|
cellCenters = new CellLayer<WPos>(map);
|
||||||
|
terrainIndices = new CellLayer<byte>(map);
|
||||||
|
terrainIndices.Clear(map.Rules.TileSet.GetTerrainIndex(info.ImpassableTerrainType));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void WorldLoaded(World world, WorldRenderer wr)
|
||||||
|
{
|
||||||
|
var domainIndex = world.WorldActor.Trait<DomainIndex>();
|
||||||
|
foreach (var tti in world.WorldActor.Info.TraitInfos<ElevatedBridgePlaceholderInfo>())
|
||||||
|
{
|
||||||
|
enabled = true;
|
||||||
|
|
||||||
|
var terrain = map.Rules.TileSet.GetTerrainIndex(tti.TerrainType);
|
||||||
|
foreach (var c in tti.BridgeCells())
|
||||||
|
{
|
||||||
|
var uv = c.ToMPos(map);
|
||||||
|
terrainIndices[uv] = terrain;
|
||||||
|
|
||||||
|
var pos = map.CenterOfCell(c);
|
||||||
|
cellCenters[uv] = pos - new WVec(0, 0, pos.Z - 512 * tti.Height);
|
||||||
|
}
|
||||||
|
|
||||||
|
var end = tti.EndCells();
|
||||||
|
domainIndex.AddFixedConnection(end);
|
||||||
|
foreach (var c in end)
|
||||||
|
{
|
||||||
|
// Need to explicitly set both default and tunnel layers, otherwise the .Contains check will fail
|
||||||
|
ends.Add(new CPos(c.X, c.Y, 0));
|
||||||
|
ends.Add(new CPos(c.X, c.Y, CustomMovementLayerType.ElevatedBridge));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ICustomMovementLayer.EnabledForActor(ActorInfo a, MobileInfo mi) { return enabled; }
|
||||||
|
byte ICustomMovementLayer.Index { get { return CustomMovementLayerType.ElevatedBridge; } }
|
||||||
|
bool ICustomMovementLayer.InteractsWithDefaultLayer { get { return true; } }
|
||||||
|
|
||||||
|
WPos ICustomMovementLayer.CenterOfCell(CPos cell)
|
||||||
|
{
|
||||||
|
return cellCenters[cell];
|
||||||
|
}
|
||||||
|
|
||||||
|
int ICustomMovementLayer.EntryMovementCost(ActorInfo a, MobileInfo mi, CPos cell)
|
||||||
|
{
|
||||||
|
return ends.Contains(cell) ? 0 : int.MaxValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ICustomMovementLayer.ExitMovementCost(ActorInfo a, MobileInfo mi, CPos cell)
|
||||||
|
{
|
||||||
|
return ends.Contains(cell) ? 0 : int.MaxValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
byte ICustomMovementLayer.GetTerrainIndex(CPos cell)
|
||||||
|
{
|
||||||
|
return terrainIndices[cell];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
75
OpenRA.Mods.Common/Traits/World/ElevatedBridgePlaceholder.cs
Normal file
75
OpenRA.Mods.Common/Traits/World/ElevatedBridgePlaceholder.cs
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
#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 System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using OpenRA.Traits;
|
||||||
|
|
||||||
|
namespace OpenRA.Mods.Common.Traits
|
||||||
|
{
|
||||||
|
public enum ElevatedBridgePlaceholderOrientation { X, Y }
|
||||||
|
|
||||||
|
[Desc("Placeholder to make static elevated bridges work.",
|
||||||
|
"Define individual trait instances for each elevated bridge footprint in the map.")]
|
||||||
|
public class ElevatedBridgePlaceholderInfo : TraitInfo<ElevatedBridgePlaceholder>, Requires<ElevatedBridgeLayerInfo>, ILobbyCustomRulesIgnore
|
||||||
|
{
|
||||||
|
[FieldLoader.Require]
|
||||||
|
[Desc("Location of the bridge")]
|
||||||
|
public readonly CPos Location = CPos.Zero;
|
||||||
|
|
||||||
|
[FieldLoader.Require]
|
||||||
|
[Desc("Orientation of the bridge.")]
|
||||||
|
public readonly ElevatedBridgePlaceholderOrientation Orientation;
|
||||||
|
|
||||||
|
[FieldLoader.Require]
|
||||||
|
[Desc("Length of the bridge")]
|
||||||
|
public readonly int Length = 0;
|
||||||
|
|
||||||
|
[FieldLoader.Require]
|
||||||
|
[Desc("Height of the bridge in map height steps.")]
|
||||||
|
public readonly byte Height = 0;
|
||||||
|
|
||||||
|
[Desc("Terrain type of the bridge.")]
|
||||||
|
public readonly string TerrainType = "Road";
|
||||||
|
|
||||||
|
public IEnumerable<CPos> BridgeCells()
|
||||||
|
{
|
||||||
|
var dimensions = Orientation == ElevatedBridgePlaceholderOrientation.X ?
|
||||||
|
new CVec(Length + 1, 3) : new CVec(3, Length + 1);
|
||||||
|
|
||||||
|
for (var y = 0; y < dimensions.Y; y++)
|
||||||
|
for (var x = 0; x < dimensions.X; x++)
|
||||||
|
yield return Location + new CVec(x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
public IEnumerable<CPos> EndCells()
|
||||||
|
{
|
||||||
|
if (Orientation == ElevatedBridgePlaceholderOrientation.X)
|
||||||
|
{
|
||||||
|
for (var y = 0; y < 3; y++)
|
||||||
|
{
|
||||||
|
yield return Location + new CVec(0, y);
|
||||||
|
yield return Location + new CVec(Length, y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (var x = 0; x < 3; x++)
|
||||||
|
{
|
||||||
|
yield return Location + new CVec(x, 0);
|
||||||
|
yield return Location + new CVec(x, Length);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ElevatedBridgePlaceholder { }
|
||||||
|
}
|
||||||
@@ -31,10 +31,8 @@ namespace OpenRA.Mods.TS.UtilityCommands
|
|||||||
{
|
{
|
||||||
{ 0x01, "gasand" },
|
{ 0x01, "gasand" },
|
||||||
{ 0x03, "gawall" },
|
{ 0x03, "gawall" },
|
||||||
/*
|
|
||||||
{ 0x18, "bridge1" },
|
{ 0x18, "bridge1" },
|
||||||
{ 0x19, "bridge2" },
|
{ 0x19, "bridge2" },
|
||||||
*/
|
|
||||||
{ 0x1A, "nawall" },
|
{ 0x1A, "nawall" },
|
||||||
{ 0x27, "tracks01" },
|
{ 0x27, "tracks01" },
|
||||||
{ 0x28, "tracks02" },
|
{ 0x28, "tracks02" },
|
||||||
@@ -56,10 +54,8 @@ namespace OpenRA.Mods.TS.UtilityCommands
|
|||||||
{ 0x38, "tracktunnel02" },
|
{ 0x38, "tracktunnel02" },
|
||||||
{ 0x39, "tracktunnel03" },
|
{ 0x39, "tracktunnel03" },
|
||||||
{ 0x3A, "tracktunnel04" },
|
{ 0x3A, "tracktunnel04" },
|
||||||
/*
|
|
||||||
{ 0x3B, "railbrdg1" },
|
{ 0x3B, "railbrdg1" },
|
||||||
{ 0x3C, "railbrdg2" },
|
{ 0x3C, "railbrdg2" },
|
||||||
*/
|
|
||||||
{ 0x3D, "crat01" },
|
{ 0x3D, "crat01" },
|
||||||
{ 0x3E, "crat02" },
|
{ 0x3E, "crat02" },
|
||||||
{ 0x3F, "crat03" },
|
{ 0x3F, "crat03" },
|
||||||
|
|||||||
@@ -152,3 +152,34 @@ LOBRDG_R_SW:
|
|||||||
NeighbourOffsets: 1,-1
|
NeighbourOffsets: 1,-1
|
||||||
EditorOnlyTooltip:
|
EditorOnlyTooltip:
|
||||||
Name: Bridge Ramp
|
Name: Bridge Ramp
|
||||||
|
|
||||||
|
^ElevatedBridgePlaceholder:
|
||||||
|
AlwaysVisible:
|
||||||
|
RenderSprites:
|
||||||
|
Palette: terraindecoration
|
||||||
|
WithSpriteBody:
|
||||||
|
AutoSelectionSize:
|
||||||
|
AppearsOnRadar:
|
||||||
|
RadarColorFromTerrain:
|
||||||
|
Terrain: Bridge
|
||||||
|
BodyOrientation:
|
||||||
|
UseClassicPerspectiveFudge: false
|
||||||
|
QuantizedFacings: 1
|
||||||
|
Tooltip:
|
||||||
|
Name: Bridge
|
||||||
|
Immobile:
|
||||||
|
OccupiesSpace: false
|
||||||
|
CustomSelectionSize:
|
||||||
|
CustomBounds: 96, 144
|
||||||
|
|
||||||
|
BRIDGE1:
|
||||||
|
Inherits: ^ElevatedBridgePlaceholder
|
||||||
|
|
||||||
|
BRIDGE2:
|
||||||
|
Inherits: ^ElevatedBridgePlaceholder
|
||||||
|
|
||||||
|
RAILBRDG1:
|
||||||
|
Inherits: ^ElevatedBridgePlaceholder
|
||||||
|
|
||||||
|
RAILBRDG2:
|
||||||
|
Inherits: ^ElevatedBridgePlaceholder
|
||||||
|
|||||||
@@ -62,3 +62,36 @@ lobrdg_r_sw:
|
|||||||
idle: lobrdg25
|
idle: lobrdg25
|
||||||
damaged-idle: lobrdg26
|
damaged-idle: lobrdg26
|
||||||
|
|
||||||
|
bridge1:
|
||||||
|
idle: bridge
|
||||||
|
# Disabled to avoid glitches until shadow rendering is fixed
|
||||||
|
# ShadowStart: 18
|
||||||
|
UseTilesetExtension: true
|
||||||
|
ZRamp: 1
|
||||||
|
Offset: 0, -13, 3.5
|
||||||
|
|
||||||
|
bridge2:
|
||||||
|
idle: bridge
|
||||||
|
Start: 9
|
||||||
|
# Disabled to avoid glitches until shadow rendering is fixed
|
||||||
|
# ShadowStart: 27
|
||||||
|
UseTilesetExtension: true
|
||||||
|
ZRamp: 1
|
||||||
|
Offset: 0, -25, 3.5
|
||||||
|
|
||||||
|
railbrdg1:
|
||||||
|
idle: railbrdg
|
||||||
|
# Disabled to avoid glitches until shadow rendering is fixed
|
||||||
|
# ShadowStart: 18
|
||||||
|
UseTilesetExtension: true
|
||||||
|
ZRamp: 1
|
||||||
|
Offset: 0, -13, 3.5
|
||||||
|
|
||||||
|
railbrdg2:
|
||||||
|
idle: railbrdg
|
||||||
|
Start: 9
|
||||||
|
# Disabled to avoid glitches until shadow rendering is fixed
|
||||||
|
# ShadowStart: 27
|
||||||
|
UseTilesetExtension: true
|
||||||
|
ZRamp: 1
|
||||||
|
Offset: 0, -25, 3.5
|
||||||
|
|||||||
Reference in New Issue
Block a user