Merge pull request #3583 from pchote/omg-more-world-coords
More world coordinates
This commit is contained in:
@@ -27,6 +27,9 @@ namespace OpenRA
|
||||
public static WRange operator +(WRange a, WRange b) { return new WRange(a.Range + b.Range); }
|
||||
public static WRange operator -(WRange a, WRange b) { return new WRange(a.Range - b.Range); }
|
||||
public static WRange operator -(WRange a) { return new WRange(-a.Range); }
|
||||
public static WRange operator /(WRange a, int b) { return new WRange(a.Range / b); }
|
||||
public static WRange operator *(WRange a, int b) { return new WRange(a.Range * b); }
|
||||
public static WRange operator *(int a, WRange b) { return new WRange(a * b.Range); }
|
||||
|
||||
public static bool operator ==(WRange me, WRange other) { return (me.Range == other.Range); }
|
||||
public static bool operator !=(WRange me, WRange other) { return !(me == other); }
|
||||
|
||||
@@ -41,7 +41,9 @@ namespace OpenRA
|
||||
public int2 ToInt2() { return new int2(X, Y); }
|
||||
public PPos ToPPos() { return new PPos(Game.CellSize * X, Game.CellSize * Y); }
|
||||
|
||||
public WPos CenterPosition { get { return new WPos(1024*X + 512, 1024*Y + 512, 0); } }
|
||||
public WPos CenterPosition { get { return new WPos(1024 * X + 512, 1024 * Y + 512, 0); } }
|
||||
public WPos TopLeft { get { return new WPos(1024 * X, 1024 * Y, 0); } }
|
||||
public WPos BottomRight { get { return new WPos(1024 * X + 1023, 1024 * Y + 1023, 0); } }
|
||||
|
||||
public CPos Clamp(Rectangle r)
|
||||
{
|
||||
|
||||
@@ -73,9 +73,9 @@ namespace OpenRA.Graphics
|
||||
var bounds = Game.viewport.WorldBounds(world);
|
||||
var comparer = new RenderableComparer(this);
|
||||
|
||||
var actors = world.FindUnits(
|
||||
bounds.TopLeftAsCPos().ToPPos(),
|
||||
bounds.BottomRightAsCPos().ToPPos());
|
||||
var actors = world.FindActorsInBox(
|
||||
bounds.TopLeftAsCPos(),
|
||||
bounds.BottomRightAsCPos());
|
||||
|
||||
var worldRenderables = actors.SelectMany(a => a.Render(this))
|
||||
.OrderBy(r => r, comparer);
|
||||
|
||||
@@ -14,47 +14,50 @@ using System.Linq;
|
||||
|
||||
namespace OpenRA.Traits
|
||||
{
|
||||
class ScreenShakerInfo : TraitInfo<ScreenShaker> {}
|
||||
public class ScreenShakerInfo : TraitInfo<ScreenShaker> { }
|
||||
|
||||
public class ScreenShaker : ITick
|
||||
{
|
||||
int ticks = 0;
|
||||
List<ShakeEffect> shakeEffects = new List<ShakeEffect>();
|
||||
int ticks = 0;
|
||||
|
||||
public void Tick (Actor self)
|
||||
public void Tick(Actor self)
|
||||
{
|
||||
if(shakeEffects.Any())
|
||||
if (shakeEffects.Any())
|
||||
{
|
||||
Game.viewport.Scroll(GetScrollOffset(), true);
|
||||
shakeEffects.RemoveAll(t => t.ExpiryTime == ticks);
|
||||
}
|
||||
|
||||
ticks++;
|
||||
}
|
||||
|
||||
public void AddEffect(int time, float2 position, int intensity)
|
||||
public void AddEffect(int time, WPos position, int intensity)
|
||||
{
|
||||
shakeEffects.Add(new ShakeEffect { ExpiryTime = ticks + time, Position = position, Intensity = intensity });
|
||||
}
|
||||
|
||||
float2 GetScrollOffset()
|
||||
{
|
||||
int xFreq = 4;
|
||||
int yFreq = 5;
|
||||
|
||||
return GetIntensity() * new float2(
|
||||
(float) Math.Sin((ticks*2*Math.PI)/xFreq) ,
|
||||
(float) Math.Cos((ticks*2*Math.PI)/yFreq));
|
||||
(float)Math.Sin((ticks * 2 * Math.PI) / 4),
|
||||
(float)Math.Cos((ticks * 2 * Math.PI) / 5));
|
||||
}
|
||||
|
||||
float GetIntensity()
|
||||
{
|
||||
var cp = Game.viewport.CenterLocation;
|
||||
var intensity = Game.CellSize * Game.CellSize * 100 * shakeEffects.Sum(
|
||||
e => e.Intensity / (e.Position - cp).LengthSquared);
|
||||
var cp = ((PPos)Game.viewport.CenterLocation.ToInt2()).ToWPos(0);
|
||||
var intensity = 100 * 1024 * 1024 * shakeEffects.Sum(
|
||||
e => (float)e.Intensity / (e.Position - cp).LengthSquared);
|
||||
|
||||
return Math.Min(intensity, 10);
|
||||
}
|
||||
}
|
||||
|
||||
class ShakeEffect { public int ExpiryTime; public float2 Position; public int Intensity; }
|
||||
struct ShakeEffect
|
||||
{
|
||||
public int ExpiryTime;
|
||||
public WPos Position;
|
||||
public int Intensity;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -185,7 +185,7 @@ namespace OpenRA.Widgets
|
||||
static readonly Actor[] NoActors = {};
|
||||
IEnumerable<Actor> SelectActorsInBox(World world, PPos a, PPos b, Func<Actor, bool> cond)
|
||||
{
|
||||
return world.FindUnits(a, b)
|
||||
return world.FindActorsInBox(a.ToWPos(0), b.ToWPos(0))
|
||||
.Where(x => x.HasTrait<Selectable>() && x.Trait<Selectable>().Info.Selectable && !world.FogObscures(x) && cond(x))
|
||||
.GroupBy(x => x.GetSelectionPriority())
|
||||
.OrderByDescending(g => g.Key)
|
||||
|
||||
@@ -23,41 +23,49 @@ namespace OpenRA
|
||||
{
|
||||
public static IEnumerable<Actor> FindUnitsAtMouse(this World world, int2 mouseLocation)
|
||||
{
|
||||
var loc = Game.viewport.ViewToWorldPx(mouseLocation);
|
||||
return FindUnits(world, loc, loc).Where(a => !world.FogObscures(a));
|
||||
var loc = Game.viewport.ViewToWorldPx(mouseLocation).ToWPos(0);
|
||||
return FindActorsInBox(world, loc, loc).Where(a => !world.FogObscures(a));
|
||||
}
|
||||
|
||||
public static IEnumerable<Actor> FindUnits(this World world, PPos a, PPos b)
|
||||
public static IEnumerable<Actor> FindActorsInBox(this World world, CPos tl, CPos br)
|
||||
{
|
||||
return world.FindActorsInBox(tl.TopLeft, br.BottomRight);
|
||||
}
|
||||
|
||||
public static IEnumerable<Actor> FindActorsInBox(this World world, WPos tl, WPos br)
|
||||
{
|
||||
var a = PPos.FromWPos(tl);
|
||||
var b = PPos.FromWPos(br);
|
||||
var u = PPos.Min(a, b);
|
||||
var v = PPos.Max(a, b);
|
||||
return world.WorldActor.Trait<SpatialBins>().ActorsInBox(u,v);
|
||||
}
|
||||
|
||||
public static Actor ClosestTo(this IEnumerable<Actor> actors, PPos px)
|
||||
public static Actor ClosestTo(this IEnumerable<Actor> actors, Actor a)
|
||||
{
|
||||
return actors.OrderBy( a => (a.CenterLocation - px).LengthSquared ).FirstOrDefault();
|
||||
var pos = a.CenterPosition;
|
||||
return actors.OrderBy(b => (b.CenterPosition - pos).LengthSquared).FirstOrDefault();
|
||||
}
|
||||
|
||||
public static IEnumerable<Actor> FindUnitsInCircle(this World world, WPos a, WRange r)
|
||||
public static Actor ClosestTo(this IEnumerable<Actor> actors, WPos pos)
|
||||
{
|
||||
return world.FindUnitsInCircle(PPos.FromWPos(a), r.Range * Game.CellSize / 1024);
|
||||
return actors.OrderBy(a => (a.CenterPosition - pos).LengthSquared).FirstOrDefault();
|
||||
}
|
||||
|
||||
public static IEnumerable<Actor> FindUnitsInCircle(this World world, PPos a, int r)
|
||||
public static IEnumerable<Actor> FindActorsInCircle(this World world, WPos origin, WRange r)
|
||||
{
|
||||
using (new PerfSample("FindUnitsInCircle"))
|
||||
{
|
||||
var min = a - PVecInt.FromRadius(r);
|
||||
var max = a + PVecInt.FromRadius(r);
|
||||
|
||||
var actors = world.FindUnits(min, max);
|
||||
|
||||
var rect = new Rectangle(min.X, min.Y, max.X - min.X, max.Y - min.Y);
|
||||
|
||||
var inBox = actors.Where(x => x.ExtendedBounds.Value.IntersectsWith(rect));
|
||||
|
||||
return inBox.Where(x => (x.CenterLocation - a).LengthSquared < r * r);
|
||||
// Target ranges are calculated in 2D, so ignore height differences
|
||||
var vec = new WVec(r, r, WRange.Zero);
|
||||
var rSq = r.Range*r.Range;
|
||||
return world.FindActorsInBox(origin - vec, origin + vec).Where(a =>
|
||||
{
|
||||
var pos = a.CenterPosition;
|
||||
var dx = (long)(pos.X - origin.X);
|
||||
var dy = (long)(pos.Y - origin.Y);
|
||||
return dx*dx + dy*dy <= rSq;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#region Copyright & License Information
|
||||
#region Copyright & License Information
|
||||
/*
|
||||
* Copyright 2007-2012 The OpenRA Developers (see AUTHORS)
|
||||
* This file is part of OpenRA, which is free software. It is made
|
||||
@@ -148,7 +148,7 @@ namespace OpenRA.Mods.Cnc.Missions
|
||||
|
||||
IEnumerable<Actor> UnitsNearActor(Actor actor, int range)
|
||||
{
|
||||
return world.FindUnitsInCircle(actor.CenterLocation, Game.CellSize * range)
|
||||
return world.FindActorsInCircle(actor.CenterPosition, WRange.FromCells(range))
|
||||
.Where(a => a.IsInWorld && a != world.WorldActor && !a.Destroyed && a.HasTrait<IMove>() && !a.Owner.NonCombatant);
|
||||
}
|
||||
|
||||
|
||||
@@ -168,7 +168,7 @@ namespace OpenRA.Mods.RA.AI
|
||||
if (owner.IsEmpty) return false;
|
||||
var u = owner.units.Random(owner.random);
|
||||
|
||||
var units = owner.world.FindUnitsInCircle(u.CenterLocation, Game.CellSize * dangerRadius).ToList();
|
||||
var units = owner.world.FindActorsInCircle(u.CenterPosition, WRange.FromCells(dangerRadius)).ToList();
|
||||
var ownBaseBuildingAround = units.Where(unit => unit.Owner == owner.bot.p && unit.HasTrait<Building>()).ToList();
|
||||
if (ownBaseBuildingAround.Count > 0) return false;
|
||||
|
||||
@@ -301,7 +301,7 @@ namespace OpenRA.Mods.RA.AI
|
||||
for (int j = 0; j < y; j += dangerRadius * 2)
|
||||
{
|
||||
CPos pos = new CPos(i, j);
|
||||
if (NearToPosSafely(owner, pos.ToPPos(), out detectedEnemyTarget))
|
||||
if (NearToPosSafely(owner, pos.CenterPosition, out detectedEnemyTarget))
|
||||
{
|
||||
if (needTarget)
|
||||
{
|
||||
@@ -316,16 +316,16 @@ namespace OpenRA.Mods.RA.AI
|
||||
return null;
|
||||
}
|
||||
|
||||
protected static bool NearToPosSafely(Squad owner, PPos loc)
|
||||
protected static bool NearToPosSafely(Squad owner, WPos loc)
|
||||
{
|
||||
Actor a;
|
||||
return NearToPosSafely(owner, loc, out a);
|
||||
}
|
||||
|
||||
protected static bool NearToPosSafely(Squad owner, PPos loc, out Actor detectedEnemyTarget)
|
||||
protected static bool NearToPosSafely(Squad owner, WPos loc, out Actor detectedEnemyTarget)
|
||||
{
|
||||
detectedEnemyTarget = null;
|
||||
var unitsAroundPos = owner.world.FindUnitsInCircle(loc, Game.CellSize * dangerRadius)
|
||||
var unitsAroundPos = owner.world.FindActorsInCircle(loc, WRange.FromCells(dangerRadius))
|
||||
.Where(unit => owner.bot.p.Stances[unit.Owner] == Stance.Enemy).ToList();
|
||||
|
||||
int missileUnitsCount = 0;
|
||||
@@ -412,7 +412,7 @@ namespace OpenRA.Mods.RA.AI
|
||||
if (!owner.TargetIsValid)
|
||||
{
|
||||
var a = owner.units.Random(owner.random);
|
||||
var closestEnemy = owner.bot.FindClosestEnemy(a.CenterLocation);
|
||||
var closestEnemy = owner.bot.FindClosestEnemy(a.CenterPosition);
|
||||
if (closestEnemy != null)
|
||||
owner.Target = closestEnemy;
|
||||
else
|
||||
@@ -422,7 +422,7 @@ namespace OpenRA.Mods.RA.AI
|
||||
}
|
||||
}
|
||||
|
||||
if (!NearToPosSafely(owner, owner.Target.CenterLocation))
|
||||
if (!NearToPosSafely(owner, owner.Target.CenterPosition))
|
||||
{
|
||||
owner.fsm.ChangeState(new AirFleeState(), true);
|
||||
return;
|
||||
@@ -504,12 +504,12 @@ namespace OpenRA.Mods.RA.AI
|
||||
if (owner.IsEmpty) return;
|
||||
if (!owner.TargetIsValid)
|
||||
{
|
||||
var t = owner.bot.FindClosestEnemy(owner.units.FirstOrDefault().CenterLocation);
|
||||
var t = owner.bot.FindClosestEnemy(owner.units.FirstOrDefault().CenterPosition);
|
||||
if (t == null) return;
|
||||
owner.Target = t;
|
||||
}
|
||||
|
||||
var enemyUnits = owner.world.FindUnitsInCircle(owner.Target.CenterLocation, Game.CellSize * 10)
|
||||
var enemyUnits = owner.world.FindActorsInCircle(owner.Target.CenterPosition, WRange.FromCells(10))
|
||||
.Where(unit => owner.bot.p.Stances[unit.Owner] == Stance.Enemy).ToList();
|
||||
if (enemyUnits.Any())
|
||||
|
||||
@@ -541,7 +541,7 @@ namespace OpenRA.Mods.RA.AI
|
||||
|
||||
if (!owner.TargetIsValid)
|
||||
{
|
||||
var closestEnemy = owner.bot.FindClosestEnemy(owner.units.Random(owner.random).CenterLocation);
|
||||
var closestEnemy = owner.bot.FindClosestEnemy(owner.units.Random(owner.random).CenterPosition);
|
||||
if (closestEnemy != null)
|
||||
owner.Target = closestEnemy;
|
||||
else
|
||||
@@ -551,10 +551,10 @@ namespace OpenRA.Mods.RA.AI
|
||||
}
|
||||
}
|
||||
|
||||
Actor leader = owner.units.ClosestTo(owner.Target.CenterLocation);
|
||||
Actor leader = owner.units.ClosestTo(owner.Target.CenterPosition);
|
||||
if (leader == null)
|
||||
return;
|
||||
var ownUnits = owner.world.FindUnitsInCircle(leader.CenterLocation, Game.CellSize * owner.units.Count/3)
|
||||
var ownUnits = owner.world.FindActorsInCircle(leader.CenterPosition, WRange.FromCells(owner.units.Count) / 3)
|
||||
.Where(a => a.Owner == owner.units.FirstOrDefault().Owner && owner.units.Contains(a)).ToList();
|
||||
if (ownUnits.Count < owner.units.Count)
|
||||
{
|
||||
@@ -564,12 +564,12 @@ namespace OpenRA.Mods.RA.AI
|
||||
}
|
||||
else
|
||||
{
|
||||
var enemys = owner.world.FindUnitsInCircle(leader.CenterLocation, Game.CellSize * 12)
|
||||
var enemys = owner.world.FindActorsInCircle(leader.CenterPosition, WRange.FromCells(12))
|
||||
.Where(a1 => !a1.Destroyed && !a1.IsDead()).ToList();
|
||||
var enemynearby = enemys.Where(a1 => a1.HasTrait<ITargetable>() && leader.Owner.Stances[a1.Owner] == Stance.Enemy).ToList();
|
||||
if (enemynearby.Any())
|
||||
{
|
||||
owner.Target = enemynearby.ClosestTo(leader.CenterLocation);
|
||||
owner.Target = enemynearby.ClosestTo(leader.CenterPosition);
|
||||
owner.fsm.ChangeState(new GroundUnitsAttackState(), true);
|
||||
return;
|
||||
}
|
||||
@@ -598,7 +598,7 @@ namespace OpenRA.Mods.RA.AI
|
||||
|
||||
if (!owner.TargetIsValid)
|
||||
{
|
||||
var closestEnemy = owner.bot.FindClosestEnemy(owner.units.Random(owner.random).CenterLocation);
|
||||
var closestEnemy = owner.bot.FindClosestEnemy(owner.units.Random(owner.random).CenterPosition);
|
||||
if (closestEnemy != null)
|
||||
owner.Target = closestEnemy;
|
||||
else
|
||||
@@ -609,7 +609,7 @@ namespace OpenRA.Mods.RA.AI
|
||||
}
|
||||
foreach (var a in owner.units)
|
||||
if (!BusyAttack(a))
|
||||
owner.world.IssueOrder(new Order("Attack", a, false) { TargetActor = owner.bot.FindClosestEnemy(a.CenterLocation) });
|
||||
owner.world.IssueOrder(new Order("Attack", a, false) { TargetActor = owner.bot.FindClosestEnemy(a.CenterPosition) });
|
||||
|
||||
if (MayBeFlee(owner))
|
||||
{
|
||||
@@ -652,7 +652,7 @@ namespace OpenRA.Mods.RA.AI
|
||||
if (owner.IsEmpty) return;
|
||||
if (!owner.TargetIsValid)
|
||||
{
|
||||
owner.Target = owner.bot.FindClosestEnemy(AverageUnitsPosition(owner.units).Value.ToPPos(), 8);
|
||||
owner.Target = owner.bot.FindClosestEnemy(AverageUnitsPosition(owner.units).Value.CenterPosition, WRange.FromCells(8));
|
||||
|
||||
if (owner.Target == null)
|
||||
{
|
||||
@@ -915,12 +915,12 @@ namespace OpenRA.Mods.RA.AI
|
||||
var bi = Rules.Info[actorType].Traits.Get<BuildingInfo>();
|
||||
if (bi == null) return null;
|
||||
|
||||
Func<PPos, CPos, CPos?> findPos = (PPos pos, CPos center) =>
|
||||
Func<WPos, CPos, CPos?> findPos = (WPos pos, CPos center) =>
|
||||
{
|
||||
for (var k = MaxBaseDistance; k >= 0; k--)
|
||||
{
|
||||
var tlist = world.FindTilesInCircle(center, k)
|
||||
.OrderBy(a => (new PPos(a.ToPPos().X, a.ToPPos().Y) - pos).LengthSquared);
|
||||
.OrderBy(a => (a.CenterPosition - pos).LengthSquared);
|
||||
foreach (var t in tlist)
|
||||
if (world.CanPlaceBuilding(actorType, bi, t, null))
|
||||
if (bi.IsCloseEnoughToBase(world, p, actorType, t))
|
||||
@@ -933,14 +933,14 @@ namespace OpenRA.Mods.RA.AI
|
||||
switch(type)
|
||||
{
|
||||
case BuildingType.Defense:
|
||||
Actor enemyBase = FindEnemyBuildingClosestToPos(baseCenter.ToPPos());
|
||||
return enemyBase != null ? findPos(enemyBase.CenterLocation, defenseCenter) : null;
|
||||
Actor enemyBase = FindEnemyBuildingClosestToPos(baseCenter.CenterPosition);
|
||||
return enemyBase != null ? findPos(enemyBase.CenterPosition, defenseCenter) : null;
|
||||
|
||||
case BuildingType.Refinery:
|
||||
var tilesPos = world.FindTilesInCircle(baseCenter, MaxBaseDistance)
|
||||
.Where(a => resourceTypes.Contains(world.GetTerrainType(new CPos(a.X, a.Y))))
|
||||
.OrderBy(a => (new PPos(a.ToPPos().X, a.ToPPos().Y) - baseCenter.ToPPos()).LengthSquared);
|
||||
return tilesPos.Any() ? findPos(tilesPos.First().ToPPos(), baseCenter) : null;
|
||||
.OrderBy(a => (a.CenterPosition - baseCenter.CenterPosition).LengthSquared);
|
||||
return tilesPos.Any() ? findPos(tilesPos.First().CenterPosition, baseCenter) : null;
|
||||
|
||||
case BuildingType.Building:
|
||||
for (var k = 0; k < maxBaseDistance; k++)
|
||||
@@ -1006,7 +1006,7 @@ namespace OpenRA.Mods.RA.AI
|
||||
Actor target = null;
|
||||
|
||||
if (targets.Any())
|
||||
target = targets.ClosestTo(baseCenter.ToPPos());
|
||||
target = targets.ClosestTo(baseCenter.CenterPosition);
|
||||
|
||||
if (target == null)
|
||||
{
|
||||
@@ -1024,7 +1024,7 @@ namespace OpenRA.Mods.RA.AI
|
||||
return target;
|
||||
}
|
||||
|
||||
internal Actor FindClosestEnemy(PPos pos)
|
||||
internal Actor FindClosestEnemy(WPos pos)
|
||||
{
|
||||
var allEnemyUnits = world.Actors
|
||||
.Where(unit => p.Stances[unit.Owner] == Stance.Enemy && !unit.HasTrait<Husk>() &&
|
||||
@@ -1035,9 +1035,9 @@ namespace OpenRA.Mods.RA.AI
|
||||
return null;
|
||||
}
|
||||
|
||||
internal Actor FindClosestEnemy(PPos pos, int radius)
|
||||
internal Actor FindClosestEnemy(WPos pos, WRange radius)
|
||||
{
|
||||
var enemyUnits = world.FindUnitsInCircle(pos, Game.CellSize * radius)
|
||||
var enemyUnits = world.FindActorsInCircle(pos, radius)
|
||||
.Where(unit => p.Stances[unit.Owner] == Stance.Enemy &&
|
||||
!unit.HasTrait<Husk>() && unit.HasTrait<ITargetable>()).ToList();
|
||||
|
||||
@@ -1053,7 +1053,7 @@ namespace OpenRA.Mods.RA.AI
|
||||
return bases != null ? bases : new List<Actor>();
|
||||
}
|
||||
|
||||
Actor FindEnemyBuildingClosestToPos(PPos pos)
|
||||
Actor FindEnemyBuildingClosestToPos(WPos pos)
|
||||
{
|
||||
var closestBuilding = world.Actors.Where(a => p.Stances[a.Owner] == Stance.Enemy && a.HasTrait<IHasLocation>()
|
||||
&& !a.Destroyed && a.HasTrait<Building>()).ClosestTo(pos);
|
||||
@@ -1194,7 +1194,7 @@ namespace OpenRA.Mods.RA.AI
|
||||
if (!allEnemyBaseBuilder.Any() || (ownUnits.Count < Info.SquadSize)) return;
|
||||
foreach (var b in allEnemyBaseBuilder)
|
||||
{
|
||||
var enemys = world.FindUnitsInCircle(b.CenterLocation, Game.CellSize * 15)
|
||||
var enemys = world.FindActorsInCircle(b.CenterPosition, WRange.FromCells(15))
|
||||
.Where(unit => p.Stances[unit.Owner] == Stance.Enemy && unit.HasTrait<AttackBase>()).ToList();
|
||||
|
||||
rushFuzzy.CalculateFuzzy(ownUnits, enemys);
|
||||
@@ -1223,7 +1223,7 @@ namespace OpenRA.Mods.RA.AI
|
||||
protectSq.Target = attacker;
|
||||
if (protectSq.IsEmpty)
|
||||
{
|
||||
var ownUnits = world.FindUnitsInCircle(baseCenter.ToPPos(), Game.CellSize * 15)
|
||||
var ownUnits = world.FindActorsInCircle(baseCenter.CenterPosition, WRange.FromCells(15))
|
||||
.Where(unit => unit.Owner == p && !unit.HasTrait<Building>()
|
||||
&& unit.HasTrait<AttackBase>()).ToList();
|
||||
foreach (var a in ownUnits)
|
||||
@@ -1340,7 +1340,7 @@ namespace OpenRA.Mods.RA.AI
|
||||
for (int j = 0; j < y; j += radiusOfPower * 2)
|
||||
{
|
||||
CPos pos = new CPos(i, j);
|
||||
var targets = world.FindUnitsInCircle(pos.ToPPos(), Game.CellSize * radiusOfPower).ToList();
|
||||
var targets = world.FindActorsInCircle(pos.CenterPosition, WRange.FromCells(radiusOfPower)).ToList();
|
||||
var enemys = targets.Where(unit => p.Stances[unit.Owner] == Stance.Enemy).ToList();
|
||||
var ally = targets.Where(unit => p.Stances[unit.Owner] == Stance.Ally || unit.Owner == p).ToList();
|
||||
|
||||
|
||||
@@ -52,21 +52,13 @@ namespace OpenRA.Mods.RA.Activities
|
||||
int searchRadiusSquared = searchRadius * searchRadius;
|
||||
|
||||
// Find harvestable resources nearby:
|
||||
// Avoid enemy territory:
|
||||
// TODO: calculate weapons ranges of units and factor those in instead of hard-coding 8.
|
||||
var path = self.World.WorldActor.Trait<PathFinder>().FindPath(
|
||||
PathSearch.Search(self.World, mobileInfo, self, true)
|
||||
.WithCustomCost(loc =>
|
||||
{
|
||||
// Avoid enemy territory:
|
||||
int safetycost = (
|
||||
// TODO: calculate weapons ranges of units and factor those in instead of hard-coding 8.
|
||||
from u in self.World.FindUnitsInCircle(loc.ToPPos(), Game.CellSize * 8)
|
||||
where !u.Destroyed
|
||||
where self.Owner.Stances[u.Owner] == Stance.Enemy
|
||||
select Math.Max(0, 64 - (loc - u.Location).LengthSquared)
|
||||
).Sum();
|
||||
|
||||
return safetycost;
|
||||
})
|
||||
.WithCustomCost(loc => self.World.FindActorsInCircle(loc.CenterPosition, WRange.FromCells(8))
|
||||
.Where (u => !u.Destroyed && self.Owner.Stances[u.Owner] == Stance.Enemy)
|
||||
.Sum(u => Math.Max(0, 64 - (loc - u.Location).LengthSquared)))
|
||||
.WithHeuristic(loc =>
|
||||
{
|
||||
// Avoid this cell:
|
||||
|
||||
@@ -31,7 +31,7 @@ namespace OpenRA.Mods.RA.Activities
|
||||
var buildings = self.Info.Traits.Get<MinelayerInfo>().RearmBuildings;
|
||||
var rearmTarget = self.World.Actors.Where(a => self.Owner.Stances[a.Owner] == Stance.Ally
|
||||
&& buildings.Contains(a.Info.Name))
|
||||
.ClosestTo( self.CenterLocation );
|
||||
.ClosestTo(self);
|
||||
|
||||
if (rearmTarget == null)
|
||||
return new Wait(20);
|
||||
|
||||
@@ -36,7 +36,7 @@ namespace OpenRA.Mods.RA.Activities
|
||||
{
|
||||
if (!limitedAmmo.GiveAmmo()) return NextActivity;
|
||||
|
||||
var hostBuilding = self.World.FindUnits(self.CenterLocation, self.CenterLocation)
|
||||
var hostBuilding = self.World.FindActorsInBox(self.CenterPosition, self.CenterPosition)
|
||||
.FirstOrDefault(a => a.HasTrait<RenderBuilding>());
|
||||
|
||||
if (hostBuilding != null)
|
||||
|
||||
@@ -80,7 +80,7 @@ namespace OpenRA.Mods.RA.Air
|
||||
if (self.Trait<IMove>().Altitude != 0)
|
||||
return null; // not on the ground.
|
||||
|
||||
return self.World.FindUnits(self.CenterLocation, self.CenterLocation)
|
||||
return self.World.FindActorsInBox(self.CenterPosition, self.CenterPosition)
|
||||
.FirstOrDefault( a => a.HasTrait<Reservable>() );
|
||||
}
|
||||
|
||||
|
||||
@@ -37,7 +37,7 @@ namespace OpenRA.Mods.RA.Air
|
||||
var nearestHpad = self.World.ActorsWithTrait<Reservable>()
|
||||
.Where(a => a.Actor.Owner == self.Owner && rearmBuildings.Contains(a.Actor.Info.Name))
|
||||
.Select(a => a.Actor)
|
||||
.ClosestTo(self.CenterLocation);
|
||||
.ClosestTo(self);
|
||||
|
||||
if (nearestHpad == null)
|
||||
return Util.SequenceActivities(new Turn(initialFacing), new HeliLand(true, 0), NextActivity);
|
||||
|
||||
@@ -113,7 +113,8 @@ namespace OpenRA.Mods.RA.Air
|
||||
/* repulsion only applies when we're flying */
|
||||
if (Altitude <= 0) return;
|
||||
|
||||
var otherHelis = self.World.FindUnitsInCircle(self.CenterLocation, Info.IdealSeparation)
|
||||
var separation = new WRange(Info.IdealSeparation * 1024 / Game.CellSize);
|
||||
var otherHelis = self.World.FindActorsInCircle(self.CenterPosition, separation)
|
||||
.Where(a => a.HasTrait<Helicopter>());
|
||||
|
||||
var f = otherHelis
|
||||
|
||||
@@ -30,7 +30,7 @@ namespace OpenRA.Mods.RA.Air
|
||||
.Where(a => rearmBuildings.Contains(a.Actor.Info.Name)
|
||||
&& (!unreservedOnly || !Reservable.IsReserved(a.Actor)))
|
||||
.Select(a => a.Actor)
|
||||
.ClosestTo( self.CenterLocation );
|
||||
.ClosestTo(self);
|
||||
}
|
||||
|
||||
void Calculate(Actor self)
|
||||
|
||||
@@ -22,14 +22,14 @@ namespace OpenRA.Mods.RA
|
||||
public void TickIdle(Actor self)
|
||||
{
|
||||
var attack = self.Trait<AttackBase>();
|
||||
var inRange = self.World.FindUnitsInCircle(self.CenterPosition, attack.GetMaximumRange());
|
||||
var inRange = self.World.FindActorsInCircle(self.CenterPosition, attack.GetMaximumRange());
|
||||
|
||||
var target = inRange
|
||||
.Where(a => a != self && a.AppearsFriendlyTo(self))
|
||||
.Where(a => a.IsInWorld && !a.IsDead())
|
||||
.Where(a => a.GetDamageState() > DamageState.Undamaged)
|
||||
.Where(a => attack.HasAnyValidWeapons(Target.FromActor(a)))
|
||||
.ClosestTo( self.CenterLocation );
|
||||
.ClosestTo(self);
|
||||
|
||||
if (target != null)
|
||||
self.QueueActivity(attack.GetAttackActivity(self, Target.FromActor(target), false));
|
||||
|
||||
@@ -119,7 +119,7 @@ namespace OpenRA.Mods.RA
|
||||
Actor ChooseTarget(Actor self, WRange range)
|
||||
{
|
||||
nextScanTime = self.World.SharedRandom.Next(Info.MinimumScanTimeInterval, Info.MaximumScanTimeInterval);
|
||||
var inRange = self.World.FindUnitsInCircle(self.CenterPosition, range);
|
||||
var inRange = self.World.FindActorsInCircle(self.CenterPosition, range);
|
||||
|
||||
if (self.Owner.HasFogVisibility())
|
||||
{
|
||||
@@ -127,7 +127,7 @@ namespace OpenRA.Mods.RA
|
||||
.Where(a => a.AppearsHostileTo(self))
|
||||
.Where(a => !a.HasTrait<AutoTargetIgnore>())
|
||||
.Where(a => attack.HasAnyValidWeapons(Target.FromActor(a)))
|
||||
.ClosestTo(self.CenterLocation);
|
||||
.ClosestTo(self);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -136,7 +136,7 @@ namespace OpenRA.Mods.RA
|
||||
.Where(a => !a.HasTrait<AutoTargetIgnore>())
|
||||
.Where(a => attack.HasAnyValidWeapons(Target.FromActor(a)))
|
||||
.Where(a => self.Owner.Shroud.IsTargetable(a))
|
||||
.ClosestTo(self.CenterLocation);
|
||||
.ClosestTo(self);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -65,7 +65,7 @@ namespace OpenRA.Mods.RA.Buildings
|
||||
|
||||
wr.DrawRangeCircleWithContrast(
|
||||
Color.FromArgb(128, Ready() ? Color.White : Color.Red),
|
||||
self.CenterLocation.ToFloat2(), Info.Range,
|
||||
wr.ScreenPxPosition(self.CenterPosition), Info.Range,
|
||||
Color.FromArgb(96, Color.Black), 1);
|
||||
}
|
||||
|
||||
|
||||
@@ -29,7 +29,7 @@ namespace OpenRA.Mods.RA.Buildings
|
||||
|
||||
public void Killed(Actor self, AttackInfo e)
|
||||
{
|
||||
self.World.WorldActor.Trait<ScreenShaker>().AddEffect(Info.Intensity, self.CenterLocation.ToFloat2(), 1);
|
||||
self.World.WorldActor.Trait<ScreenShaker>().AddEffect(Info.Intensity, self.CenterPosition, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -154,7 +154,7 @@ namespace OpenRA.Mods.RA
|
||||
|
||||
wr.DrawRangeCircle(
|
||||
Color.FromArgb(128, Color.DeepSkyBlue),
|
||||
self.CenterLocation.ToFloat2(), (int)self.Trait<ChronoshiftDeploy>().Info.JumpDistance);
|
||||
wr.ScreenPxPosition(self.CenterPosition), (int)self.Trait<ChronoshiftDeploy>().Info.JumpDistance);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -105,7 +105,8 @@ namespace OpenRA.Mods.RA
|
||||
case DamageModel.Normal:
|
||||
{
|
||||
var maxSpread = warhead.Spread * (float)Math.Log(Math.Abs(warhead.Damage), 2);
|
||||
var hitActors = world.FindUnitsInCircle(args.dest, (int)maxSpread);
|
||||
var range = new WRange((int)maxSpread * 1024 / Game.CellSize);
|
||||
var hitActors = world.FindActorsInCircle(args.dest.ToWPos(0), range);
|
||||
|
||||
foreach (var victim in hitActors)
|
||||
{
|
||||
@@ -117,7 +118,7 @@ namespace OpenRA.Mods.RA
|
||||
case DamageModel.PerCell:
|
||||
{
|
||||
foreach (var t in world.FindTilesInCircle(targetTile, warhead.Size[0]))
|
||||
foreach (var unit in world.FindUnits(t.ToPPos(), (t + new CVec(1,1)).ToPPos()))
|
||||
foreach (var unit in world.FindActorsInBox(t, t))
|
||||
unit.InflictDamage(args.firedBy,
|
||||
(int)(warhead.Damage * warhead.EffectivenessAgainst(unit)), warhead);
|
||||
} break;
|
||||
|
||||
@@ -67,7 +67,7 @@ namespace OpenRA.Mods.RA.Effects
|
||||
{
|
||||
world.AddFrameEndTask(w => w.Remove(this));
|
||||
Combat.DoExplosion(firedBy.PlayerActor, weapon, pos);
|
||||
world.WorldActor.Trait<ScreenShaker>().AddEffect(20, PPos.FromWPos(pos).ToFloat2(), 5);
|
||||
world.WorldActor.Trait<ScreenShaker>().AddEffect(20, pos, 5);
|
||||
|
||||
foreach (var a in world.ActorsWithTrait<NukePaletteEffect>())
|
||||
a.Trait.Enable();
|
||||
|
||||
@@ -221,7 +221,7 @@ namespace OpenRA.Mods.RA.Missions
|
||||
|
||||
bool AlliesControlLab()
|
||||
{
|
||||
return MissionUtils.AreaSecuredWithUnits(world, allies, lab.CenterLocation, LabClearRange);
|
||||
return MissionUtils.AreaSecuredWithUnits(world, allies, lab.CenterPosition, WRange.FromCells(LabClearRange));
|
||||
}
|
||||
|
||||
void SpawnEinsteinAtLab()
|
||||
|
||||
@@ -169,7 +169,7 @@ namespace OpenRA.Mods.RA.Missions
|
||||
{
|
||||
if (yak == null || (yak != null && !yak.IsDead() && (yak.GetCurrentActivity() is FlyCircle || yak.IsIdle)))
|
||||
{
|
||||
var alliedUnitsNearYakPoint = world.FindAliveCombatantActorsInCircle(yakAttackPoint.CenterLocation, 10)
|
||||
var alliedUnitsNearYakPoint = world.FindAliveCombatantActorsInCircle(yakAttackPoint.CenterPosition, WRange.FromCells(10))
|
||||
.Where(a => a.Owner != soviets && a.HasTrait<IMove>() && a != tanya && a != einstein && a != engineer);
|
||||
if (alliedUnitsNearYakPoint.Any())
|
||||
YakStrafe(alliedUnitsNearYakPoint);
|
||||
@@ -240,7 +240,7 @@ namespace OpenRA.Mods.RA.Missions
|
||||
|
||||
world.AddFrameEndTask(w =>
|
||||
{
|
||||
if (!w.FindAliveCombatantActorsInBox(alliedBaseTopLeft.ToPPos(), alliedBaseBottomRight.ToPPos())
|
||||
if (!w.FindAliveCombatantActorsInBox(alliedBaseTopLeft, alliedBaseBottomRight)
|
||||
.Any(a => (a.Owner == allies || a.Owner == allies2) && (a.HasTrait<Building>() && !a.HasTrait<Wall>()) || a.HasTrait<BaseBuilding>()))
|
||||
{
|
||||
maintainPresence.Status = ObjectiveStatus.Failed;
|
||||
@@ -299,7 +299,7 @@ namespace OpenRA.Mods.RA.Missions
|
||||
|
||||
void ManageSovietUnits()
|
||||
{
|
||||
var units = world.FindAliveCombatantActorsInCircle(sovietRallyPoint.CenterLocation, 10)
|
||||
var units = world.FindAliveCombatantActorsInCircle(sovietRallyPoint.CenterPosition, WRange.FromCells(10))
|
||||
.Where(u => u.IsIdle && u.HasTrait<Mobile>() && u.HasTrait<AttackBase>() && u.Owner == soviets)
|
||||
.Except(world.WorldActor.Trait<SpawnMapActors>().Actors.Values);
|
||||
if (units.Count() >= SovietGroupSize)
|
||||
@@ -383,22 +383,22 @@ namespace OpenRA.Mods.RA.Missions
|
||||
|
||||
bool AlliesNearTown()
|
||||
{
|
||||
return world.FindAliveCombatantActorsInCircle(townPoint.CenterLocation, AlliedTownTransferRange)
|
||||
return world.FindAliveCombatantActorsInCircle(townPoint.CenterPosition, WRange.FromCells(AlliedTownTransferRange))
|
||||
.Any(a => a.Owner == allies1 && a.HasTrait<IMove>());
|
||||
}
|
||||
|
||||
void TransferTownUnitsToAllies()
|
||||
{
|
||||
foreach (var unit in world.FindAliveNonCombatantActorsInCircle(townPoint.CenterLocation, AlliedTownTransferRange)
|
||||
foreach (var unit in world.FindAliveNonCombatantActorsInCircle(townPoint.CenterPosition, WRange.FromCells(AlliedTownTransferRange))
|
||||
.Where(a => a.HasTrait<Mobile>()))
|
||||
unit.ChangeOwner(allies1);
|
||||
}
|
||||
|
||||
void SovietsAttackTown()
|
||||
{
|
||||
var sovietAttackUnits = world.FindAliveCombatantActorsInCircle(sovietTownAttackPoint1.CenterLocation, SovietTownAttackGroupRange)
|
||||
.Union(world.FindAliveCombatantActorsInCircle(sovietTownAttackPoint2.CenterLocation, SovietTownAttackGroupRange))
|
||||
.Union(world.FindAliveCombatantActorsInCircle(townPoint.CenterLocation, AlliedTownTransferRange))
|
||||
var sovietAttackUnits = world.FindAliveCombatantActorsInCircle(sovietTownAttackPoint1.CenterPosition, WRange.FromCells(SovietTownAttackGroupRange))
|
||||
.Union(world.FindAliveCombatantActorsInCircle(sovietTownAttackPoint2.CenterPosition, WRange.FromCells(SovietTownAttackGroupRange)))
|
||||
.Union(world.FindAliveCombatantActorsInCircle(townPoint.CenterPosition, WRange.FromCells(AlliedTownTransferRange)))
|
||||
.Where(a => a.HasTrait<IMove>() && a.Owner == soviets);
|
||||
|
||||
foreach (var unit in sovietAttackUnits)
|
||||
|
||||
@@ -187,8 +187,8 @@ namespace OpenRA.Mods.RA.Missions
|
||||
ManageSovietAircraft();
|
||||
}
|
||||
|
||||
EvacuateAlliedUnits(exit1TopLeft.CenterLocation, exit1BottomRight.CenterLocation, exit1ExitPoint.Location);
|
||||
EvacuateAlliedUnits(exit2TopLeft.CenterLocation, exit2BottomRight.CenterLocation, exit2ExitPoint.Location);
|
||||
EvacuateAlliedUnits(exit1TopLeft.Location, exit1BottomRight.Location, exit1ExitPoint.Location);
|
||||
EvacuateAlliedUnits(exit2TopLeft.Location, exit2BottomRight.Location, exit2ExitPoint.Location);
|
||||
|
||||
CheckSovietAirbases();
|
||||
|
||||
@@ -203,7 +203,7 @@ namespace OpenRA.Mods.RA.Missions
|
||||
|
||||
Actor FirstUnshroudedOrDefault(IEnumerable<Actor> actors, World world, int shroudRange)
|
||||
{
|
||||
return actors.FirstOrDefault(u => world.FindAliveCombatantActorsInCircle(u.CenterLocation, shroudRange).All(a => !a.HasTrait<CreatesShroud>()));
|
||||
return actors.FirstOrDefault(u => world.FindAliveCombatantActorsInCircle(u.CenterPosition, WRange.FromCells(shroudRange)).All(a => !a.HasTrait<CreatesShroud>()));
|
||||
}
|
||||
|
||||
void ManageSovietAircraft()
|
||||
@@ -219,7 +219,7 @@ namespace OpenRA.Mods.RA.Missions
|
||||
var ammo = aircraft.Trait<LimitedAmmo>();
|
||||
if ((plane.Altitude == 0 && ammo.FullAmmo()) || (plane.Altitude != 0 && ammo.HasAmmo()))
|
||||
{
|
||||
var enemy = FirstUnshroudedOrDefault(enemies.OrderBy(u => (aircraft.CenterLocation - u.CenterLocation).LengthSquared), world, 10);
|
||||
var enemy = FirstUnshroudedOrDefault(enemies.OrderBy(u => (aircraft.CenterPosition - u.CenterPosition).LengthSquared), world, 10);
|
||||
if (enemy != null)
|
||||
{
|
||||
if (!aircraft.IsIdle && aircraft.GetCurrentActivity().GetType() != typeof(FlyAttack))
|
||||
@@ -295,7 +295,7 @@ namespace OpenRA.Mods.RA.Missions
|
||||
var enemies = world.Actors.Where(u => u.AppearsHostileTo(self) && (u.Owner == allies1 || u.Owner == allies2)
|
||||
&& ((u.HasTrait<Building>() && !u.HasTrait<Wall>()) || u.HasTrait<Mobile>()) && u.IsInWorld && !u.IsDead());
|
||||
|
||||
var enemy = FirstUnshroudedOrDefault(enemies.OrderBy(u => (self.CenterLocation - u.CenterLocation).LengthSquared), world, 10);
|
||||
var enemy = FirstUnshroudedOrDefault(enemies.OrderBy(u => (self.CenterPosition - u.CenterPosition).LengthSquared), world, 10);
|
||||
if (enemy != null)
|
||||
self.QueueActivity(new AttackMove.AttackMoveActivity(self, new Attack(Target.FromActor(enemy), WRange.FromCells(3))));
|
||||
}
|
||||
@@ -304,7 +304,7 @@ namespace OpenRA.Mods.RA.Missions
|
||||
{
|
||||
foreach (var rallyPoint in sovietRallyPoints)
|
||||
{
|
||||
var units = world.FindAliveCombatantActorsInCircle(Util.CenterOfCell(rallyPoint), 10)
|
||||
var units = world.FindAliveCombatantActorsInCircle(rallyPoint.CenterPosition, WRange.FromCells(10))
|
||||
.Where(u => u.IsIdle && u.HasTrait<Mobile>() && u.HasTrait<AttackBase>() && u.Owner == soviets);
|
||||
if (units.Count() >= SovietGroupSize)
|
||||
{
|
||||
@@ -315,7 +315,7 @@ namespace OpenRA.Mods.RA.Missions
|
||||
|
||||
var scatteredUnits = world.Actors.Where(u => u.IsInWorld && !u.IsDead() && u.HasTrait<Mobile>() && u.IsIdle && u.Owner == soviets)
|
||||
.Except(world.WorldActor.Trait<SpawnMapActors>().Actors.Values)
|
||||
.Except(sovietRallyPoints.SelectMany(rp => world.FindAliveCombatantActorsInCircle(Util.CenterOfCell(rp), 10)));
|
||||
.Except(sovietRallyPoints.SelectMany(rp => world.FindAliveCombatantActorsInCircle(rp.CenterPosition, WRange.FromCells(10))));
|
||||
|
||||
foreach (var unit in scatteredUnits)
|
||||
AttackNearestAlliedActor(unit);
|
||||
@@ -351,9 +351,9 @@ namespace OpenRA.Mods.RA.Missions
|
||||
}
|
||||
}
|
||||
|
||||
void EvacuateAlliedUnits(PPos a, PPos b, CPos exit)
|
||||
void EvacuateAlliedUnits(CPos tl, CPos br, CPos exit)
|
||||
{
|
||||
var units = world.FindAliveCombatantActorsInBox(a, b)
|
||||
var units = world.FindAliveCombatantActorsInBox(tl, br)
|
||||
.Where(u => u.HasTrait<Mobile>() && !u.HasTrait<Aircraft>() && (u.Owner == allies1 || u.Owner == allies2));
|
||||
|
||||
foreach (var unit in units)
|
||||
|
||||
@@ -150,7 +150,7 @@ namespace OpenRA.Mods.RA.Missions
|
||||
var enemies = world.Actors.Where(u => u.Owner == creeps && u.HasTrait<ITargetable>()
|
||||
&& ((u.HasTrait<Building>() && !u.HasTrait<Wall>() && !u.HasTrait<Bridge>()) || u.HasTrait<Mobile>()) && !u.IsDead() && u.IsInWorld);
|
||||
|
||||
var enemy = enemies.OrderBy(u => (attacker.CenterLocation - u.CenterLocation).LengthSquared).FirstOrDefault();
|
||||
var enemy = enemies.OrderBy(u => (attacker.CenterPosition - u.CenterPosition).LengthSquared).FirstOrDefault();
|
||||
if (enemy != null)
|
||||
attacker.QueueActivity(new AttackMove.AttackMoveActivity(attacker, new Attack(Target.FromActor(enemy), WRange.FromCells(3))));
|
||||
else
|
||||
|
||||
@@ -79,7 +79,7 @@ namespace OpenRA.Mods.RA.Missions
|
||||
{
|
||||
var enemies = world.Actors.Where(u => u.IsInWorld && !u.IsDead() && (u.Owner == multi0)
|
||||
&& ((u.HasTrait<Building>() && !u.HasTrait<Mobile>())));
|
||||
var targetEnemy = enemies.OrderBy(u => (self.CenterLocation - u.CenterLocation).LengthSquared).FirstOrDefault();
|
||||
var targetEnemy = enemies.OrderBy(u => (self.CenterPosition - u.CenterPosition).LengthSquared).FirstOrDefault();
|
||||
if (targetEnemy != null)
|
||||
{
|
||||
self.QueueActivity(new AttackMove.AttackMoveActivity(self, new Attack(Target.FromActor(targetEnemy), WRange.FromCells(6))));
|
||||
@@ -127,7 +127,7 @@ namespace OpenRA.Mods.RA.Missions
|
||||
new OwnerInit(soviets)
|
||||
});
|
||||
squad.QueueActivity(new AttackMove.AttackMoveActivity(squad, new Move.Move(paradrop1.Location, 3)));
|
||||
var scatteredUnits = world.FindAliveCombatantActorsInCircle(Util.CenterOfCell(paradrop1.Location), 15)
|
||||
var scatteredUnits = world.FindAliveCombatantActorsInCircle(paradrop1.Location.CenterPosition, WRange.FromCells(15))
|
||||
.Where(unit => unit.IsIdle && unit.HasTrait<Mobile>() && unit.Owner == soviets);
|
||||
foreach (var unit in scatteredUnits)
|
||||
{
|
||||
|
||||
@@ -24,20 +24,21 @@ namespace OpenRA.Mods.RA.Missions
|
||||
{
|
||||
public static class MissionUtils
|
||||
{
|
||||
public static IEnumerable<Actor> FindAliveCombatantActorsInCircle(this World world, PPos location, int range)
|
||||
public static IEnumerable<Actor> FindAliveCombatantActorsInCircle(this World world, WPos location, WRange range)
|
||||
{
|
||||
return world.FindUnitsInCircle(location, Game.CellSize * range)
|
||||
return world.FindActorsInCircle(location, range)
|
||||
.Where(u => u.IsInWorld && u != world.WorldActor && !u.IsDead() && !u.Owner.NonCombatant);
|
||||
}
|
||||
|
||||
public static IEnumerable<Actor> FindAliveCombatantActorsInBox(this World world, PPos a, PPos b)
|
||||
public static IEnumerable<Actor> FindAliveCombatantActorsInBox(this World world, CPos a, CPos b)
|
||||
{
|
||||
return world.FindUnits(a, b).Where(u => u.IsInWorld && u != world.WorldActor && !u.IsDead() && !u.Owner.NonCombatant);
|
||||
return world.FindActorsInBox(a, b)
|
||||
.Where(u => u.IsInWorld && u != world.WorldActor && !u.IsDead() && !u.Owner.NonCombatant);
|
||||
}
|
||||
|
||||
public static IEnumerable<Actor> FindAliveNonCombatantActorsInCircle(this World world, PPos location, int range)
|
||||
public static IEnumerable<Actor> FindAliveNonCombatantActorsInCircle(this World world, WPos location, WRange range)
|
||||
{
|
||||
return world.FindUnitsInCircle(location, Game.CellSize * range)
|
||||
return world.FindActorsInCircle(location, range)
|
||||
.Where(u => u.IsInWorld && u != world.WorldActor && !u.IsDead() && u.Owner.NonCombatant);
|
||||
}
|
||||
|
||||
@@ -103,7 +104,7 @@ namespace OpenRA.Mods.RA.Missions
|
||||
badger.QueueActivity(new RemoveSelf());
|
||||
}
|
||||
|
||||
public static bool AreaSecuredWithUnits(World world, Player player, PPos location, int range)
|
||||
public static bool AreaSecuredWithUnits(World world, Player player, WPos location, WRange range)
|
||||
{
|
||||
var units = world.FindAliveCombatantActorsInCircle(location, range).Where(a => a.HasTrait<IMove>());
|
||||
return units.Any() && units.All(a => a.Owner == player);
|
||||
@@ -211,7 +212,7 @@ namespace OpenRA.Mods.RA.Missions
|
||||
var enemies = self.World.Actors.Where(u => u.AppearsHostileTo(self) && u.Owner == enemyPlayer
|
||||
&& ((u.HasTrait<Building>() && !u.HasTrait<Wall>()) || (u.HasTrait<Mobile>() && !u.HasTrait<Aircraft>())) && u.IsInWorld && !u.IsDead());
|
||||
|
||||
var enemy = enemies.OrderBy(u => (self.CenterLocation - u.CenterLocation).LengthSquared).FirstOrDefault();
|
||||
var enemy = enemies.OrderBy(u => (self.CenterPosition - u.CenterPosition).LengthSquared).FirstOrDefault();
|
||||
if (enemy != null)
|
||||
self.QueueActivity(queued, new AttackMove.AttackMoveActivity(self, new Attack(Target.FromActor(enemy), WRange.FromCells(3))));
|
||||
}
|
||||
|
||||
@@ -121,7 +121,7 @@ namespace OpenRA.Mods.RA.Missions
|
||||
|
||||
MissionUtils.CapOre(ussr);
|
||||
|
||||
if (!hospitalEvacuated && !hospital.IsDead() && MissionUtils.AreaSecuredWithUnits(world, greece, hospital.CenterLocation, 5))
|
||||
if (!hospitalEvacuated && !hospital.IsDead() && MissionUtils.AreaSecuredWithUnits(world, greece, hospital.CenterPosition, WRange.FromCells(5)))
|
||||
{
|
||||
EvacuateCivilians();
|
||||
hospitalEvacuated = true;
|
||||
@@ -129,7 +129,7 @@ namespace OpenRA.Mods.RA.Missions
|
||||
|
||||
if (baseTransferredTick == -1)
|
||||
{
|
||||
var actorsInBase = world.FindUnits(alliedBaseTopLeft.CenterLocation, alliedBaseBottomRight.CenterLocation).Where(a => a != a.Owner.PlayerActor);
|
||||
var actorsInBase = world.FindActorsInBox(alliedBaseTopLeft.Location, alliedBaseBottomRight.Location).Where(a => a != a.Owner.PlayerActor);
|
||||
if (actorsInBase.Any(a => a.Owner == greece))
|
||||
{
|
||||
SetupAlliedBase(actorsInBase);
|
||||
@@ -184,7 +184,7 @@ namespace OpenRA.Mods.RA.Missions
|
||||
MissionFailed("Dr. Demitri was killed.");
|
||||
}
|
||||
|
||||
else if (MissionUtils.AreaSecuredWithUnits(world, greece, demitriTriggerAreaCenter.CenterLocation, 3))
|
||||
else if (MissionUtils.AreaSecuredWithUnits(world, greece, demitriTriggerAreaCenter.CenterPosition, WRange.FromCells(3)))
|
||||
{
|
||||
demitri = world.CreateActor("demitri", greece, demitriChurchSpawnPoint.Location, null);
|
||||
demitri.QueueActivity(new Move.Move(demitriTriggerAreaCenter.Location, 0));
|
||||
|
||||
@@ -126,10 +126,10 @@ namespace OpenRA.Mods.RA.Missions
|
||||
{
|
||||
var bridge = world.Actors
|
||||
.Where(a => a.HasTrait<Bridge>() && !a.IsDead())
|
||||
.OrderBy(a => (startJeep.CenterLocation - a.CenterLocation).LengthSquared)
|
||||
.OrderBy(a => (startJeep.CenterPosition - a.CenterPosition).LengthSquared)
|
||||
.First();
|
||||
Combat.DoExplosion(bridge, "Demolish", bridge.CenterPosition);
|
||||
world.WorldActor.Trait<ScreenShaker>().AddEffect(15, bridge.CenterLocation.ToFloat2(), 6);
|
||||
world.WorldActor.Trait<ScreenShaker>().AddEffect(15, bridge.CenterPosition, 6);
|
||||
bridge.Kill(bridge);
|
||||
}));
|
||||
}
|
||||
|
||||
@@ -184,7 +184,7 @@ namespace OpenRA.Mods.RA.Missions
|
||||
{
|
||||
var units = world.CreateActor((sovietInfantry).Random(world.SharedRandom), new TypeDictionary { new LocationInit(sovietinfantryentry1.Location), new OwnerInit(soviets) });
|
||||
units.QueueActivity(new Move.Move(sovietinfantryrally1.Location, 3));
|
||||
var unitsincircle = world.FindAliveCombatantActorsInCircle(Util.CenterOfCell(sovietinfantryrally1.Location), 10)
|
||||
var unitsincircle = world.FindAliveCombatantActorsInCircle(sovietinfantryrally1.CenterPosition, WRange.FromCells(10))
|
||||
.Where(a => a.Owner == soviets && a.IsIdle && a.HasTrait<IMove>());
|
||||
if (unitsincircle.Count() >= sovietInfantryGroupSize)
|
||||
{
|
||||
@@ -211,7 +211,7 @@ namespace OpenRA.Mods.RA.Missions
|
||||
{
|
||||
var enemies = world.Actors.Where(u => u.IsInWorld && !u.IsDead() && (u.Owner == allies)
|
||||
&& ((u.HasTrait<Building>() && !u.HasTrait<Wall>()) || u.HasTrait<Mobile>()));
|
||||
var targetEnemy = enemies.OrderBy(u => (self.CenterLocation - u.CenterLocation).LengthSquared).FirstOrDefault();
|
||||
var targetEnemy = enemies.OrderBy(u => (self.CenterPosition - u.CenterPosition).LengthSquared).FirstOrDefault();
|
||||
if (targetEnemy != null)
|
||||
{
|
||||
self.QueueActivity(new AttackMove.AttackMoveActivity(self, new Attack(Target.FromActor(targetEnemy), WRange.FromCells(3))));
|
||||
@@ -222,7 +222,7 @@ namespace OpenRA.Mods.RA.Missions
|
||||
{
|
||||
foreach (var rallyPoint in sovietRallyPoints)
|
||||
{
|
||||
var units = world.FindAliveCombatantActorsInCircle(Util.CenterOfCell(rallyPoint), 4)
|
||||
var units = world.FindAliveCombatantActorsInCircle(rallyPoint.CenterPosition, WRange.FromCells(4))
|
||||
.Where(u => u.IsIdle && u.HasTrait<Mobile>() && u.Owner == soviets);
|
||||
if (units.Count() >= sovietAttackGroupSize)
|
||||
{
|
||||
@@ -234,7 +234,7 @@ namespace OpenRA.Mods.RA.Missions
|
||||
}
|
||||
var scatteredUnits = world.Actors.Where(u => u.IsInWorld && !u.IsDead() && u.HasTrait<Mobile>() && u.IsIdle && u.Owner == soviets)
|
||||
.Except(world.WorldActor.Trait<SpawnMapActors>().Actors.Values)
|
||||
.Except(sovietRallyPoints.SelectMany(rp => world.FindAliveCombatantActorsInCircle(Util.CenterOfCell(rp), 4)));
|
||||
.Except(sovietRallyPoints.SelectMany(rp => world.FindAliveCombatantActorsInCircle(rp.CenterPosition, WRange.FromCells(4))));
|
||||
foreach (var unit in scatteredUnits)
|
||||
{
|
||||
AttackNearestAlliedActor(unit);
|
||||
|
||||
@@ -129,7 +129,7 @@ namespace OpenRA.Mods.RA.Missions
|
||||
|
||||
Actor FirstUnshroudedOrDefault(IEnumerable<Actor> actors, World world, int shroudRange)
|
||||
{
|
||||
return actors.FirstOrDefault(u => world.FindAliveCombatantActorsInCircle(u.CenterLocation, shroudRange).All(a => !a.HasTrait<CreatesShroud>()));
|
||||
return actors.FirstOrDefault(u => world.FindAliveCombatantActorsInCircle(u.CenterPosition, WRange.FromCells(shroudRange)).All(a => !a.HasTrait<CreatesShroud>()));
|
||||
}
|
||||
|
||||
void AttackNearestAlliedActor(Actor self)
|
||||
@@ -137,7 +137,7 @@ namespace OpenRA.Mods.RA.Missions
|
||||
var enemies = world.Actors.Where(u => u.AppearsHostileTo(self) && (u.Owner == allies)
|
||||
&& ((u.HasTrait<Building>() && !u.HasTrait<Wall>()) || u.HasTrait<Mobile>()) && u.IsInWorld && !u.IsDead());
|
||||
|
||||
var enemy = FirstUnshroudedOrDefault(enemies.OrderBy(u => (self.CenterLocation - u.CenterLocation).LengthSquared), world, 20);
|
||||
var enemy = FirstUnshroudedOrDefault(enemies.OrderBy(u => (self.CenterPosition - u.CenterPosition).LengthSquared), world, 20);
|
||||
if (enemy != null)
|
||||
self.QueueActivity(new AttackMove.AttackMoveActivity(self, new Attack(Target.FromActor(enemy), WRange.FromCells(3))));
|
||||
}
|
||||
@@ -298,7 +298,7 @@ namespace OpenRA.Mods.RA.Missions
|
||||
|
||||
void ManageSovietUnits()
|
||||
{
|
||||
var units = world.FindAliveCombatantActorsInCircle(sovietrally.CenterLocation, 3)
|
||||
var units = world.FindAliveCombatantActorsInCircle(sovietrally.CenterPosition, WRange.FromCells(3))
|
||||
.Where(u => u.IsIdle && u.HasTrait<IMove>() && u.HasTrait<AttackBase>() && u.Owner == soviets);
|
||||
if (units.Count() >= sovietAttackGroupSize)
|
||||
{
|
||||
@@ -332,7 +332,7 @@ namespace OpenRA.Mods.RA.Missions
|
||||
{
|
||||
foreach (var rallyPoint in sovietrallypoints)
|
||||
{
|
||||
var units = world.FindAliveCombatantActorsInCircle(Util.CenterOfCell(rallyPoint), 10)
|
||||
var units = world.FindAliveCombatantActorsInCircle(rallyPoint.CenterPosition, WRange.FromCells(10))
|
||||
.Where(u => u.IsIdle && u.HasTrait<Mobile>() && u.HasTrait<AttackBase>() && u.Owner == soviets);
|
||||
if (units.Count() >= SovietGroupSize)
|
||||
{
|
||||
@@ -343,7 +343,7 @@ namespace OpenRA.Mods.RA.Missions
|
||||
|
||||
var scatteredUnits = world.Actors.Where(u => u.IsInWorld && !u.IsDead() && u.HasTrait<Mobile>() && u.IsIdle && u.Owner == soviets)
|
||||
.Except(world.WorldActor.Trait<SpawnMapActors>().Actors.Values)
|
||||
.Except(sovietrallypoints.SelectMany(rp => world.FindAliveCombatantActorsInCircle(Util.CenterOfCell(rp), 10)));
|
||||
.Except(sovietrallypoints.SelectMany(rp => world.FindAliveCombatantActorsInCircle(rp.CenterPosition, WRange.FromCells(10))));
|
||||
|
||||
foreach (var unit in scatteredUnits)
|
||||
AttackNearestAlliedActor(unit);
|
||||
|
||||
@@ -76,7 +76,7 @@ namespace OpenRA.Mods.RA.Orders
|
||||
|
||||
var actorInfo = Rules.Info[Building];
|
||||
foreach (var dec in actorInfo.Traits.WithInterface<IPlaceBuildingDecoration>())
|
||||
dec.Render(wr, world, actorInfo, Traits.Util.CenterOfCell(position)); /* hack hack */
|
||||
dec.Render(wr, world, actorInfo, position.CenterPosition); /* hack hack */
|
||||
|
||||
var cells = new Dictionary<CPos, bool>();
|
||||
// Linebuild for walls.
|
||||
|
||||
@@ -109,7 +109,7 @@ namespace OpenRA.Mods.RA
|
||||
|
||||
IEnumerable<Actor> UnitsInRange()
|
||||
{
|
||||
return Self.World.FindUnitsInCircle(Self.CenterLocation, Game.CellSize * Info.Range)
|
||||
return Self.World.FindActorsInCircle(Self.CenterPosition, WRange.FromCells(Info.Range))
|
||||
.Where(a => a.IsInWorld && a != Self && !a.Destroyed)
|
||||
.Where(a => !a.Owner.NonCombatant);
|
||||
}
|
||||
@@ -141,7 +141,7 @@ namespace OpenRA.Mods.RA
|
||||
// TODO exclude other NeutralActor that arent permanent
|
||||
Actor GetInRange(Actor self)
|
||||
{
|
||||
return CaptorsInRange(self).ClosestTo( self.CenterLocation );
|
||||
return CaptorsInRange(self).ClosestTo(self);
|
||||
}
|
||||
|
||||
int CountPlayersNear(Actor self, Player ignoreMe)
|
||||
|
||||
@@ -26,7 +26,7 @@ namespace OpenRA.Mods.RA.Render
|
||||
|
||||
public override object Create(ActorInitializer init) { return new RenderBuilding(init, this);}
|
||||
|
||||
public void Render(WorldRenderer wr, World w, ActorInfo ai, PPos centerLocation)
|
||||
public void Render(WorldRenderer wr, World w, ActorInfo ai, WPos centerPosition)
|
||||
{
|
||||
if (!ai.Traits.Get<BuildingInfo>().RequiresBaseProvider)
|
||||
return;
|
||||
|
||||
@@ -47,7 +47,8 @@ namespace OpenRA.Mods.RA.Render
|
||||
|
||||
if (!hasTicked)
|
||||
{
|
||||
var adjWalls = self.World.FindUnits(self.CenterLocation - PVecInt.OneCell, self.CenterLocation + PVecInt.OneCell)
|
||||
var vec = new CVec(1, 1);
|
||||
var adjWalls = self.World.FindActorsInBox(self.Location - vec, self.Location + vec)
|
||||
.Where(a => a.Info == self.Info && a != self);
|
||||
|
||||
foreach (var w in adjWalls)
|
||||
|
||||
@@ -24,7 +24,7 @@ namespace OpenRA.Mods.RA
|
||||
|
||||
wr.DrawRangeCircleWithContrast(
|
||||
Color.FromArgb(128, Color.LimeGreen),
|
||||
self.CenterLocation.ToFloat2(), self.Info.Traits.Get<DetectCloakedInfo>().Range,
|
||||
wr.ScreenPxPosition(self.CenterPosition), self.Info.Traits.Get<DetectCloakedInfo>().Range,
|
||||
Color.FromArgb(96, Color.Black),
|
||||
1);
|
||||
}
|
||||
|
||||
@@ -17,15 +17,15 @@ namespace OpenRA.Mods.RA
|
||||
//todo: remove all the Render*Circle duplication
|
||||
class RenderJammerCircleInfo : TraitInfo<RenderJammerCircle>, IPlaceBuildingDecoration
|
||||
{
|
||||
public void Render(WorldRenderer wr, World w, ActorInfo ai, PPos centerLocation)
|
||||
public void Render(WorldRenderer wr, World w, ActorInfo ai, WPos centerPosition)
|
||||
{
|
||||
var jamsMissiles = ai.Traits.GetOrDefault<JamsMissilesInfo>();
|
||||
if (jamsMissiles != null)
|
||||
RenderJammerCircle.DrawRangeCircle(wr, centerLocation.ToFloat2(), jamsMissiles.Range, Color.Red);
|
||||
RenderJammerCircle.DrawRangeCircle(wr, centerPosition, jamsMissiles.Range, Color.Red);
|
||||
|
||||
var jamsRadar = ai.Traits.GetOrDefault<JamsRadarInfo>();
|
||||
if (jamsRadar != null)
|
||||
RenderJammerCircle.DrawRangeCircle(wr, centerLocation.ToFloat2(), jamsRadar.Range, Color.Blue);
|
||||
RenderJammerCircle.DrawRangeCircle(wr, centerPosition, jamsRadar.Range, Color.Blue);
|
||||
|
||||
foreach (var a in w.ActorsWithTrait<RenderJammerCircle>())
|
||||
if (a.Actor.Owner == a.Actor.World.LocalPlayer)
|
||||
@@ -42,18 +42,18 @@ namespace OpenRA.Mods.RA
|
||||
|
||||
var jamsMissiles = self.Info.Traits.GetOrDefault<JamsMissilesInfo>();
|
||||
if (jamsMissiles != null)
|
||||
DrawRangeCircle(wr, self.CenterLocation.ToFloat2(), jamsMissiles.Range, Color.Red);
|
||||
DrawRangeCircle(wr, self.CenterPosition, jamsMissiles.Range, Color.Red);
|
||||
|
||||
var jamsRadar = self.Info.Traits.GetOrDefault<JamsRadarInfo>();
|
||||
if (jamsRadar != null)
|
||||
DrawRangeCircle(wr, self.CenterLocation.ToFloat2(), jamsRadar.Range, Color.Blue);
|
||||
DrawRangeCircle(wr, self.CenterPosition, jamsRadar.Range, Color.Blue);
|
||||
}
|
||||
|
||||
public static void DrawRangeCircle(WorldRenderer wr, float2 location, int range, Color color)
|
||||
public static void DrawRangeCircle(WorldRenderer wr, WPos pos, int range, Color color)
|
||||
{
|
||||
wr.DrawRangeCircleWithContrast(
|
||||
Color.FromArgb(128, color),
|
||||
location,
|
||||
wr.ScreenPxPosition(pos),
|
||||
range,
|
||||
Color.FromArgb(96, Color.Black),
|
||||
1);
|
||||
|
||||
@@ -17,17 +17,17 @@ namespace OpenRA.Mods.RA
|
||||
{
|
||||
public interface IPlaceBuildingDecoration
|
||||
{
|
||||
void Render(WorldRenderer wr, World w, ActorInfo ai, PPos centerLocation);
|
||||
void Render(WorldRenderer wr, World w, ActorInfo ai, WPos centerPosition);
|
||||
}
|
||||
|
||||
class RenderRangeCircleInfo : TraitInfo<RenderRangeCircle>, IPlaceBuildingDecoration
|
||||
{
|
||||
public readonly string RangeCircleType = null;
|
||||
|
||||
public void Render(WorldRenderer wr, World w, ActorInfo ai, PPos centerLocation)
|
||||
public void Render(WorldRenderer wr, World w, ActorInfo ai, WPos centerPosition)
|
||||
{
|
||||
wr.DrawRangeCircleWithContrast(
|
||||
Color.FromArgb(128, Color.Yellow), centerLocation.ToFloat2(),
|
||||
Color.FromArgb(128, Color.Yellow), wr.ScreenPxPosition(centerPosition),
|
||||
ai.Traits.WithInterface<ArmamentInfo>()
|
||||
.Select(a => Rules.Weapons[a.Weapon.ToLowerInvariant()].Range).Max(),
|
||||
Color.FromArgb(96, Color.Black), 1
|
||||
@@ -51,7 +51,7 @@ namespace OpenRA.Mods.RA
|
||||
var pxRange = self.Trait<AttackBase>().GetMaximumRange().Range / 1024f;
|
||||
wr.DrawRangeCircleWithContrast(
|
||||
Color.FromArgb(128, Color.Yellow),
|
||||
self.CenterLocation.ToFloat2(), pxRange,
|
||||
wr.ScreenPxPosition(self.CenterPosition), pxRange,
|
||||
Color.FromArgb(96, Color.Black),
|
||||
1);
|
||||
}
|
||||
|
||||
@@ -16,11 +16,11 @@ namespace OpenRA.Mods.RA
|
||||
{
|
||||
class RenderShroudCircleInfo : TraitInfo<RenderShroudCircle>, IPlaceBuildingDecoration
|
||||
{
|
||||
public void Render(WorldRenderer wr, World w, ActorInfo ai, PPos centerLocation)
|
||||
public void Render(WorldRenderer wr, World w, ActorInfo ai, WPos centerPosition)
|
||||
{
|
||||
wr.DrawRangeCircleWithContrast(
|
||||
Color.FromArgb(128, Color.Cyan),
|
||||
centerLocation.ToFloat2(),
|
||||
wr.ScreenPxPosition(centerPosition),
|
||||
ai.Traits.Get<CreatesShroudInfo>().Range,
|
||||
Color.FromArgb(96, Color.Black),
|
||||
1);
|
||||
@@ -40,7 +40,7 @@ namespace OpenRA.Mods.RA
|
||||
|
||||
wr.DrawRangeCircleWithContrast(
|
||||
Color.FromArgb(128, Color.Cyan),
|
||||
self.CenterLocation.ToFloat2(), self.Info.Traits.Get<CreatesShroudInfo>().Range,
|
||||
wr.ScreenPxPosition(self.CenterPosition), self.Info.Traits.Get<CreatesShroudInfo>().Range,
|
||||
Color.FromArgb(96, Color.Black),
|
||||
1);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user