Move shrouded/revealed tile calculation outside Shroud.
This commit is contained in:
@@ -32,6 +32,13 @@ namespace OpenRA.Traits
|
|||||||
lobbyShroudFogDisabled = !self.World.LobbyInfo.GlobalSettings.Shroud && !self.World.LobbyInfo.GlobalSettings.Fog;
|
lobbyShroudFogDisabled = !self.World.LobbyInfo.GlobalSettings.Shroud && !self.World.LobbyInfo.GlobalSettings.Fog;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CPos[] ShroudedTiles(Actor self)
|
||||||
|
{
|
||||||
|
return Shroud.GetVisOrigins(self)
|
||||||
|
.SelectMany(o => Shroud.FindVisibleTiles(self.World, o, Range))
|
||||||
|
.Distinct().ToArray();
|
||||||
|
}
|
||||||
|
|
||||||
public void Tick(Actor self)
|
public void Tick(Actor self)
|
||||||
{
|
{
|
||||||
if (lobbyShroudFogDisabled)
|
if (lobbyShroudFogDisabled)
|
||||||
@@ -43,20 +50,20 @@ namespace OpenRA.Traits
|
|||||||
cachedLocation = self.Location;
|
cachedLocation = self.Location;
|
||||||
cachedDisabled = disabled;
|
cachedDisabled = disabled;
|
||||||
|
|
||||||
CPos[] shrouded = null;
|
var shrouded = ShroudedTiles(self);
|
||||||
foreach (var p in self.World.Players)
|
foreach (var p in self.World.Players)
|
||||||
{
|
{
|
||||||
p.Shroud.RemoveShroudGeneration(self);
|
p.Shroud.RemoveShroudGeneration(self);
|
||||||
p.Shroud.AddShroudGeneration(self, ref shrouded);
|
p.Shroud.AddShroudGeneration(self, shrouded);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void AddedToWorld(Actor self)
|
public void AddedToWorld(Actor self)
|
||||||
{
|
{
|
||||||
CPos[] shrouded = null;
|
var shrouded = ShroudedTiles(self);
|
||||||
foreach (var p in self.World.Players)
|
foreach (var p in self.World.Players)
|
||||||
p.Shroud.AddShroudGeneration(self, ref shrouded);
|
p.Shroud.AddShroudGeneration(self, shrouded);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RemovedFromWorld(Actor self)
|
public void RemovedFromWorld(Actor self)
|
||||||
|
|||||||
@@ -31,6 +31,13 @@ namespace OpenRA.Traits
|
|||||||
lobbyShroudFogDisabled = !self.World.LobbyInfo.GlobalSettings.Shroud && !self.World.LobbyInfo.GlobalSettings.Fog;
|
lobbyShroudFogDisabled = !self.World.LobbyInfo.GlobalSettings.Shroud && !self.World.LobbyInfo.GlobalSettings.Fog;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CPos[] VisibleTiles(Actor self)
|
||||||
|
{
|
||||||
|
return Shroud.GetVisOrigins(self)
|
||||||
|
.SelectMany(o => Shroud.FindVisibleTiles(self.World, o, Range))
|
||||||
|
.Distinct().ToArray();
|
||||||
|
}
|
||||||
|
|
||||||
public void Tick(Actor self)
|
public void Tick(Actor self)
|
||||||
{
|
{
|
||||||
if (lobbyShroudFogDisabled)
|
if (lobbyShroudFogDisabled)
|
||||||
@@ -40,20 +47,20 @@ namespace OpenRA.Traits
|
|||||||
{
|
{
|
||||||
cachedLocation = self.Location;
|
cachedLocation = self.Location;
|
||||||
|
|
||||||
CPos[] visible = null;
|
var visible = VisibleTiles(self);
|
||||||
foreach (var p in self.World.Players)
|
foreach (var p in self.World.Players)
|
||||||
{
|
{
|
||||||
p.Shroud.RemoveVisibility(self);
|
p.Shroud.RemoveVisibility(self);
|
||||||
p.Shroud.AddVisibility(self, ref visible);
|
p.Shroud.AddVisibility(self, visible);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void AddedToWorld(Actor self)
|
public void AddedToWorld(Actor self)
|
||||||
{
|
{
|
||||||
CPos[] visible = null;
|
var visible = VisibleTiles(self);
|
||||||
foreach (var p in self.World.Players)
|
foreach (var p in self.World.Players)
|
||||||
p.Shroud.AddVisibility(self, ref visible);
|
p.Shroud.AddVisibility(self, visible);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RemovedFromWorld(Actor self)
|
public void RemovedFromWorld(Actor self)
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ namespace OpenRA.Traits
|
|||||||
return GetVisOrigins(actor).SelectMany(o => FindVisibleTiles(actor.World, o, range)).Distinct().ToArray();
|
return GetVisOrigins(actor).SelectMany(o => FindVisibleTiles(actor.World, o, range)).Distinct().ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
static IEnumerable<CPos> FindVisibleTiles(World world, CPos position, WRange radius)
|
public static IEnumerable<CPos> FindVisibleTiles(World world, CPos position, WRange radius)
|
||||||
{
|
{
|
||||||
var map = world.Map;
|
var map = world.Map;
|
||||||
var r = (radius.Range + 1023) / 1024;
|
var r = (radius.Range + 1023) / 1024;
|
||||||
@@ -89,15 +89,11 @@ namespace OpenRA.Traits
|
|||||||
yield return cell;
|
yield return cell;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void AddVisibility(Actor a, ref CPos[] visible)
|
public void AddVisibility(Actor a, CPos[] visible)
|
||||||
{
|
{
|
||||||
var rs = a.TraitOrDefault<RevealsShroud>();
|
if (!a.Owner.IsAlliedWith(self.Owner))
|
||||||
if (rs == null || !a.Owner.IsAlliedWith(self.Owner) || rs.Range == WRange.Zero)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Lazily generate the visible tiles, allowing the caller to re-use them if desired.
|
|
||||||
visible = visible ?? FindVisibleTiles(a, rs.Range);
|
|
||||||
|
|
||||||
foreach (var c in visible)
|
foreach (var c in visible)
|
||||||
{
|
{
|
||||||
var uv = c.ToMPos(map);
|
var uv = c.ToMPos(map);
|
||||||
@@ -134,15 +130,11 @@ namespace OpenRA.Traits
|
|||||||
Invalidate(visible);
|
Invalidate(visible);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void AddShroudGeneration(Actor a, ref CPos[] shrouded)
|
public void AddShroudGeneration(Actor a, CPos[] shrouded)
|
||||||
{
|
{
|
||||||
var cs = a.TraitOrDefault<CreatesShroud>();
|
if (a.Owner.IsAlliedWith(self.Owner))
|
||||||
if (cs == null || a.Owner.IsAlliedWith(self.Owner) || cs.Range == WRange.Zero)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Lazily generate the shrouded tiles, allowing the caller to re-use them if desired.
|
|
||||||
shrouded = shrouded ?? FindVisibleTiles(a, cs.Range);
|
|
||||||
|
|
||||||
foreach (var c in shrouded)
|
foreach (var c in shrouded)
|
||||||
generatedShroudCount[c]++;
|
generatedShroudCount[c]++;
|
||||||
|
|
||||||
@@ -177,10 +169,17 @@ namespace OpenRA.Traits
|
|||||||
CPos[] shrouded = null;
|
CPos[] shrouded = null;
|
||||||
foreach (var p in self.World.Players)
|
foreach (var p in self.World.Players)
|
||||||
{
|
{
|
||||||
p.Shroud.RemoveVisibility(self);
|
if (p.Shroud.visibility.TryGetValue(self, out visible))
|
||||||
p.Shroud.AddVisibility(self, ref visible);
|
{
|
||||||
p.Shroud.RemoveShroudGeneration(self);
|
p.Shroud.RemoveVisibility(self);
|
||||||
p.Shroud.AddShroudGeneration(self, ref shrouded);
|
p.Shroud.AddVisibility(self, visible);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (p.Shroud.generation.TryGetValue(self, out shrouded))
|
||||||
|
{
|
||||||
|
p.Shroud.RemoveShroudGeneration(self);
|
||||||
|
p.Shroud.AddShroudGeneration(self, shrouded);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user