forked from OpenRA/OpenRA
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
split sprite-based and line-based things in Selectable into two traits
- Loading branch information
1 parent
4168e54
commit b9ac25e
Showing
5 changed files
with
134 additions
and
85 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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; | ||
} | ||
} | ||
} | ||
|
||
} | ||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters