Skip to content

Commit

Permalink
split sprite-based and line-based things in Selectable into two traits
Browse files Browse the repository at this point in the history
  • Loading branch information
chrisforbes committed Oct 22, 2011
1 parent 4168e54 commit b9ac25e
Show file tree
Hide file tree
Showing 5 changed files with 134 additions and 85 deletions.
1 change: 1 addition & 0 deletions OpenRA.Game/OpenRA.Game.csproj
Expand Up @@ -205,6 +205,7 @@
<Compile Include="Widgets\ListLayout.cs" />
<Compile Include="Widgets\GridLayout.cs" />
<Compile Include="Network\Replay.cs" />
<Compile Include="Traits\SelectionDecorations.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\OpenRA.FileFormats\OpenRA.FileFormats.csproj">
Expand Down
86 changes: 1 addition & 85 deletions OpenRA.Game/Traits/Selectable.cs
Expand Up @@ -23,10 +23,6 @@ public class SelectableInfo : TraitInfo<Selectable>

public class Selectable : IPostRenderSelection
{
// depends on the order of pips in TraitsInterfaces.cs!
static readonly string[] pipStrings = { "pip-empty", "pip-green", "pip-yellow", "pip-red", "pip-gray", "pip-blue" };
static readonly string[] tagStrings = { "", "tag-fake", "tag-primary" };

public void RenderAfterWorld (WorldRenderer wr, Actor self)
{
var bounds = self.Bounds.Value;
Expand All @@ -37,11 +33,8 @@ public void RenderAfterWorld (WorldRenderer wr, Actor self)

wr.DrawSelectionBox(self, Color.White);
DrawHealthBar(self, xy, Xy);
DrawControlGroup(wr, self, xy);
DrawPips(wr, self, xY);
DrawTags(wr, self, new float2(.5f * (bounds.Left + bounds.Right), bounds.Top));
DrawUnitPath(self);
DrawExtraBars(self, xy, Xy);
DrawUnitPath(self);
}

public void DrawRollover(WorldRenderer wr, Actor self)
Expand Down Expand Up @@ -138,83 +131,6 @@ void DrawHealthBar(Actor self, float2 xy, float2 Xy)
}
}

void DrawControlGroup(WorldRenderer wr, Actor self, float2 basePosition)
{
var group = self.World.Selection.GetControlGroupForActor(self);
if (group == null) return;

var pipImages = new Animation("pips");
pipImages.PlayFetchIndex("groups", () => (int)group);
pipImages.Tick();
pipImages.Image.DrawAt(wr, basePosition + new float2(-8, 1), "chrome");
}

void DrawPips(WorldRenderer wr, Actor self, float2 basePosition)
{
if (self.Owner != self.World.LocalPlayer) return;

var pipSources = self.TraitsImplementing<IPips>();
if (pipSources.Count() == 0)
return;

var pipImages = new Animation("pips");
pipImages.PlayRepeating(pipStrings[0]);

var pipSize = pipImages.Image.size;
var pipxyBase = basePosition + new float2(1, -pipSize.Y);
var pipxyOffset = new float2(0, 0); // Correct for offset due to multiple columns/rows

foreach (var pips in pipSources)
{
var thisRow = pips.GetPips(self);
if (thisRow == null)
continue;

var width = self.Bounds.Value.Width;

foreach (var pip in thisRow)
{
if (pipxyOffset.X + pipSize.X >= width)
{
pipxyOffset.X = 0;
pipxyOffset.Y -= pipSize.Y;
}
pipImages.PlayRepeating(pipStrings[(int)pip]);
pipImages.Image.DrawAt(wr, pipxyBase + pipxyOffset, "chrome");
pipxyOffset += new float2(pipSize.X, 0);
}

// Increment row
pipxyOffset.X = 0;
pipxyOffset.Y -= pipSize.Y + 1;
}
}

