remove HackyAI -> MPStartLocations dep; implement aggro as per alzeih's old patch
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user