Linebuild walls
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
|
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
@@ -267,6 +267,7 @@
|
|||||||
<Compile Include="Traits\Render\RenderBuildingWall.cs" />
|
<Compile Include="Traits\Render\RenderBuildingWall.cs" />
|
||||||
<Compile Include="Traits\Player\EvaAlerts.cs" />
|
<Compile Include="Traits\Player\EvaAlerts.cs" />
|
||||||
<Compile Include="Traits\World\ScreenShaker.cs" />
|
<Compile Include="Traits\World\ScreenShaker.cs" />
|
||||||
|
<Compile Include="Traits\LineBuild.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\OpenRA.FileFormats\OpenRA.FileFormats.csproj">
|
<ProjectReference Include="..\OpenRA.FileFormats\OpenRA.FileFormats.csproj">
|
||||||
|
|||||||
@@ -21,6 +21,7 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using OpenRA.GameRules;
|
using OpenRA.GameRules;
|
||||||
using OpenRA.Traits;
|
using OpenRA.Traits;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
namespace OpenRA.Orders
|
namespace OpenRA.Orders
|
||||||
{
|
{
|
||||||
@@ -58,6 +59,41 @@ namespace OpenRA.Orders
|
|||||||
}
|
}
|
||||||
|
|
||||||
yield return new Order("PlaceBuilding", Producer.Owner.PlayerActor, topLeft, Building);
|
yield return new Order("PlaceBuilding", Producer.Owner.PlayerActor, topLeft, Building);
|
||||||
|
|
||||||
|
// Linebuild for walls.
|
||||||
|
// Assumes a 1x1 footprint; weird things will happen for other footprints
|
||||||
|
if (Rules.Info[ Building ].Traits.Contains<LineBuildInfo>())
|
||||||
|
{
|
||||||
|
int range = Rules.Info[ Building ].Traits.Get<LineBuildInfo>().Range;
|
||||||
|
|
||||||
|
// Start at place location, search outwards
|
||||||
|
// TODO: First make it work, then make it nice
|
||||||
|
int[] dirs = {0,0,0,0};
|
||||||
|
for (int d = 0; d < 4; d++)
|
||||||
|
{
|
||||||
|
for (int i = 1; i < range; i++)
|
||||||
|
{
|
||||||
|
if (dirs[d] != 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
int2 cell = world.OffsetCell(topLeft,i,d);
|
||||||
|
|
||||||
|
if (world.IsCellBuildable(cell, BuildingInfo.WaterBound ? UnitMovementType.Float : UnitMovementType.Wheel,null))
|
||||||
|
continue; // Cell is empty; continue search
|
||||||
|
|
||||||
|
// Cell contains an actor. Is it the type we want?
|
||||||
|
if (world.Queries.WithTrait<LineBuild>().Any(a => (a.Actor.Info.Name == Building && a.Actor.Location.X == cell.X && a.Actor.Location.Y == cell.Y)))
|
||||||
|
dirs[d] = i; // Cell contains actor of correct type
|
||||||
|
else
|
||||||
|
dirs[d] = -1; // Cell is blocked by another actor type
|
||||||
|
}
|
||||||
|
|
||||||
|
// Place intermediate-line sections
|
||||||
|
if (dirs[d] > 0)
|
||||||
|
for (int i = 1; i < dirs[d]; i++)
|
||||||
|
yield return new Order("PlaceBuilding", Producer.Owner.PlayerActor, world.OffsetCell(topLeft,i,d), Building);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
35
OpenRA.Game/Traits/LineBuild.cs
Normal file
35
OpenRA.Game/Traits/LineBuild.cs
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
#region Copyright & License Information
|
||||||
|
/*
|
||||||
|
* Copyright 2007,2009,2010 Chris Forbes, Robert Pepperell, Matthew Bowra-Dean, Paul Chote, Alli Witheford.
|
||||||
|
* This file is part of OpenRA.
|
||||||
|
*
|
||||||
|
* OpenRA is free software: you can redistribute it and/or modify
|
||||||
|
* it 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.
|
||||||
|
*
|
||||||
|
* OpenRA is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with OpenRA. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using OpenRA.Effects;
|
||||||
|
using OpenRA.GameRules;
|
||||||
|
using OpenRA.Traits.Activities;
|
||||||
|
|
||||||
|
namespace OpenRA.Traits
|
||||||
|
{
|
||||||
|
public class LineBuildInfo : StatelessTraitInfo<LineBuild>
|
||||||
|
{
|
||||||
|
public readonly int Range = 5;
|
||||||
|
}
|
||||||
|
public class LineBuild {}
|
||||||
|
}
|
||||||
@@ -35,8 +35,10 @@ namespace OpenRA.Traits
|
|||||||
var queue = self.traits.Get<ProductionQueue>();
|
var queue = self.traits.Get<ProductionQueue>();
|
||||||
var unit = Rules.Info[ order.TargetString ];
|
var unit = Rules.Info[ order.TargetString ];
|
||||||
var producing = queue.CurrentItem(unit.Category);
|
var producing = queue.CurrentItem(unit.Category);
|
||||||
if( producing == null || producing.Item != order.TargetString || producing.RemainingTime != 0 )
|
|
||||||
return;
|
// Breaks linebuild
|
||||||
|
//if( producing == null || producing.Item != order.TargetString || producing.RemainingTime != 0 )
|
||||||
|
// return;
|
||||||
|
|
||||||
var building = self.World.CreateActor( order.TargetString, order.TargetLocation, order.Player );
|
var building = self.World.CreateActor( order.TargetString, order.TargetLocation, order.Player );
|
||||||
|
|
||||||
|
|||||||
@@ -73,6 +73,45 @@ namespace OpenRA
|
|||||||
? UnitMovementType.Float : UnitMovementType.Wheel ) && !world.Map.ContainsResource( t ) )
|
? UnitMovementType.Float : UnitMovementType.Wheel ) && !world.Map.ContainsResource( t ) )
|
||||||
? buildOk : buildBlocked, Game.CellSize * t, "terrain" );
|
? buildOk : buildBlocked, Game.CellSize * t, "terrain" );
|
||||||
|
|
||||||
|
// Linebuild for walls.
|
||||||
|
// Assumes a 1x1 footprint; weird things will happen for other footprints
|
||||||
|
if (Rules.Info[ name ].Traits.Contains<LineBuildInfo>())
|
||||||
|
{
|
||||||
|
int range = Rules.Info[ name ].Traits.Get<LineBuildInfo>().Range;
|
||||||
|
|
||||||
|
// Start at place location, search outwards
|
||||||
|
// TODO: First make it work, then make it nice
|
||||||
|
int[] dirs = {0,0,0,0};
|
||||||
|
for (int d = 0; d < 4; d++)
|
||||||
|
{
|
||||||
|
for (int i = 1; i < range; i++)
|
||||||
|
{
|
||||||
|
if (dirs[d] != 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
int2 cell = world.OffsetCell(topLeft,i,d);
|
||||||
|
|
||||||
|
if (world.IsCellBuildable(cell, bi.WaterBound ? UnitMovementType.Float : UnitMovementType.Wheel,null))
|
||||||
|
continue; // Cell is empty; continue search
|
||||||
|
|
||||||
|
// Cell contains an actor. Is it the type we want?
|
||||||
|
if (Game.world.Queries.WithTrait<LineBuild>().Any(a => (a.Actor.Info.Name == name && a.Actor.Location.X == cell.X && a.Actor.Location.Y == cell.Y)))
|
||||||
|
dirs[d] = i; // Cell contains actor of correct type
|
||||||
|
else
|
||||||
|
dirs[d] = -1; // Cell is blocked by another actor type
|
||||||
|
}
|
||||||
|
|
||||||
|
// Place intermediate-line sections
|
||||||
|
if (dirs[d] > 0)
|
||||||
|
{
|
||||||
|
for (int i = 1; i < dirs[d]; i++)
|
||||||
|
{
|
||||||
|
int2 cell = world.OffsetCell(topLeft,i,d);
|
||||||
|
spriteRenderer.DrawSprite( world.IsCloseEnoughToBase(world.LocalPlayer, name, bi, cell) ? buildOk : buildBlocked, Game.CellSize * cell, "terrain" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
spriteRenderer.Flush();
|
spriteRenderer.Flush();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#region Copyright & License Information
|
#region Copyright & License Information
|
||||||
/*
|
/*
|
||||||
* Copyright 2007,2009,2010 Chris Forbes, Robert Pepperell, Matthew Bowra-Dean, Paul Chote, Alli Witheford.
|
* Copyright 2007,2009,2010 Chris Forbes, Robert Pepperell, Matthew Bowra-Dean, Paul Chote, Alli Witheford.
|
||||||
* This file is part of OpenRA.
|
* This file is part of OpenRA.
|
||||||
@@ -127,6 +127,26 @@ namespace OpenRA
|
|||||||
.FirstOrDefault();
|
.FirstOrDefault();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static int2 OffsetCell(this World world, int2 cell, int step, int dir)
|
||||||
|
{
|
||||||
|
switch (dir)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
cell.X += step;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
cell.Y += step;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
cell.X -= step;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
cell.Y -= step;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return cell;
|
||||||
|
}
|
||||||
|
|
||||||
public static bool CanPlaceBuilding(this World world, string name, BuildingInfo building, int2 topLeft, Actor toIgnore)
|
public static bool CanPlaceBuilding(this World world, string name, BuildingInfo building, int2 topLeft, Actor toIgnore)
|
||||||
{
|
{
|
||||||
return !Footprint.Tiles(name, building, topLeft).Any(
|
return !Footprint.Tiles(name, building, topLeft).Any(
|
||||||
|
|||||||
@@ -43,6 +43,7 @@
|
|||||||
Building:
|
Building:
|
||||||
Dimensions: 1,1
|
Dimensions: 1,1
|
||||||
Footprint: x
|
Footprint: x
|
||||||
|
BaseNormal: no
|
||||||
BuildSounds: constru2.aud, hvydoor1.aud
|
BuildSounds: constru2.aud, hvydoor1.aud
|
||||||
SellSounds: cashturn.aud
|
SellSounds: cashturn.aud
|
||||||
RenderBuilding:
|
RenderBuilding:
|
||||||
@@ -66,6 +67,7 @@
|
|||||||
Crewed: no
|
Crewed: no
|
||||||
Sight: 0
|
Sight: 0
|
||||||
Wall:
|
Wall:
|
||||||
|
LineBuild:
|
||||||
Selectable:
|
Selectable:
|
||||||
RenderBuildingWall:
|
RenderBuildingWall:
|
||||||
HasMakeAnimation: false
|
HasMakeAnimation: false
|
||||||
|
|||||||
@@ -53,9 +53,11 @@
|
|||||||
BuildSounds: placbldg.aud
|
BuildSounds: placbldg.aud
|
||||||
Capturable: false
|
Capturable: false
|
||||||
Bib: no
|
Bib: no
|
||||||
|
BaseNormal: no
|
||||||
Crewed: no
|
Crewed: no
|
||||||
Sight: 0
|
Sight: 0
|
||||||
Wall:
|
Wall:
|
||||||
|
LineBuild:
|
||||||
Selectable:
|
Selectable:
|
||||||
RenderBuildingWall:
|
RenderBuildingWall:
|
||||||
HasMakeAnimation: false
|
HasMakeAnimation: false
|
||||||
|
|||||||
Reference in New Issue
Block a user