void DrawTags(WorldRenderer wr, Actor self, float2 basePosition)
{
if (self.Owner != self.World.LocalPlayer) return;

// If a mod wants to implement a unit with multiple tags, then they are placed on multiple rows
var tagxyBase = basePosition + new float2(-16, 2); // Correct for the offset in the shp file
var tagxyOffset = new float2(0, 0); // Correct for offset due to multiple rows

foreach (var tags in self.TraitsImplementing<ITags>())
{
foreach (var tag in tags.GetTags())
{
if (tag == TagType.None)
continue;

var tagImages = new Animation("pips");
tagImages.PlayRepeating(tagStrings[(int)tag]);
tagImages.Image.DrawAt(wr, tagxyBase + tagxyOffset, "chrome");

// Increment row
tagxyOffset.Y += 8;
}
}
}

void DrawUnitPath(Actor self)
{
if (self.World.LocalPlayer == null ||!self.World.LocalPlayer.PlayerActor.Trait<DeveloperMode>().PathDebug) return;
Expand Down
116 changes: 116 additions & 0 deletions OpenRA.Game/Traits/SelectionDecorations.cs
@@ -0,0 +1,116 @@
#region Copyright & License Information
/*
* Copyright 2007-2011 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.Drawing;
using System.Linq;
using OpenRA.Graphics;

namespace OpenRA.Traits
{
public class SelectionDecorationsInfo : TraitInfo<SelectionDecorations> {}

public class SelectionDecorations : IPostRenderSelection
{
// depends on the order of pips in TraitsInterfaces.cs!
static readonly string[] pipStrings = { "pip-empty", "pip-green", "pip-yellow", "pip-red", "pip-gray", "pip-blue" };
static readonly string[] tagStrings = { "", "tag-fake", "tag-primary" };

public void RenderAfterWorld (WorldRenderer wr, Actor self)
{
var bounds = self.Bounds.Value;

var xy = new float2(bounds.Left, bounds.Top);
var xY = new float2(bounds.Left, bounds.Bottom);

DrawControlGroup(wr, self, xy);
DrawPips(wr, self, xY);
DrawTags(wr, self, new float2(.5f * (bounds.Left + bounds.Right), bounds.Top));
}

void DrawControlGroup(WorldRenderer wr, Actor self, float2 basePosition)
{
var group = self.World.Selection.GetControlGroupForActor(self);
if (group == null) return;

var pipImages = new Animation("pips");
pipImages.PlayFetchIndex("groups", () => (int)group);
pipImages.Tick();
pipImages.Image.DrawAt(wr, basePosition + new float2(-8, 1), "chrome");
}

void DrawPips(WorldRenderer wr, Actor self, float2 basePosition)
{
if (self.Owner != self.World.LocalPlayer) return;

var pipSources = self.TraitsImplementing<IPips>();
if (pipSources.Count() == 0)
return;

var pipImages = new Animation("pips");
pipImages.PlayRepeating(pipStrings[0]);

var pipSize = pipImages.Image.size;
var pipxyBase = basePosition + new float2(1, -pipSize.Y);
var pipxyOffset = new float2(0, 0); // Correct for offset due to multiple columns/rows

foreach (var pips in pipSources)
{
var thisRow = pips.GetPips(self);
if (thisRow == null)
continue;

var width = self.Bounds.Value.Width;

foreach (var pip in thisRow)
{
if (pipxyOffset.X + pipSize.X >= width)
{
pipxyOffset.X = 0;
pipxyOffset.Y -= pipSize.Y;
}
pipImages.PlayRepeating(pipStrings[(int)pip]);
pipImages.Image.DrawAt(wr, pipxyBase + pipxyOffset, "chrome");
pipxyOffset += new float2(pipSize.X, 0);
}

// Increment row
pipxyOffset.X = 0;
pipxyOffset.Y -= pipSize.Y + 1;
}
}

void DrawTags(WorldRenderer wr, Actor self, float2 basePosition)
{
if (self.Owner != self.World.LocalPlayer) return;

// If a mod wants to implement a unit with multiple tags, then they are placed on multiple rows
var tagxyBase = basePosition + new float2(-16, 2); // Correct for the offset in the shp file
var tagxyOffset = new float2(0, 0); // Correct for offset due to multiple rows

foreach (var tags in self.TraitsImplementing<ITags>())
{
foreach (var tag in tags.GetTags())
{
if (tag == TagType.None)
continue;

var tagImages = new Animation("pips");
tagImages.PlayRepeating(tagStrings[(int)tag]);
tagImages.Image.DrawAt(wr, tagxyBase + tagxyOffset, "chrome");

// Increment row
tagxyOffset.Y += 8;
}
}
}

}
}

9 changes: 9 additions & 0 deletions mods/cnc/rules/defaults.yaml
Expand Up @@ -10,6 +10,7 @@
BlueTiberium: 40
Beach: 40
ROT: 5
SelectionDecorations:
Selectable:
Voice: VehicleVoice
TargetableUnit:
Expand Down Expand Up @@ -43,6 +44,7 @@
BlueTiberium: 70
Beach: 70
ROT: 5
SelectionDecorations:
Selectable:
Voice: VehicleVoice
TargetableUnit:
Expand All @@ -69,6 +71,7 @@
UseLocation: yes
TargetableUnit:
TargetTypes: Air
SelectionDecorations:
Selectable:
Voice: VehicleVoice
Helicopter:
Expand Down Expand Up @@ -106,6 +109,7 @@
BlueTiberium: 70
PathingCost: 1000
Beach: 80
SelectionDecorations:
Selectable:
Voice: GenericVoice
TargetableUnit:
Expand Down Expand Up @@ -135,6 +139,7 @@
-TakeCover:
-RenderInfantryProne:
AppearsOnRadar:
SelectionDecorations:
Selectable:
Voice: CivilianMaleVoice
Bounds: 12,17,0,-9
Expand Down Expand Up @@ -162,6 +167,7 @@
^Plane:
AppearsOnRadar:
UseLocation: yes
SelectionDecorations:
Selectable:
Voice: GenericVoice
TargetableUnit:
Expand All @@ -179,6 +185,7 @@
Crushes: crate
TerrainSpeeds:
Water: 100
SelectionDecorations:
Selectable:
Voice: GenericVoice
TargetableUnit:
Expand All @@ -193,6 +200,7 @@

^Building:
AppearsOnRadar:
SelectionDecorations:
Selectable:
Priority: 3
TargetableBuilding:
Expand Down Expand Up @@ -304,6 +312,7 @@
CrushSound: sandbag2.aud
LineBuild:
Range: 8
SelectionDecorations:
Selectable:
Priority: 1
RenderBuildingWall:
Expand Down
7 changes: 7 additions & 0 deletions mods/ra/rules/defaults.yaml
Expand Up @@ -9,6 +9,7 @@
Ore: 70
Beach: 40
ROT: 5
SelectionDecorations:
Selectable:
Voice: VehicleVoice
TargetableUnit:
Expand Down Expand Up @@ -43,6 +44,7 @@
Ore: 70
Beach: 70
ROT: 5
SelectionDecorations:
Selectable:
Voice: VehicleVoice
TargetableUnit:
Expand Down Expand Up @@ -83,6 +85,7 @@
Road: 100
Ore: 80
Beach: 80
SelectionDecorations:
Selectable:
Voice: GenericVoice
TargetableUnit:
Expand Down Expand Up @@ -115,6 +118,7 @@
Crushes: crate
TerrainSpeeds:
Water: 100
SelectionDecorations:
Selectable:
Voice: ShipVoice
TargetableUnit:
Expand All @@ -138,6 +142,7 @@
^Plane:
AppearsOnRadar:
UseLocation: yes
SelectionDecorations:
Selectable:
Voice: GenericVoice
TargetableAircraft:
Expand Down Expand Up @@ -169,6 +174,7 @@

^Building:
AppearsOnRadar:
SelectionDecorations:
Selectable:
Priority: 3
TargetableBuilding:
Expand Down Expand Up @@ -216,6 +222,7 @@
CrushClasses: wall
LineBuild:
Range: 8
SelectionDecorations:
Selectable:
Priority: 1
TargetableBuilding:
Expand Down

0 comments on commit b9ac25e

Please sign in to comment.