From ecd4ff68a48c661e80b92c0c3a15038a4f3929d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Sat, 19 Jan 2013 23:54:53 +0100 Subject: [PATCH] speed up production if multiple buildings of the same type exist --- .../Player/ClassicProductionQueue.cs | 26 +++++++++++++++++++ OpenRA.Mods.RA/Player/ProductionQueue.cs | 4 +-- OpenRA.Mods.RA/Production.cs | 3 +++ 3 files changed, 31 insertions(+), 2 deletions(-) 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); } }