Now checking AcceptsSmudgeType for all cells to smudge and picking appropriate SmudgeLayer to render with.
This commit is contained in:
@@ -49,49 +49,50 @@ namespace OpenRA.Mods.RA
|
|||||||
|
|
||||||
Sound.Play(GetImpactSound(warhead, isWater), args.dest);
|
Sound.Play(GetImpactSound(warhead, isWater), args.dest);
|
||||||
|
|
||||||
var smudgeType = world.GetTerrainInfo(targetTile).AcceptsSmudgeType
|
var smudgeLayers = world.WorldActor.TraitsImplementing<SmudgeLayer>().ToDictionary(x => x.Info.Type);
|
||||||
.FirstOrDefault(t => warhead.SmudgeType.Contains(t));
|
|
||||||
|
|
||||||
if (smudgeType != null)
|
if (warhead.Size[0] > 0)
|
||||||
{
|
{
|
||||||
var smudgeLayer = world.WorldActor.TraitsImplementing<SmudgeLayer>()
|
var resLayer = world.WorldActor.Trait<ResourceLayer>();
|
||||||
.FirstOrDefault(x => x.Info.Type == smudgeType);
|
var allCells = world.FindTilesInCircle(targetTile, warhead.Size[0]).ToList();
|
||||||
if (smudgeLayer == null)
|
|
||||||
throw new NotImplementedException("Unknown smudge type `{0}`".F(smudgeType));
|
|
||||||
|
|
||||||
if (warhead.Size[0] > 0)
|
// `smudgeCells` might want to just be an outer shell of the cells:
|
||||||
|
IEnumerable<CPos> smudgeCells = allCells;
|
||||||
|
if (warhead.Size.Length == 2)
|
||||||
|
smudgeCells = smudgeCells.Except(world.FindTilesInCircle(targetTile, warhead.Size[1]));
|
||||||
|
|
||||||
|
// Draw the smudges:
|
||||||
|
foreach (var sc in smudgeCells)
|
||||||
{
|
{
|
||||||
var resLayer = world.WorldActor.Trait<ResourceLayer>();
|
var smudgeType = world.GetTerrainInfo(sc).AcceptsSmudgeType.FirstOrDefault(t => warhead.SmudgeType.Contains(t));
|
||||||
var allCells = world.FindTilesInCircle(targetTile, warhead.Size[0]).ToList();
|
if (smudgeType == null) continue;
|
||||||
|
|
||||||
// `smudgeCells` might want to just be an outer shell of the cells:
|
SmudgeLayer smudgeLayer;
|
||||||
IEnumerable<CPos> smudgeCells = allCells;
|
if (!smudgeLayers.TryGetValue(smudgeType, out smudgeLayer))
|
||||||
if (warhead.Size.Length == 2)
|
throw new NotImplementedException("Unknown smudge type `{0}`".F(smudgeType));
|
||||||
smudgeCells = smudgeCells.Except(world.FindTilesInCircle(targetTile, warhead.Size[1]));
|
|
||||||
|
|
||||||
// Draw the smudges:
|
smudgeLayer.AddSmudge(sc);
|
||||||
foreach (var sc in smudgeCells)
|
if (warhead.Ore)
|
||||||
{
|
resLayer.Destroy(sc);
|
||||||
// Water doesn't get scorched/smudged, it just gets superheated =P.
|
|
||||||
if (world.GetTerrainInfo(sc).IsWater) continue;
|
|
||||||
|
|
||||||
smudgeLayer.AddSmudge(sc);
|
|
||||||
if (warhead.Ore)
|
|
||||||
resLayer.Destroy(sc);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Destroy all resources in range, not just the outer shell:
|
|
||||||
foreach (var cell in allCells)
|
|
||||||
{
|
|
||||||
if (warhead.Ore)
|
|
||||||
resLayer.Destroy(cell);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
// Destroy all resources in range, not just the outer shell:
|
||||||
|
foreach (var cell in allCells)
|
||||||
{
|
{
|
||||||
// Don't smudge water (if this ever happens):
|
if (warhead.Ore)
|
||||||
if (!world.GetTerrainInfo(targetTile).IsWater)
|
resLayer.Destroy(cell);
|
||||||
smudgeLayer.AddSmudge(targetTile);
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var smudgeType = world.GetTerrainInfo(targetTile).AcceptsSmudgeType.FirstOrDefault(t => warhead.SmudgeType.Contains(t));
|
||||||
|
if (smudgeType != null)
|
||||||
|
{
|
||||||
|
SmudgeLayer smudgeLayer;
|
||||||
|
if (!smudgeLayers.TryGetValue(smudgeType, out smudgeLayer))
|
||||||
|
throw new NotImplementedException("Unknown smudge type `{0}`".F(smudgeType));
|
||||||
|
|
||||||
|
smudgeLayer.AddSmudge(targetTile);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user