remove HackyAI -> MPStartLocations dep; implement aggro as per alzeih's old patch

This commit is contained in:
Chris Forbes
2011-10-30 15:12:15 +13:00
parent 4dc3013cd0
commit 986bf039fa

View File

@@ -59,6 +59,8 @@ namespace OpenRA.Mods.RA.AI
/* a pile of hacks, which control a local player on the host. */ /* a pile of hacks, which control a local player on the host. */
class Enemy { public int Aggro; }
class HackyAI : ITick, IBot, INotifyDamage class HackyAI : ITick, IBot, INotifyDamage
{ {
bool enabled; bool enabled;
@@ -66,17 +68,19 @@ namespace OpenRA.Mods.RA.AI
public Player p; public Player p;
PowerManager playerPower; PowerManager playerPower;
readonly BuildingInfo rallypointTestBuilding; // temporary hack readonly BuildingInfo rallypointTestBuilding; // temporary hack
readonly HackyAIInfo Info;
Cache<Player,Enemy> aggro = new Cache<Player, Enemy>( _ => new Enemy() );
int2 baseCenter; int2 baseCenter;
XRandom random = new XRandom(); //we do not use the synced random number generator. XRandom random = new XRandom(); //we do not use the synced random number generator.
BaseBuilder[] builders; BaseBuilder[] builders;
const int MaxBaseDistance = 15;
public const int feedbackTime = 30; // ticks; = a bit over 1s. must be >= netlag. public const int feedbackTime = 30; // ticks; = a bit over 1s. must be >= netlag.
public World world { get { return p.PlayerActor.World; } } public World world { get { return p.PlayerActor.World; } }
IBotInfo IBot.Info { get { return this.Info; } } IBotInfo IBot.Info { get { return this.Info; } }
readonly HackyAIInfo Info;
public HackyAI(HackyAIInfo Info) public HackyAI(HackyAIInfo Info)
{ {
this.Info = Info; this.Info = Info;
@@ -84,8 +88,6 @@ namespace OpenRA.Mods.RA.AI
this.rallypointTestBuilding = Rules.Info[Info.RallypointTestBuilding].Traits.Get<BuildingInfo>(); this.rallypointTestBuilding = Rules.Info[Info.RallypointTestBuilding].Traits.Get<BuildingInfo>();
} }
const int MaxBaseDistance = 15;
public static void BotDebug(string s, params object[] args) public static void BotDebug(string s, params object[] args)
{ {
if (Game.Settings.Debug.BotDebug) if (Game.Settings.Debug.BotDebug)
@@ -180,9 +182,7 @@ namespace OpenRA.Mods.RA.AI
ticks++; ticks++;
if (ticks == 10) if (ticks == 10)
{
DeployMcv(self); DeployMcv(self);
}
if (ticks % feedbackTime == 0) if (ticks % feedbackTime == 0)
foreach (var q in Info.UnitQueues) foreach (var q in Info.UnitQueues)
@@ -206,16 +206,33 @@ namespace OpenRA.Mods.RA.AI
int2? ChooseEnemyTarget() int2? ChooseEnemyTarget()
{ {
// Criteria for picking an enemy: var liveEnemies = world.Players
// 1. not ourself. .Where(q => p != q && p.Stances[q] == Stance.Enemy)
// 2. enemy. .Where(q => p.WinState == WinState.Undefined && q.WinState == WinState.Undefined);
// 3. not dead.
var possibleTargets = world.WorldActor.Trait<MPStartLocations>().Start
.Where(kv => kv.Key != p && p.Stances[kv.Key] == Stance.Enemy
&& p.WinState == WinState.Undefined)
.Select(kv => kv.Value);
return possibleTargets.Any() ? possibleTargets.Random(random) : (int2?)null; var leastLikedEnemies = liveEnemies
.GroupBy(e => aggro[e])
.OrderByDescending(g => g.Key)
.FirstOrDefault();
if (leastLikedEnemies == null)
return null;
var enemy = leastLikedEnemies != null ? leastLikedEnemies.Random(random) : null;
/* bump the aggro slightly to avoid changing our mind */
if (leastLikedEnemies.Count() > 1)
aggro[enemy].Aggro++;
/* pick something worth attacking owned by that player */
var target = world.Actors
.Where(a => a.Owner == enemy && a.HasTrait<IOccupySpace>())
.Random(random);
if (target == null)
return null;
return target.Location;
} }
int assignRolesTicks = 0; int assignRolesTicks = 0;
@@ -432,6 +449,9 @@ namespace OpenRA.Mods.RA.AI
world.IssueOrder(new Order("RepairBuilding", self.Owner.PlayerActor, false) world.IssueOrder(new Order("RepairBuilding", self.Owner.PlayerActor, false)
{ TargetActor = self }); { TargetActor = self });
} }
if (e.Attacker != null && e.Damage > 0)
aggro[e.Attacker.Owner].Aggro += e.Damage;
} }
} }
} }