diff --git a/OpenRA.Mods.RA/Player/ClassicProductionQueue.cs b/OpenRA.Mods.RA/Player/ClassicProductionQueue.cs index a77bc145a6..d2c6a6d377 100755 --- a/OpenRA.Mods.RA/Player/ClassicProductionQueue.cs +++ b/OpenRA.Mods.RA/Player/ClassicProductionQueue.cs @@ -8,6 +8,7 @@ */ #endregion +using System; using System.Collections.Generic; using System.Linq; using OpenRA.Mods.RA.Buildings; @@ -71,5 +72,30 @@ namespace OpenRA.Mods.RA } return false; } + + public override int GetBuildTime(String unitString) + { + var unit = Rules.Info[unitString]; + if (unit == null || ! unit.Traits.Contains()) + return 0; + + if (self.World.LobbyInfo.GlobalSettings.AllowCheats && self.Owner.PlayerActor.Trait().FastBuild) return 0; + var cost = unit.Traits.Contains() ? unit.Traits.Get().Cost : 0; + + var selfsameBuildings = self.World.ActorsWithTrait() + .Where(p => p.Trait.Info.Produces.Contains(unit.Traits.Get().Queue)) + .Where(p => p.Actor.Owner == self.Owner).ToArray(); + + var speedUp = 1 - (selfsameBuildings.First().Trait.Info.SpeedUp * (selfsameBuildings.Count() - 1)) + .Clamp(0, selfsameBuildings.First().Trait.Info.MaxSpeedUp); + + var time = cost + * Info.BuildSpeed + * (25 * 60) /* frames per min */ + * speedUp + / 1000; + + return (int) time; + } } } diff --git a/OpenRA.Mods.RA/Player/ProductionQueue.cs b/OpenRA.Mods.RA/Player/ProductionQueue.cs index 620ff27bb3..d682510dc5 100755 --- a/OpenRA.Mods.RA/Player/ProductionQueue.cs +++ b/OpenRA.Mods.RA/Player/ProductionQueue.cs @@ -253,7 +253,7 @@ namespace OpenRA.Mods.RA } } - public int GetBuildTime(String unitString) + virtual public int GetBuildTime(String unitString) { var unit = Rules.Info[unitString]; if (unit == null || ! unit.Traits.Contains()) @@ -263,7 +263,7 @@ namespace OpenRA.Mods.RA var cost = unit.Traits.Contains() ? unit.Traits.Get().Cost : 0; var time = cost * Info.BuildSpeed - * (25 * 60) /* frames per min */ /* todo: build acceleration, if we do that */ + * (25 * 60) /* frames per min */ / 1000; if (unit.Traits.Contains()) diff --git a/OpenRA.Mods.RA/Production.cs b/OpenRA.Mods.RA/Production.cs index 16325451a0..9da5edf268 100755 --- a/OpenRA.Mods.RA/Production.cs +++ b/OpenRA.Mods.RA/Production.cs @@ -22,6 +22,9 @@ namespace OpenRA.Mods.RA { public readonly string[] Produces = { }; + public readonly float SpeedUp = 0; + public readonly float MaxSpeedUp = 0; + public virtual object Create(ActorInitializer init) { return new Production(this); } }