Add a nearEnough field for RallyPoints (to be used as an argument for their AttackMove activities) so the Soviets don't get stuck on their rally point, and scatter the units a bit before they attack
This commit is contained in:
@@ -16,11 +16,11 @@ using OpenRA.FileFormats;
|
||||
using OpenRA.Mods.RA.Activities;
|
||||
using OpenRA.Mods.RA.Air;
|
||||
using OpenRA.Mods.RA.Buildings;
|
||||
using OpenRA.Mods.RA.Effects;
|
||||
using OpenRA.Mods.RA.Move;
|
||||
using OpenRA.Network;
|
||||
using OpenRA.Traits;
|
||||
using OpenRA.Widgets;
|
||||
using Gfx = OpenRA.Graphics;
|
||||
using OpenRA.Mods.RA.Effects;
|
||||
|
||||
namespace OpenRA.Mods.RA.Missions
|
||||
{
|
||||
@@ -237,17 +237,18 @@ namespace OpenRA.Mods.RA.Missions
|
||||
|
||||
void ManageSovietUnits()
|
||||
{
|
||||
var idleSovietUnitsAtRP = ForcesNearLocation(sovietRallyPoint.CenterLocation, 3).Where(a => a.Owner == soviets && a.IsIdle);
|
||||
var idleSovietUnitsAtRP = ForcesNearLocation(sovietRallyPoint.CenterLocation, 3).Where(a => a.Owner == soviets && a.IsIdle && a.HasTrait<Mobile>());
|
||||
if (idleSovietUnitsAtRP.Count() >= SovietGroupSize)
|
||||
{
|
||||
var firstIdleUnit = idleSovietUnitsAtRP.FirstOrDefault();
|
||||
if (firstIdleUnit != null)
|
||||
var firstUnit = idleSovietUnitsAtRP.FirstOrDefault();
|
||||
if (firstUnit != null)
|
||||
{
|
||||
var closestAlliedBuilding = ClosestAlliedBuilding(firstIdleUnit, 20);
|
||||
var closestAlliedBuilding = ClosestAlliedBuilding(firstUnit, 40);
|
||||
if (closestAlliedBuilding != null)
|
||||
{
|
||||
foreach (var unit in idleSovietUnitsAtRP)
|
||||
{
|
||||
unit.Trait<Mobile>().Nudge(unit, unit, true);
|
||||
unit.QueueActivity(new AttackMove.AttackMoveActivity(unit, new Move.Move(closestAlliedBuilding.Location, 3)));
|
||||
}
|
||||
}
|
||||
@@ -267,15 +268,17 @@ namespace OpenRA.Mods.RA.Missions
|
||||
Actor ClosestAlliedBuilding(Actor actor, int range)
|
||||
{
|
||||
return BuildingsNearLocation(actor.CenterLocation, range)
|
||||
.Where(a => a.Owner == allies2)
|
||||
.OrderBy(a => (actor.Location - a.Location).LengthSquared)
|
||||
.FirstOrDefault();
|
||||
.Where(a => a.Owner == allies2)
|
||||
.OrderBy(a => (actor.Location - a.Location).LengthSquared)
|
||||
.FirstOrDefault();
|
||||
}
|
||||
|
||||
void InitializeSovietFactories()
|
||||
{
|
||||
sovietBarracks.Trait<RallyPoint>().rallyPoint = sovietRallyPoint.Location;
|
||||
sovietWarFactory.Trait<RallyPoint>().rallyPoint = sovietRallyPoint.Location;
|
||||
var sbrp = sovietBarracks.Trait<RallyPoint>();
|
||||
var swrp = sovietWarFactory.Trait<RallyPoint>();
|
||||
sbrp.rallyPoint = swrp.rallyPoint = sovietRallyPoint.Location;
|
||||
sbrp.nearEnough = swrp.nearEnough = 3;
|
||||
sovietBarracks.Trait<PrimaryBuilding>().SetPrimaryProducer(sovietBarracks, true);
|
||||
sovietWarFactory.Trait<PrimaryBuilding>().SetPrimaryProducer(sovietWarFactory, true);
|
||||
}
|
||||
|
||||
@@ -91,7 +91,7 @@ namespace OpenRA.Mods.RA
|
||||
if (mobile != null)
|
||||
{
|
||||
newUnit.QueueActivity(new AttackMove.AttackMoveActivity(
|
||||
newUnit, mobile.MoveTo(rp.rallyPoint, 1)));
|
||||
newUnit, mobile.MoveTo(rp.rallyPoint, rp.nearEnough)));
|
||||
return rp.rallyPoint;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#region Copyright & License Information
|
||||
#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
|
||||
@@ -24,6 +24,7 @@ namespace OpenRA.Mods.RA
|
||||
public class RallyPoint : IIssueOrder, IResolveOrder, ISync
|
||||
{
|
||||
[Sync] public CPos rallyPoint;
|
||||
public int nearEnough = 1;
|
||||
|
||||
public RallyPoint(Actor self)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user