diff --git a/OpenRA.Mods.RA/GainsExperience.cs b/OpenRA.Mods.RA/GainsExperience.cs index b462f5592f..277df341a0 100644 --- a/OpenRA.Mods.RA/GainsExperience.cs +++ b/OpenRA.Mods.RA/GainsExperience.cs @@ -13,7 +13,8 @@ using System.Linq; using OpenRA.GameRules; using OpenRA.Graphics; using OpenRA.Mods.RA.Effects; -using OpenRA.Traits; +using OpenRA.Traits; +using OpenRA.FileFormats; namespace OpenRA.Mods.RA { @@ -23,7 +24,7 @@ namespace OpenRA.Mods.RA public readonly float[] FirepowerModifier = { 1.1f, 1.15f, 1.2f, 1.5f }; public readonly float[] ArmorModifier = { 1.1f, 1.2f, 1.3f, 1.5f }; public readonly decimal[] SpeedModifier = { 1.1m, 1.15m, 1.2m, 1.5m }; - public object Create(ActorInitializer init) { return new GainsExperience(init.self, this); } + public object Create(ActorInitializer init) { return new GainsExperience(init, this); } } public class GainsExperience : IFirepowerModifier, ISpeedModifier, IDamageModifier, IRenderModifier, ISync @@ -33,14 +34,22 @@ namespace OpenRA.Mods.RA readonly GainsExperienceInfo Info; readonly Animation RankAnim; - public GainsExperience(Actor self, GainsExperienceInfo info) + public GainsExperience(ActorInitializer init, GainsExperienceInfo info) { - this.self = self; + self = init.self; this.Info = info; var cost = self.Info.Traits.Get().Cost; Levels = Info.CostThreshold.Select(t => (int)(t * cost)).ToArray(); RankAnim = new Animation("rank"); - RankAnim.PlayFetchIndex("rank", () => Level - 1); + RankAnim.PlayFetchIndex("rank", () => Level - 1); + + if (init.Contains()) + { + Experience = init.Get(); + + while (Level < Levels.Length && Experience >= Levels[Level]) + Level++; + } } [Sync] @@ -49,8 +58,8 @@ namespace OpenRA.Mods.RA int Level = 0; public void GiveOneLevel() - { - if (Level < Levels.Count()) + { + if (Level < Levels.Length) GiveExperience(Levels[Level] - Experience); } @@ -58,7 +67,7 @@ namespace OpenRA.Mods.RA { Experience += amount; - while (Level < Levels.Count() && Experience >= Levels[Level]) + while (Level < Levels.Length && Experience >= Levels[Level]) { Level++; @@ -102,5 +111,23 @@ namespace OpenRA.Mods.RA yield return new Renderable(RankAnim.Image, new float2(bounds.Right - 6, bounds.Bottom - 8), "effect", (int)self.CenterLocation.Y); } + } + + class ExperienceInit : IActorInit + { + [FieldFromYamlKey] + public readonly int value = 0; + + public ExperienceInit() { } + + public ExperienceInit(int init) + { + value = init; + } + + public int Value(World world) + { + return value; + } } }