Skip to content

Commit

Permalink
Merge pull request #4970 from Phrohdoh/LineBuild
Browse files Browse the repository at this point in the history
Added LineBuildNode trait to filter which structure(s) a LineBuild actor can be attached to.
Closes #2248
  • Loading branch information
Mailaender committed Mar 29, 2014
2 parents 9c92980 + 61749e1 commit 153aba4
Show file tree
Hide file tree
Showing 11 changed files with 85 additions and 5 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG
Expand Up @@ -40,6 +40,7 @@ NEW:
Added the BLOXXMAS terrain tiles from the 1.06 patch.
Saboteur can now plant C4 on vehicles.
Added concrete plates and building weathering.
Walls will now extend themselves when placed in line with a turret.
Red Alert:
Engineers are now remapped to team colors.
Added some remap to the bottom edge of SAM sites.
Expand Down Expand Up @@ -138,6 +139,7 @@ NEW:
Maps can define initial cargo for actors by adding "Cargo: actora, actorb, ..." to the actor reference.
Modified Teleport activity to use the best/closest open cell to the target destination for teleports (for ChronoshiftPower this only applies on the return trip).
Renamed ChronoshiftDeploy trait to PortableChrono.
Added LineBuildNode trait to filter which structure(s) a LineBuild actor can be attached to.
Server:
Message of the day is now shared between all mods and a default motd.txt gets created in the user directory.
Asset Browser:
Expand Down
5 changes: 4 additions & 1 deletion OpenRA.Mods.RA/Buildings/LineBuild.cs
@@ -1,6 +1,6 @@
#region Copyright & License Information
/*
* Copyright 2007-2011 The OpenRA Developers (see AUTHORS)
* Copyright 2007-2014 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,
Expand All @@ -18,6 +18,9 @@ public class LineBuildInfo : TraitInfo<LineBuild>
{
[Desc("The maximum allowed length of the line.")]
public readonly int Range = 5;

[Desc("LineBuildNode 'Types' to attach to.")]
public readonly string[] NodeTypes = { "wall" };
}

public class LineBuild {}
Expand Down
24 changes: 24 additions & 0 deletions OpenRA.Mods.RA/Buildings/LineBuildNode.cs
@@ -0,0 +1,24 @@
#region Copyright & License Information
/*
* Copyright 2007-2014 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 OpenRA.FileFormats;
using OpenRA.Traits;

namespace OpenRA.Mods.RA.Buildings
{
[Desc("LineBuild actors attach to LineBuildNodes.")]
public class LineBuildNodeInfo : TraitInfo<LineBuildNode>
{
[Desc("This actor is of LineBuild 'NodeType'...")]
public readonly string[] Types = { "wall" };
}

public class LineBuildNode {}
}
12 changes: 8 additions & 4 deletions OpenRA.Mods.RA/Buildings/Util.cs
Expand Up @@ -42,7 +42,7 @@ public static bool CanPlaceBuilding(this World world, string name, BuildingInfo

public static IEnumerable<CPos> GetLineBuildCells(World world, CPos location, string name, BuildingInfo bi)
{
int range = Rules.Info[name].Traits.Get<LineBuildInfo>().Range;
var lbi = Rules.Info[name].Traits.Get<LineBuildInfo>();
var topLeft = location; // 1x1 assumption!

if (world.IsCellBuildable(topLeft, bi))
Expand All @@ -54,17 +54,21 @@ public static IEnumerable<CPos> GetLineBuildCells(World world, CPos location, st
int[] dirs = { 0, 0, 0, 0 };
for (int d = 0; d < 4; d++)
{
for (int i = 1; i < range; i++)
for (int i = 1; i < lbi.Range; i++)
{
if (dirs[d] != 0)
continue;

CPos cell = topLeft + i * vecs[d];
var cell = topLeft + i * vecs[d];
if (world.IsCellBuildable(cell, bi))
continue; // Cell is empty; continue search

// Cell contains an actor. Is it the type we want?
if (world.ActorsWithTrait<LineBuild>().Any(a => (a.Actor.Info.Name == name && a.Actor.Location.X == cell.X && a.Actor.Location.Y == cell.Y)))
if (world.ActorsWithTrait<LineBuildNode>().Any(a =>
(
a.Actor.Location == cell &&
a.Actor.Info.Traits.Get<LineBuildNodeInfo>().Types.Intersect(lbi.NodeTypes).Any()
)))
dirs[d] = i; // Cell contains actor of correct type
else
dirs[d] = -1; // Cell is blocked by another actor type
Expand Down
1 change: 1 addition & 0 deletions OpenRA.Mods.RA/OpenRA.Mods.RA.csproj
Expand Up @@ -490,6 +490,7 @@
<Compile Include="Orders\BeaconOrderGenerator.cs" />
<Compile Include="Widgets\LogicKeyListenerWidget.cs" />
<Compile Include="Widgets\Logic\ControlGroupLogic.cs" />
<Compile Include="Buildings\LineBuildNode.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\OpenRA.FileFormats\OpenRA.FileFormats.csproj">
Expand Down
3 changes: 3 additions & 0 deletions mods/cnc/rules/defaults.yaml
Expand Up @@ -447,6 +447,9 @@
CrushSound: sandbag2.aud
LineBuild:
Range: 8
NodeTypes: wall
LineBuildNode:
Types: wall
RenderBuildingWall:
HasMakeAnimation: false
Palette: staticterrain
Expand Down
15 changes: 15 additions & 0 deletions mods/cnc/rules/structures.yaml
Expand Up @@ -726,6 +726,11 @@ SBAG:
HP: 100
Armor:
Type: Light
LineBuild:
Range: 8
NodeTypes: sandbag
LineBuildNode:
Types: sandbag

CYCL:
Inherits: ^Wall
Expand All @@ -745,6 +750,11 @@ CYCL:
HP: 100
Armor:
Type: Light
LineBuild:
Range: 8
NodeTypes: chain
LineBuildNode:
Types: chain

BRIK:
Inherits: ^Wall
Expand All @@ -769,6 +779,11 @@ BRIK:
-CrushSound:
SoundOnDamageTransition:
DestroyedSound: crumble.aud
LineBuild:
Range: 8
NodeTypes: concrete
LineBuildNode:
Types: concrete

BARRACKS:
Tooltip:
Expand Down
7 changes: 7 additions & 0 deletions mods/d2k/rules/structures.yaml
Expand Up @@ -412,6 +412,9 @@ CONCRETEB:
CrushClasses: Concretewall
LineBuild:
Range: 8
NodeTypes: wall, turret
LineBuildNode:
Types: wall
TargetableBuilding:
TargetTypes: Ground
RenderBuildingWall:
Expand Down Expand Up @@ -478,6 +481,8 @@ WALL:
DetectCloaked:
Range: 5
-WithCrumbleOverlay:
LineBuildNode:
Types: turret

^ROCKETTOWER:
Inherits: ^Building
Expand Down Expand Up @@ -527,6 +532,8 @@ WALL:
DetectCloaked:
Range: 6
-WithCrumbleOverlay:
LineBuildNode:
Types: turret

^REPAIR:
Inherits: ^Building
Expand Down
3 changes: 3 additions & 0 deletions mods/ra/rules/defaults.yaml
Expand Up @@ -287,6 +287,9 @@
CrushClasses: wall
LineBuild:
Range: 8
NodeTypes: wall
LineBuildNode:
Types: wall
TargetableBuilding:
TargetTypes: Ground, DetonateAttack
RenderBuildingWall:
Expand Down
15 changes: 15 additions & 0 deletions mods/ra/rules/structures.yaml
Expand Up @@ -1355,6 +1355,11 @@ SBAG:
HP: 300
Armor:
Type: Wood
LineBuild:
Range: 8
NodeTypes: sandbag
LineBuildNode:
Types: sandbag

FENC:
Inherits: ^Wall
Expand All @@ -1375,6 +1380,11 @@ FENC:
HP: 300
Armor:
Type: Wood
LineBuild:
Range: 8
NodeTypes: fence
LineBuildNode:
Types: fence

BRIK:
Inherits: ^Wall
Expand All @@ -1400,6 +1410,11 @@ BRIK:
Type: Concrete
Wall:
CrushClasses: heavywall
LineBuild:
Range: 8
NodeTypes: concrete
LineBuildNode:
Types: concrete

CYCL:
Inherits: ^Wall
Expand Down
3 changes: 3 additions & 0 deletions mods/ts/rules/defaults.yaml
Expand Up @@ -159,6 +159,9 @@
CrushClasses: wall
LineBuild:
Range: 8
NodeTypes: wall
LineBuildNode:
Types: wall
SelectionDecorations:
Selectable:
Priority: 1
Expand Down

0 comments on commit 153aba4

Please sign in to comment.