Separated resource rendering into another trait
This commit is contained in:
@@ -126,7 +126,7 @@ namespace OpenRA.Mods.D2k.Traits
|
||||
|
||||
for (var i = 0; i < pieces; i++)
|
||||
{
|
||||
var cell = cells.SkipWhile(p => resLayer.GetResource(p) == resType && resLayer.IsFull(p)).Cast<CPos?>().RandomOrDefault(self.World.SharedRandom);
|
||||
var cell = cells.SkipWhile(p => resLayer.GetResourceType(p) == resType && resLayer.IsFull(p)).Cast<CPos?>().RandomOrDefault(self.World.SharedRandom);
|
||||
if (cell == null)
|
||||
cell = cells.Random(self.World.SharedRandom);
|
||||
|
||||
|
||||
@@ -15,8 +15,7 @@ using OpenRA.Traits;
|
||||
|
||||
namespace OpenRA.Mods.D2k.Traits
|
||||
{
|
||||
using CellContents = D2kResourceLayer.CellContents;
|
||||
using ClearSides = D2kResourceLayer.ClearSides;
|
||||
using ClearSides = D2kResourceRenderer.ClearSides;
|
||||
|
||||
[Desc("Used to render spice with round borders.")]
|
||||
public class D2kEditorResourceLayerInfo : EditorResourceLayerInfo
|
||||
@@ -29,7 +28,7 @@ namespace OpenRA.Mods.D2k.Traits
|
||||
public D2kEditorResourceLayer(Actor self)
|
||||
: base(self) { }
|
||||
|
||||
public override CellContents UpdateDirtyTile(CPos c)
|
||||
public override EditorCellContents UpdateDirtyTile(CPos c)
|
||||
{
|
||||
var t = Tiles[c];
|
||||
|
||||
@@ -50,11 +49,11 @@ namespace OpenRA.Mods.D2k.Traits
|
||||
var clear = FindClearSides(t.Type, c);
|
||||
if (clear == ClearSides.None)
|
||||
{
|
||||
var sprites = D2kResourceLayer.Variants[t.Variant];
|
||||
var sprites = D2kResourceRenderer.Variants[t.Variant];
|
||||
var frame = t.Density > t.Type.Info.MaxDensity / 2 ? 1 : 0;
|
||||
t.Sprite = t.Type.Variants.First().Value[sprites[frame]];
|
||||
}
|
||||
else if (D2kResourceLayer.SpriteMap.TryGetValue(clear, out index))
|
||||
else if (D2kResourceRenderer.SpriteMap.TryGetValue(clear, out index))
|
||||
t.Sprite = t.Type.Variants.First().Value[index];
|
||||
else
|
||||
t.Sprite = null;
|
||||
@@ -64,7 +63,7 @@ namespace OpenRA.Mods.D2k.Traits
|
||||
|
||||
protected override string ChooseRandomVariant(ResourceType t)
|
||||
{
|
||||
return D2kResourceLayer.Variants.Keys.Random(Game.CosmeticRandom);
|
||||
return D2kResourceRenderer.Variants.Keys.Random(Game.CosmeticRandom);
|
||||
}
|
||||
|
||||
bool CellContains(CPos c, ResourceType t)
|
||||
|
||||
@@ -13,17 +13,16 @@ using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using OpenRA.Mods.Common.Traits;
|
||||
using OpenRA.Traits;
|
||||
|
||||
namespace OpenRA.Mods.D2k.Traits
|
||||
{
|
||||
[Desc("Used to render spice with round borders.")]
|
||||
public class D2kResourceLayerInfo : ResourceLayerInfo
|
||||
[Desc("Used to render spice with round borders.", "Attach this to the world actor")]
|
||||
public class D2kResourceRendererInfo : ResourceRendererInfo
|
||||
{
|
||||
public override object Create(ActorInitializer init) { return new D2kResourceLayer(init.Self); }
|
||||
public override object Create(ActorInitializer init) { return new D2kResourceRenderer(init.Self, this); }
|
||||
}
|
||||
|
||||
public class D2kResourceLayer : ResourceLayer
|
||||
public class D2kResourceRenderer : ResourceRenderer
|
||||
{
|
||||
[Flags]
|
||||
public enum ClearSides : byte
|
||||
@@ -101,8 +100,8 @@ namespace OpenRA.Mods.D2k.Traits
|
||||
{ ClearSides.Bottom | ClearSides.TopLeft | ClearSides.BottomLeft | ClearSides.BottomRight, 49 },
|
||||
};
|
||||
|
||||
public D2kResourceLayer(Actor self)
|
||||
: base(self) { }
|
||||
public D2kResourceRenderer(Actor self, D2kResourceRendererInfo info)
|
||||
: base(self, info) { }
|
||||
|
||||
bool CellContains(CPos c, ResourceType t)
|
||||
{
|
||||
@@ -139,46 +138,52 @@ namespace OpenRA.Mods.D2k.Traits
|
||||
return ret;
|
||||
}
|
||||
|
||||
void UpdateRenderedTileInner(CPos p)
|
||||
protected override void UpdateRenderedSprite(CPos cell, RendererCellContents content)
|
||||
{
|
||||
if (!RenderContent.Contains(p))
|
||||
return;
|
||||
UpdateRenderedSpriteInner(cell, content);
|
||||
|
||||
var t = RenderContent[p];
|
||||
if (t.Density > 0)
|
||||
var directions = CVec.Directions;
|
||||
for (var i = 0; i < directions.Length; i++)
|
||||
UpdateRenderedSpriteInner(cell + directions[i]);
|
||||
}
|
||||
|
||||
void UpdateRenderedSpriteInner(CPos cell)
|
||||
{
|
||||
UpdateRenderedSpriteInner(cell, RenderContent[cell]);
|
||||
}
|
||||
|
||||
void UpdateRenderedSpriteInner(CPos cell, RendererCellContents content)
|
||||
{
|
||||
var density = content.Density;
|
||||
var renderType = content.Type;
|
||||
|
||||
if (density > 0 && renderType != null)
|
||||
{
|
||||
var clear = FindClearSides(t.Type, p);
|
||||
// The call chain for this method (that starts with AddDirtyCell()) guarantees
|
||||
// that the new content type would still be suitable for this renderer,
|
||||
// but that is a bit too fragile to rely on in case the code starts changing.
|
||||
if (!Info.RenderTypes.Contains(renderType.Info.Type))
|
||||
return;
|
||||
|
||||
var clear = FindClearSides(renderType, cell);
|
||||
int index;
|
||||
|
||||
if (clear == ClearSides.None)
|
||||
{
|
||||
var sprites = Variants[t.Variant];
|
||||
var frame = t.Density > t.Type.Info.MaxDensity / 2 ? 1 : 0;
|
||||
t.Sprite = t.Type.Variants.First().Value[sprites[frame]];
|
||||
var sprites = Variants[content.Variant];
|
||||
var frame = density > ResourceLayer.GetMaxResourceDensity(cell) / 2 ? 1 : 0;
|
||||
|
||||
UpdateSpriteLayers(cell, renderType.Variants.First().Value[sprites[frame]], renderType.Palette);
|
||||
}
|
||||
else if (SpriteMap.TryGetValue(clear, out index))
|
||||
t.Sprite = t.Type.Variants.First().Value[index];
|
||||
{
|
||||
UpdateSpriteLayers(cell, renderType.Variants.First().Value[index], renderType.Palette);
|
||||
}
|
||||
else
|
||||
t.Sprite = null;
|
||||
throw new InvalidOperationException("SpriteMap does not contain an index for ClearSides type '{0}'".F(clear));
|
||||
}
|
||||
else
|
||||
t.Sprite = null;
|
||||
|
||||
RenderContent[p] = t;
|
||||
}
|
||||
|
||||
protected override void UpdateRenderedSprite(CPos p)
|
||||
{
|
||||
// Need to update neighbouring tiles too
|
||||
UpdateRenderedTileInner(p);
|
||||
UpdateRenderedTileInner(p + new CVec(-1, -1));
|
||||
UpdateRenderedTileInner(p + new CVec(0, -1));
|
||||
UpdateRenderedTileInner(p + new CVec(1, -1));
|
||||
UpdateRenderedTileInner(p + new CVec(-1, 0));
|
||||
UpdateRenderedTileInner(p + new CVec(1, 0));
|
||||
UpdateRenderedTileInner(p + new CVec(-1, 1));
|
||||
UpdateRenderedTileInner(p + new CVec(0, 1));
|
||||
UpdateRenderedTileInner(p + new CVec(1, 1));
|
||||
UpdateSpriteLayers(cell, null, null);
|
||||
}
|
||||
|
||||
protected override string ChooseRandomVariant(ResourceType t)
|
||||
Reference in New Issue
Block a user