Support arbitrary per-player palettes. Will crash if I missed any cases that don't explicitly set the Renderable palette.

This commit is contained in:
Paul Chote
2011-05-03 22:21:31 +12:00
parent b937489f2d
commit 8f962853f9
12 changed files with 36 additions and 32 deletions

View File

@@ -27,7 +27,6 @@ namespace OpenRA
public int Deaths; public int Deaths;
public WinState WinState = WinState.Undefined; public WinState WinState = WinState.Undefined;
public readonly string Palette;
public readonly ColorRamp ColorRamp; public readonly ColorRamp ColorRamp;
public readonly string PlayerName; public readonly string PlayerName;
@@ -46,7 +45,6 @@ namespace OpenRA
{ {
World = world; World = world;
Index = index; Index = index;
Palette = "player" + index;
InternalName = pr.Name; InternalName = pr.Name;
PlayerRef = pr; PlayerRef = pr;

View File

@@ -20,14 +20,15 @@ namespace OpenRA.Traits
public readonly string[] OverrideTileset = null; public readonly string[] OverrideTileset = null;
public readonly string[] OverrideImage = null; public readonly string[] OverrideImage = null;
public readonly string Palette = null; public readonly string Palette = null;
public readonly string PlayerPalette = "player";
public readonly float Scale = 1f; public readonly float Scale = 1f;
public abstract object Create(ActorInitializer init); public abstract object Create(ActorInitializer init);
public virtual IEnumerable<Renderable> RenderPreview(ActorInfo building, string Tileset) public virtual IEnumerable<Renderable> RenderPreview(ActorInfo building, string Tileset, Player owner)
{ {
var anim = new Animation(RenderSimple.GetImage(building, Tileset), () => 0); var anim = new Animation(RenderSimple.GetImage(building, Tileset), () => 0);
anim.PlayRepeating("idle"); 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);
} }
} }
@@ -63,16 +64,16 @@ namespace OpenRA.Traits
Info = self.Info.Traits.Get<RenderSimpleInfo>(); Info = self.Info.Traits.Get<RenderSimpleInfo>();
} }
public string Palette(Player p) { return Info.Palette ?? Info.PlayerPalette+p.Index; }
public virtual IEnumerable<Renderable> Render( Actor self ) public virtual IEnumerable<Renderable> Render( Actor self )
{ {
foreach( var a in anims.Values ) foreach( var a in anims.Values )
if( a.DisableFunc == null || !a.DisableFunc() ) if( a.DisableFunc == null || !a.DisableFunc() )
{ {
Renderable ret = a.Image( self ); Renderable ret = a.Image( self ).WithPalette(Palette(self.Owner));
if (Info.Scale != 1f) if (Info.Scale != 1f)
ret = ret.WithScale(Info.Scale).WithPos(ret.Pos + 0.5f*ret.Sprite.size*(1 - Info.Scale)); 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;
} }
} }

View File

@@ -98,7 +98,7 @@ namespace OpenRA.Traits
public static Renderable Centered(Actor self, Sprite s, float2 location) 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; var loc = location - 0.5f * s.size;
return new Renderable(s, loc.Round(), pal, (int)self.CenterLocation.Y); return new Renderable(s, loc.Round(), pal, (int)self.CenterLocation.Y);

View File

@@ -162,11 +162,11 @@ namespace OpenRA.Mods.RA.Effects
var highPos = pos - new float2(0, GetAltitude()); 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 else
yield return new Renderable(anim.Image, pos - .5f * anim.Image.size, 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);
} }
} }

View File

@@ -19,23 +19,24 @@ namespace OpenRA.Mods.RA.Effects
{ {
readonly Animation anim; readonly Animation anim;
readonly float2 pos; readonly float2 pos;
readonly Player owner; readonly string palette;
public Corpse(Actor fromActor, int death) public Corpse(Actor fromActor, int death)
{ {
anim = new Animation(fromActor.TraitOrDefault<RenderSimple>().GetImage(fromActor)); var rs = fromActor.Trait<RenderSimple>();
palette = rs.Palette(fromActor.Owner);
anim = new Animation(rs.GetImage(fromActor));
anim.PlayThen("die{0}".F(death + 1), anim.PlayThen("die{0}".F(death + 1),
() => fromActor.World.AddFrameEndTask(w => w.Remove(this))); () => fromActor.World.AddFrameEndTask(w => w.Remove(this)));
pos = fromActor.CenterLocation; pos = fromActor.CenterLocation;
owner = fromActor.Owner;
} }
public void Tick( World world ) { anim.Tick(); } public void Tick( World world ) { anim.Tick(); }
public IEnumerable<Renderable> Render() public IEnumerable<Renderable> 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);
} }
} }
} }

View File

@@ -19,6 +19,7 @@ namespace OpenRA.Mods.RA.Effects
public class Parachute : IEffect public class Parachute : IEffect
{ {
readonly Animation anim; readonly Animation anim;
readonly string palette;
readonly Animation paraAnim; readonly Animation paraAnim;
readonly float2 location; readonly float2 location;
@@ -37,6 +38,7 @@ namespace OpenRA.Mods.RA.Effects
var rs = cargo.Trait<RenderSimple>(); var rs = cargo.Trait<RenderSimple>();
var image = rs.anim.Name; var image = rs.anim.Name;
palette = rs.Palette(owner);
anim = new Animation(image); anim = new Animation(image);
if (anim.HasSequence("idle")) if (anim.HasSequence("idle"))
@@ -70,8 +72,8 @@ namespace OpenRA.Mods.RA.Effects
{ {
var pos = location - new float2(0, altitude); 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, 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(anim.Image, pos - .5f * anim.Image.size, palette, 2);
yield return new Renderable(paraAnim.Image, pos - .5f * paraAnim.Image.size, owner.Palette, 3); yield return new Renderable(paraAnim.Image, pos - .5f * paraAnim.Image.size, palette, 3);
} }
} }
} }

