diff --git a/OpenRA.Game/Player.cs b/OpenRA.Game/Player.cs index ccc9bd3d74..9e16d52355 100644 --- a/OpenRA.Game/Player.cs +++ b/OpenRA.Game/Player.cs @@ -27,7 +27,6 @@ namespace OpenRA public int Deaths; public WinState WinState = WinState.Undefined; - public readonly string Palette; public readonly ColorRamp ColorRamp; public readonly string PlayerName; @@ -46,7 +45,6 @@ namespace OpenRA { World = world; Index = index; - Palette = "player" + index; InternalName = pr.Name; PlayerRef = pr; diff --git a/OpenRA.Game/Traits/Render/RenderSimple.cs b/OpenRA.Game/Traits/Render/RenderSimple.cs index 29c5e03b1c..bacd54e00b 100755 --- a/OpenRA.Game/Traits/Render/RenderSimple.cs +++ b/OpenRA.Game/Traits/Render/RenderSimple.cs @@ -20,14 +20,15 @@ namespace OpenRA.Traits public readonly string[] OverrideTileset = null; public readonly string[] OverrideImage = null; public readonly string Palette = null; + public readonly string PlayerPalette = "player"; public readonly float Scale = 1f; public abstract object Create(ActorInitializer init); - public virtual IEnumerable RenderPreview(ActorInfo building, string Tileset) + public virtual IEnumerable RenderPreview(ActorInfo building, string Tileset, Player owner) { var anim = new Animation(RenderSimple.GetImage(building, Tileset), () => 0); anim.PlayRepeating("idle"); - yield return new Renderable(anim.Image, 0.5f * anim.Image.size * (1 - Scale), Palette, 0, Scale); + yield return new Renderable(anim.Image, 0.5f * anim.Image.size * (1 - Scale), Palette ?? PlayerPalette+owner.Index, 0, Scale); } } @@ -62,17 +63,17 @@ namespace OpenRA.Traits anims.Add( "", new Animation( GetImage(self), baseFacing ) ); Info = self.Info.Traits.Get(); } - + + public string Palette(Player p) { return Info.Palette ?? Info.PlayerPalette+p.Index; } public virtual IEnumerable Render( Actor self ) { - foreach( var a in anims.Values ) if( a.DisableFunc == null || !a.DisableFunc() ) { - Renderable ret = a.Image( self ); + Renderable ret = a.Image( self ).WithPalette(Palette(self.Owner)); if (Info.Scale != 1f) ret = ret.WithScale(Info.Scale).WithPos(ret.Pos + 0.5f*ret.Sprite.size*(1 - Info.Scale)); - yield return ( Info.Palette == null ) ? ret : ret.WithPalette(Info.Palette); + yield return ret; } } diff --git a/OpenRA.Game/Traits/Util.cs b/OpenRA.Game/Traits/Util.cs index b0636c987d..353645c9f3 100755 --- a/OpenRA.Game/Traits/Util.cs +++ b/OpenRA.Game/Traits/Util.cs @@ -98,7 +98,7 @@ namespace OpenRA.Traits public static Renderable Centered(Actor self, Sprite s, float2 location) { - var pal = self.Owner == null ? "player0" : self.Owner.Palette; + var pal = "player{0}".F(self.Owner == null ? 0 : self.Owner.Index); var loc = location - 0.5f * s.size; return new Renderable(s, loc.Round(), pal, (int)self.CenterLocation.Y); diff --git a/OpenRA.Mods.RA/Effects/Bullet.cs b/OpenRA.Mods.RA/Effects/Bullet.cs index a0c00f5a80..4b8d550bbe 100755 --- a/OpenRA.Mods.RA/Effects/Bullet.cs +++ b/OpenRA.Mods.RA/Effects/Bullet.cs @@ -162,11 +162,11 @@ namespace OpenRA.Mods.RA.Effects var highPos = pos - new float2(0, GetAltitude()); - yield return new Renderable(anim.Image, highPos - .5f * anim.Image.size, Args.firedBy.Owner.Palette, (int)pos.Y); + yield return new Renderable(anim.Image, highPos - .5f * anim.Image.size, "effect", (int)pos.Y); } else yield return new Renderable(anim.Image, pos - .5f * anim.Image.size, - Args.weapon.Underwater ? "shadow" : Args.firedBy.Owner.Palette, (int)pos.Y); + Args.weapon.Underwater ? "shadow" : "effect", (int)pos.Y); } } diff --git a/OpenRA.Mods.RA/Effects/Corpse.cs b/OpenRA.Mods.RA/Effects/Corpse.cs index fa31f1066c..48b2a539a5 100644 --- a/OpenRA.Mods.RA/Effects/Corpse.cs +++ b/OpenRA.Mods.RA/Effects/Corpse.cs @@ -19,23 +19,24 @@ namespace OpenRA.Mods.RA.Effects { readonly Animation anim; readonly float2 pos; - readonly Player owner; + readonly string palette; public Corpse(Actor fromActor, int death) { - anim = new Animation(fromActor.TraitOrDefault().GetImage(fromActor)); + var rs = fromActor.Trait(); + palette = rs.Palette(fromActor.Owner); + anim = new Animation(rs.GetImage(fromActor)); anim.PlayThen("die{0}".F(death + 1), () => fromActor.World.AddFrameEndTask(w => w.Remove(this))); pos = fromActor.CenterLocation; - owner = fromActor.Owner; } public void Tick( World world ) { anim.Tick(); } public IEnumerable Render() { - yield return new Renderable(anim.Image, pos - .5f * anim.Image.size, owner.Palette, (int)pos.Y); + yield return new Renderable(anim.Image, pos - .5f * anim.Image.size, palette, (int)pos.Y); } } } diff --git a/OpenRA.Mods.RA/Effects/Parachute.cs b/OpenRA.Mods.RA/Effects/Parachute.cs index da756c3cdf..2ac1a04d2f 100644 --- a/OpenRA.Mods.RA/Effects/Parachute.cs +++ b/OpenRA.Mods.RA/Effects/Parachute.cs @@ -19,6 +19,7 @@ namespace OpenRA.Mods.RA.Effects public class Parachute : IEffect { readonly Animation anim; + readonly string palette; readonly Animation paraAnim; readonly float2 location; @@ -37,7 +38,8 @@ namespace OpenRA.Mods.RA.Effects var rs = cargo.Trait(); var image = rs.anim.Name; - + palette = rs.Palette(owner); + anim = new Animation(image); if (anim.HasSequence("idle")) anim.PlayFetchIndex("idle", () => 0); @@ -70,8 +72,8 @@ namespace OpenRA.Mods.RA.Effects { var pos = location - new float2(0, altitude); yield return new Renderable(anim.Image, location - .5f * anim.Image.size, "shadow", 0); - yield return new Renderable(anim.Image, pos - .5f * anim.Image.size, owner.Palette, 2); - yield return new Renderable(paraAnim.Image, pos - .5f * paraAnim.Image.size, owner.Palette, 3); + yield return new Renderable(anim.Image, pos - .5f * anim.Image.size, palette, 2); + yield return new Renderable(paraAnim.Image, pos - .5f * paraAnim.Image.size, palette, 3); } } } diff --git a/OpenRA.Mods.RA/Effects/RallyPoint.cs b/OpenRA.Mods.RA/Effects/RallyPoint.cs index 1f90699f0c..91b2495f57 100755 --- a/OpenRA.Mods.RA/Effects/RallyPoint.cs +++ b/OpenRA.Mods.RA/Effects/RallyPoint.cs @@ -23,11 +23,12 @@ namespace OpenRA.Mods.RA.Effects RA.RallyPoint rp; public Animation flag = new Animation("rallypoint"); public Animation circles = new Animation("rallypoint"); - + readonly string palette; public RallyPoint(Actor building) { this.building = building; rp = building.Trait(); + palette = building.Trait().Palette(building.Owner); flag.PlayRepeating("flag"); circles.Play("circles"); } @@ -54,11 +55,11 @@ namespace OpenRA.Mods.RA.Effects var pos = Traits.Util.CenterOfCell(rp.rallyPoint); yield return new Renderable(circles.Image, pos - .5f * circles.Image.size, - building.Owner.Palette, (int)pos.Y); + palette, (int)pos.Y); yield return new Renderable(flag.Image, pos + new float2(-1,-17), - building.Owner.Palette, (int)pos.Y); + palette, (int)pos.Y); } } } diff --git a/OpenRA.Mods.RA/Orders/PlaceBuildingOrderGenerator.cs b/OpenRA.Mods.RA/Orders/PlaceBuildingOrderGenerator.cs index 3f863d265a..d893a8e4e4 100755 --- a/OpenRA.Mods.RA/Orders/PlaceBuildingOrderGenerator.cs +++ b/OpenRA.Mods.RA/Orders/PlaceBuildingOrderGenerator.cs @@ -30,7 +30,7 @@ namespace OpenRA.Mods.RA.Orders Building = name; Preview = Rules.Info[Building].Traits.Get() - .RenderPreview(Rules.Info[Building], producer.World.Map.Tileset); + .RenderPreview(Rules.Info[Building], producer.World.Map.Tileset, producer.Owner); } public IEnumerable Order(World world, int2 xy, MouseInput mi) @@ -87,7 +87,7 @@ namespace OpenRA.Mods.RA.Orders { foreach (var r in Preview) r.Sprite.DrawAt(Game.CellSize*topLeft + r.Pos, - wr.GetPaletteIndex(r.Palette ?? world.LocalPlayer.Palette), + wr.GetPaletteIndex(r.Palette), r.Scale*r.Sprite.size); var res = world.WorldActor.Trait(); diff --git a/OpenRA.Mods.RA/Render/RenderBuilding.cs b/OpenRA.Mods.RA/Render/RenderBuilding.cs index be3c2b15e6..c87935ac4c 100755 --- a/OpenRA.Mods.RA/Render/RenderBuilding.cs +++ b/OpenRA.Mods.RA/Render/RenderBuilding.cs @@ -25,9 +25,9 @@ namespace OpenRA.Mods.RA.Render public readonly float2 Origin = float2.Zero; public override object Create(ActorInitializer init) { return new RenderBuilding(init, this);} - public override IEnumerable RenderPreview(ActorInfo building, string Tileset) + public override IEnumerable RenderPreview(ActorInfo building, string Tileset, Player owner) { - return base.RenderPreview(building, Tileset) + return base.RenderPreview(building, Tileset, owner) .Select(a => a.WithPos(a.Pos + building.Traits.Get().Origin)); } } diff --git a/OpenRA.Mods.RA/Render/RenderBuildingWarFactory.cs b/OpenRA.Mods.RA/Render/RenderBuildingWarFactory.cs index d5dd3f32c3..815ae36ff9 100755 --- a/OpenRA.Mods.RA/Render/RenderBuildingWarFactory.cs +++ b/OpenRA.Mods.RA/Render/RenderBuildingWarFactory.cs @@ -20,20 +20,21 @@ namespace OpenRA.Mods.RA.Render public override object Create(ActorInitializer init) { return new RenderBuildingWarFactory( init, this ); } /* get around unverifiability */ - IEnumerable BaseBuildingPreview(ActorInfo building, string tileset) + IEnumerable BaseBuildingPreview(ActorInfo building, string tileset, Player owner) { - return base.RenderPreview(building, tileset); + return base.RenderPreview(building, tileset, owner); } - public override IEnumerable RenderPreview(ActorInfo building, string Tileset) + public override IEnumerable RenderPreview(ActorInfo building, string Tileset, Player owner) { - foreach (var r in BaseBuildingPreview(building, Tileset)) + var p = BaseBuildingPreview(building, Tileset, owner); + foreach (var r in p) yield return r; var anim = new Animation(RenderSimple.GetImage(building, Tileset), () => 0); anim.PlayRepeating("idle-top"); var rb = building.Traits.Get(); - yield return new Renderable(anim.Image, rb.Origin + 0.5f*anim.Image.size*(1 - Scale), rb.Palette, 0, Scale); + yield return new Renderable(anim.Image, rb.Origin + 0.5f*anim.Image.size*(1 - Scale), p.First().Palette, 0, Scale); } } diff --git a/OpenRA.Mods.RA/Render/RenderSpy.cs b/OpenRA.Mods.RA/Render/RenderSpy.cs index fc97095735..c20e97903f 100755 --- a/OpenRA.Mods.RA/Render/RenderSpy.cs +++ b/OpenRA.Mods.RA/Render/RenderSpy.cs @@ -33,7 +33,7 @@ namespace OpenRA.Mods.RA.Render public IEnumerable ModifyRender(Actor self, IEnumerable r) { - return spy.disguisedAsPlayer != null ? r.Select(a => a.WithPalette(spy.disguisedAsPlayer.Palette)) : r; + return spy.disguisedAsPlayer != null ? r.Select(a => a.WithPalette(Palette(spy.disguisedAsPlayer))) : r; } public override void Tick(Actor self) diff --git a/OpenRA.Mods.RA/SupportPowers/ChronoshiftPower.cs b/OpenRA.Mods.RA/SupportPowers/ChronoshiftPower.cs index 4bed29f825..dc1ba292b1 100755 --- a/OpenRA.Mods.RA/SupportPowers/ChronoshiftPower.cs +++ b/OpenRA.Mods.RA/SupportPowers/ChronoshiftPower.cs @@ -207,7 +207,7 @@ namespace OpenRA.Mods.RA var targetCell = unit.Location + xy - sourceLocation; foreach (var r in unit.Render()) r.Sprite.DrawAt(r.Pos - Traits.Util.CenterOfCell(unit.Location) + Traits.Util.CenterOfCell(targetCell), - wr.GetPaletteIndex(r.Palette ?? unit.Owner.Palette), + wr.GetPaletteIndex(r.Palette), r.Scale*r.Sprite.size); }