From 88ea7f1c7e7f6d375d8ae5d6ae7d17a2707d0048 Mon Sep 17 00:00:00 2001 From: ScottNZ Date: Sun, 27 Jul 2014 14:09:14 +1200 Subject: [PATCH] Take BuiltAt overrides into account when calculating speedup - prevent kennels contributing to rifle infantry speedup for example --- .../Player/ClassicProductionQueue.cs | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/OpenRA.Mods.RA/Player/ClassicProductionQueue.cs b/OpenRA.Mods.RA/Player/ClassicProductionQueue.cs index c61a30fb9f..c25deaabfe 100644 --- a/OpenRA.Mods.RA/Player/ClassicProductionQueue.cs +++ b/OpenRA.Mods.RA/Player/ClassicProductionQueue.cs @@ -8,7 +8,6 @@ */ #endregion -using System; using System.Collections.Generic; using System.Linq; using OpenRA.Mods.RA.Buildings; @@ -76,8 +75,8 @@ namespace OpenRA.Mods.RA protected override bool BuildUnit(string name) { // Find a production structure to build this actor - var info = self.World.Map.Rules.Actors[name]; - var bi = info.Traits.GetOrDefault(); + var ai = self.World.Map.Rules.Actors[name]; + var bi = ai.Traits.GetOrDefault(); // Some units may request a specific production type, which is ignored if the AllTech cheat is enabled var type = bi == null || developerMode.AllTech ? Info.Type : bi.BuildAtProductionType ?? Info.Type; @@ -96,7 +95,7 @@ namespace OpenRA.Mods.RA foreach (var p in producers.Where(p => !p.Actor.IsDisabled())) { - if (p.Trait.Produce(p.Actor, info, Race)) + if (p.Trait.Produce(p.Actor, ai, Race)) { FinishProduction(); return true; @@ -108,23 +107,24 @@ namespace OpenRA.Mods.RA public override int GetBuildTime(string unitString) { - var unit = self.World.Map.Rules.Actors[unitString]; - if (unit == null || !unit.Traits.Contains()) + var ai = self.World.Map.Rules.Actors[unitString]; + var bi = ai.Traits.GetOrDefault(); + if (bi == null) return 0; if (self.World.AllowDevCommands && self.Owner.PlayerActor.Trait().FastBuild) return 0; - var time = (int)(unit.GetBuildTime() * Info.BuildSpeed); + var time = (int)(ai.GetBuildTime() * Info.BuildSpeed); if (info.SpeedUp) { - var queues = unit.Traits.Get().Queue; - var selfsameBuildings = self.World.ActorsWithTrait() - .Where(p => p.Actor.Owner == self.Owner && p.Trait.Info.Produces.Intersect(queues).Any()) - .ToArray(); + var type = bi.BuildAtProductionType ?? info.Type; - var speedModifier = selfsameBuildings.Count().Clamp(1, info.BuildTimeSpeedReduction.Length) - 1; + var selfsameBuildingsCount = self.World.ActorsWithTrait() + .Count(p => p.Actor.Owner == self.Owner && p.Trait.Info.Produces.Contains(type)); + + var speedModifier = selfsameBuildingsCount.Clamp(1, info.BuildTimeSpeedReduction.Length) - 1; time = (time * info.BuildTimeSpeedReduction[speedModifier]) / 100; }