View File

@@ -23,11 +23,12 @@ namespace OpenRA.Mods.RA.Effects
RA.RallyPoint rp; RA.RallyPoint rp;
public Animation flag = new Animation("rallypoint"); public Animation flag = new Animation("rallypoint");
public Animation circles = new Animation("rallypoint"); public Animation circles = new Animation("rallypoint");
readonly string palette;
public RallyPoint(Actor building) public RallyPoint(Actor building)
{ {
this.building = building; this.building = building;
rp = building.Trait<RA.RallyPoint>(); rp = building.Trait<RA.RallyPoint>();
palette = building.Trait<RenderSimple>().Palette(building.Owner);
flag.PlayRepeating("flag"); flag.PlayRepeating("flag");
circles.Play("circles"); circles.Play("circles");
} }
@@ -54,11 +55,11 @@ namespace OpenRA.Mods.RA.Effects
var pos = Traits.Util.CenterOfCell(rp.rallyPoint); var pos = Traits.Util.CenterOfCell(rp.rallyPoint);
yield return new Renderable(circles.Image, yield return new Renderable(circles.Image,
pos - .5f * circles.Image.size, pos - .5f * circles.Image.size,
building.Owner.Palette, (int)pos.Y); palette, (int)pos.Y);
yield return new Renderable(flag.Image, yield return new Renderable(flag.Image,
pos + new float2(-1,-17), pos + new float2(-1,-17),
building.Owner.Palette, (int)pos.Y); palette, (int)pos.Y);
} }
} }
} }

View File

@@ -30,7 +30,7 @@ namespace OpenRA.Mods.RA.Orders
Building = name; Building = name;
Preview = Rules.Info[Building].Traits.Get<RenderBuildingInfo>() Preview = Rules.Info[Building].Traits.Get<RenderBuildingInfo>()
.RenderPreview(Rules.Info[Building], producer.World.Map.Tileset); .RenderPreview(Rules.Info[Building], producer.World.Map.Tileset, producer.Owner);
} }
public IEnumerable<Order> Order(World world, int2 xy, MouseInput mi) public IEnumerable<Order> Order(World world, int2 xy, MouseInput mi)
@@ -87,7 +87,7 @@ namespace OpenRA.Mods.RA.Orders
{ {
foreach (var r in Preview) foreach (var r in Preview)
r.Sprite.DrawAt(Game.CellSize*topLeft + r.Pos, r.Sprite.DrawAt(Game.CellSize*topLeft + r.Pos,
wr.GetPaletteIndex(r.Palette ?? world.LocalPlayer.Palette), wr.GetPaletteIndex(r.Palette),
r.Scale*r.Sprite.size); r.Scale*r.Sprite.size);
var res = world.WorldActor.Trait<ResourceLayer>(); var res = world.WorldActor.Trait<ResourceLayer>();

View File

@@ -25,9 +25,9 @@ namespace OpenRA.Mods.RA.Render
public readonly float2 Origin = float2.Zero; public readonly float2 Origin = float2.Zero;
public override object Create(ActorInitializer init) { return new RenderBuilding(init, this);} public override object Create(ActorInitializer init) { return new RenderBuilding(init, this);}
public override IEnumerable<Renderable> RenderPreview(ActorInfo building, string Tileset) public override IEnumerable<Renderable> 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<RenderBuildingInfo>().Origin)); .Select(a => a.WithPos(a.Pos + building.Traits.Get<RenderBuildingInfo>().Origin));
} }
} }

View File

@@ -20,20 +20,21 @@ namespace OpenRA.Mods.RA.Render
public override object Create(ActorInitializer init) { return new RenderBuildingWarFactory( init, this ); } public override object Create(ActorInitializer init) { return new RenderBuildingWarFactory( init, this ); }
/* get around unverifiability */ /* get around unverifiability */
IEnumerable<Renderable> BaseBuildingPreview(ActorInfo building, string tileset) IEnumerable<Renderable> BaseBuildingPreview(ActorInfo building, string tileset, Player owner)
{ {
return base.RenderPreview(building, tileset); return base.RenderPreview(building, tileset, owner);
} }
public override IEnumerable<Renderable> RenderPreview(ActorInfo building, string Tileset) public override IEnumerable<Renderable> 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; yield return r;
var anim = new Animation(RenderSimple.GetImage(building, Tileset), () => 0); var anim = new Animation(RenderSimple.GetImage(building, Tileset), () => 0);
anim.PlayRepeating("idle-top"); anim.PlayRepeating("idle-top");
var rb = building.Traits.Get<RenderBuildingInfo>(); var rb = building.Traits.Get<RenderBuildingInfo>();
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);
} }
} }

View File

@@ -33,7 +33,7 @@ namespace OpenRA.Mods.RA.Render
public IEnumerable<Renderable> ModifyRender(Actor self, IEnumerable<Renderable> r) public IEnumerable<Renderable> ModifyRender(Actor self, IEnumerable<Renderable> 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) public override void Tick(Actor self)

View File

@@ -207,7 +207,7 @@ namespace OpenRA.Mods.RA
var targetCell = unit.Location + xy - sourceLocation; var targetCell = unit.Location + xy - sourceLocation;
foreach (var r in unit.Render()) foreach (var r in unit.Render())
r.Sprite.DrawAt(r.Pos - Traits.Util.CenterOfCell(unit.Location) + Traits.Util.CenterOfCell(targetCell), 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); r.Scale*r.Sprite.size);
} }