Merge remote-tracking branch 'pchote/cleanup'
This commit is contained in:
@@ -39,6 +39,12 @@ namespace OpenRA.FileFormats
|
||||
get { return colors; }
|
||||
}
|
||||
|
||||
public void ApplyRemap(IPaletteRemap r)
|
||||
{
|
||||
for(int i = 0; i < 256; i++)
|
||||
colors[i] = (uint)r.GetRemappedColor(Color.FromArgb((int)colors[i]),i).ToArgb();
|
||||
}
|
||||
|
||||
public Palette(Stream s, int[] remapShadow)
|
||||
{
|
||||
colors = new uint[256];
|
||||
@@ -61,9 +67,8 @@ namespace OpenRA.FileFormats
|
||||
|
||||
public Palette(Palette p, IPaletteRemap r)
|
||||
{
|
||||
colors = new uint[256];
|
||||
for(int i = 0; i < 256; i++)
|
||||
colors[i] = (uint)r.GetRemappedColor(Color.FromArgb((int)p.colors[i]),i).ToArgb();
|
||||
colors = (uint[])p.colors.Clone();
|
||||
ApplyRemap(r);
|
||||
}
|
||||
|
||||
public Palette(Palette p)
|
||||
@@ -71,6 +76,13 @@ namespace OpenRA.FileFormats
|
||||
colors = (uint[])p.colors.Clone();
|
||||
}
|
||||
|
||||
public Palette(uint[] data)
|
||||
{
|
||||
if (data.Length != 256)
|
||||
throw new InvalidDataException("Attempting to create palette with incorrect array size");
|
||||
colors = (uint[])data.Clone();
|
||||
}
|
||||
|
||||
public ColorPalette AsSystemPalette()
|
||||
{
|
||||
ColorPalette pal;
|
||||
@@ -88,6 +100,21 @@ namespace OpenRA.FileFormats
|
||||
return pal;
|
||||
}
|
||||
|
||||
public Bitmap AsBitmap()
|
||||
{
|
||||
var b = new Bitmap(256, 1, PixelFormat.Format32bppArgb);
|
||||
var data = b.LockBits(new Rectangle(0, 0, b.Width, b.Height),
|
||||
ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);
|
||||
unsafe
|
||||
{
|
||||
uint* c = (uint*)data.Scan0;
|
||||
for (var x = 0; x < 256; x++)
|
||||
*(c + x) = colors[x];
|
||||
}
|
||||
b.UnlockBits(data);
|
||||
return b;
|
||||
}
|
||||
|
||||
public static Palette Load(string filename, int[] remap)
|
||||
{
|
||||
using(var s = File.OpenRead(filename))
|
||||
|
||||
@@ -13,6 +13,7 @@ using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using OpenRA.FileFormats;
|
||||
using OpenRA.Graphics;
|
||||
using OpenRA.Traits;
|
||||
|
||||
namespace OpenRA
|
||||
@@ -81,10 +82,7 @@ namespace OpenRA
|
||||
if (si != null && si.Bounds != null)
|
||||
return new int2(si.Bounds[0], si.Bounds[1]);
|
||||
|
||||
// auto size from render
|
||||
var firstSprite = TraitsImplementing<IRender>().SelectMany(ApplyIRender).FirstOrDefault();
|
||||
if (firstSprite.Sprite == null) return int2.Zero;
|
||||
return (firstSprite.Sprite.size * firstSprite.Scale).ToInt2();
|
||||
return TraitsImplementing<IAutoSelectionSize>().Select(x => x.SelectionSize(this)).FirstOrDefault();
|
||||
});
|
||||
|
||||
if (this.HasTrait<RevealsShroud>())
|
||||
@@ -94,11 +92,10 @@ namespace OpenRA
|
||||
range = this.Trait<RevealsShroud>().RevealRange,
|
||||
vis = Shroud.GetVisOrigins(this).ToArray()
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
ApplyIRender = x => x.Render(this);
|
||||
ApplyRenderModifier = (m, p) => p.ModifyRender(this, m);
|
||||
ApplyIRender = (x, wr) => x.Render(this, wr);
|
||||
ApplyRenderModifier = (m, p, wr) => p.ModifyRender(this, wr, m);
|
||||
|
||||
Bounds = Cached.New(() => CalculateBounds(false));
|
||||
ExtendedBounds = Cached.New(() => CalculateBounds(true));
|
||||
@@ -109,7 +106,7 @@ namespace OpenRA
|
||||
Bounds.Invalidate();
|
||||
ExtendedBounds.Invalidate();
|
||||
|
||||
currentActivity = Util.RunActivity( this, currentActivity );
|
||||
currentActivity = Traits.Util.RunActivity( this, currentActivity );
|
||||
}
|
||||
|
||||
public void UpdateSight()
|
||||
@@ -125,13 +122,13 @@ namespace OpenRA
|
||||
OpenRA.FileFormats.Lazy<int2> Size;
|
||||
|
||||
// note: these delegates are cached to avoid massive allocation.
|
||||
Func<IRender, IEnumerable<Renderable>> ApplyIRender;
|
||||
Func<IEnumerable<Renderable>, IRenderModifier, IEnumerable<Renderable>> ApplyRenderModifier;
|
||||
public IEnumerable<Renderable> Render()
|
||||
Func<IRender, WorldRenderer, IEnumerable<Renderable>> ApplyIRender;
|
||||
Func<IEnumerable<Renderable>, IRenderModifier, WorldRenderer, IEnumerable<Renderable>> ApplyRenderModifier;
|
||||
public IEnumerable<Renderable> Render(WorldRenderer wr)
|
||||
{
|
||||
var mods = TraitsImplementing<IRenderModifier>();
|
||||
var sprites = TraitsImplementing<IRender>().SelectMany(ApplyIRender);
|
||||
return mods.Aggregate(sprites, ApplyRenderModifier);
|
||||
var sprites = TraitsImplementing<IRender>().SelectMany(x => ApplyIRender(x, wr));
|
||||
return mods.Aggregate(sprites, (m,p) => ApplyRenderModifier(m,p,wr));
|
||||
}
|
||||
|
||||
// When useAltitude = true, the bounding box is extended
|
||||
@@ -257,10 +254,15 @@ namespace OpenRA
|
||||
{
|
||||
World.AddFrameEndTask(w =>
|
||||
{
|
||||
var oldOwner = Owner;
|
||||
|
||||
// momentarily remove from world so the ownership queries don't get confused
|
||||
w.Remove(this);
|
||||
Owner = newOwner;
|
||||
w.Add(this);
|
||||
|
||||
foreach (var t in this.TraitsImplementing<INotifyOwnerChanged>())
|
||||
t.OnOwnerChanged(this, oldOwner, newOwner);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using OpenRA.Graphics;
|
||||
using OpenRA.Traits;
|
||||
|
||||
namespace OpenRA.Effects
|
||||
@@ -31,6 +32,6 @@ namespace OpenRA.Effects
|
||||
world.AddFrameEndTask(w => { w.Remove(this); a(); });
|
||||
}
|
||||
|
||||
public IEnumerable<Renderable> Render() { yield break; }
|
||||
public IEnumerable<Renderable> Render(WorldRenderer wr) { yield break; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using OpenRA.Graphics;
|
||||
using OpenRA.Traits;
|
||||
|
||||
namespace OpenRA.Effects
|
||||
@@ -32,14 +33,14 @@ namespace OpenRA.Effects
|
||||
world.AddFrameEndTask(w => w.Remove(this));
|
||||
}
|
||||
|
||||
public IEnumerable<Renderable> Render()
|
||||
public IEnumerable<Renderable> Render(WorldRenderer wr)
|
||||
{
|
||||
if (!target.IsInWorld)
|
||||
yield break;
|
||||
|
||||
if (remainingTicks % 2 == 0)
|
||||
foreach (var r in target.Render())
|
||||
yield return r.WithPalette("highlight");
|
||||
foreach (var r in target.Render(wr))
|
||||
yield return r.WithPalette(wr.Palette("highlight"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
#endregion
|
||||
|
||||
using System.Collections.Generic;
|
||||
using OpenRA.Graphics;
|
||||
using OpenRA.Traits;
|
||||
|
||||
namespace OpenRA.Effects
|
||||
@@ -16,6 +17,6 @@ namespace OpenRA.Effects
|
||||
public interface IEffect
|
||||
{
|
||||
void Tick(World world);
|
||||
IEnumerable<Renderable> Render();
|
||||
IEnumerable<Renderable> Render(WorldRenderer r);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,7 +32,7 @@ namespace OpenRA.Graphics
|
||||
this.DisableFunc = d;
|
||||
}
|
||||
|
||||
public Renderable Image(Actor self, string pal)
|
||||
public Renderable Image(Actor self, PaletteReference pal)
|
||||
{
|
||||
var p = self.CenterLocation;
|
||||
var loc = p.ToFloat2() - 0.5f * Animation.Image.size
|
||||
|
||||
@@ -19,6 +19,7 @@ namespace OpenRA.Graphics
|
||||
{
|
||||
public static class CursorProvider
|
||||
{
|
||||
public static Dictionary<string, Palette> Palettes { get; private set; }
|
||||
static Dictionary<string, CursorSequence> cursors;
|
||||
|
||||
public static void Initialize(string[] sequenceFiles)
|
||||
@@ -33,8 +34,9 @@ namespace OpenRA.Graphics
|
||||
ShadowIndex[ShadowIndex.Length - 1] = Convert.ToInt32(sequences.NodesDict["ShadowIndex"].Value);
|
||||
}
|
||||
|
||||
Palettes = new Dictionary<string, Palette>();
|
||||
foreach (var s in sequences.NodesDict["Palettes"].Nodes)
|
||||
Game.modData.Palette.AddPalette(s.Key, new Palette(FileSystem.Open(s.Value.Value), ShadowIndex));
|
||||
Palettes.Add(s.Key, new Palette(FileSystem.Open(s.Value.Value), ShadowIndex));
|
||||
|
||||
foreach (var s in sequences.NodesDict["Cursors"].Nodes)
|
||||
LoadSequencesForCursor(s.Key, s.Value);
|
||||
|
||||
@@ -25,11 +25,13 @@ namespace OpenRA.Graphics
|
||||
ITexture texture;
|
||||
Dictionary<string, Palette> palettes;
|
||||
Dictionary<string, int> indices;
|
||||
Dictionary<string, bool> allowsMods;
|
||||
|
||||
public HardwarePalette()
|
||||
{
|
||||
palettes = new Dictionary<string, Palette>();
|
||||
indices = new Dictionary<string, int>();
|
||||
allowsMods = new Dictionary<string, bool>();
|
||||
texture = Game.Renderer.Device.CreateTexture();
|
||||
}
|
||||
|
||||
@@ -49,22 +51,24 @@ namespace OpenRA.Graphics
|
||||
return ret;
|
||||
}
|
||||
|
||||
public void AddPalette(string name, Palette p)
|
||||
public void AddPalette(string name, Palette p, bool allowModifiers)
|
||||
{
|
||||
if (palettes.ContainsKey(name))
|
||||
throw new InvalidOperationException("Palette {0} has already been defined".F(name));
|
||||
|
||||
palettes.Add(name, p);
|
||||
indices.Add(name, allocated++);
|
||||
allowsMods.Add(name, allowModifiers);
|
||||
}
|
||||
|
||||
uint[,] data = new uint[MaxPalettes, 256];
|
||||
public void Update(IEnumerable<IPaletteModifier> paletteMods)
|
||||
{
|
||||
var copy = palettes.ToDictionary(p => p.Key, p => new Palette(p.Value));
|
||||
var modifiable = copy.Where(p => allowsMods[p.Key]).ToDictionary(p => p.Key, p => p.Value);
|
||||
|
||||
foreach (var mod in paletteMods)
|
||||
mod.AdjustPalette(copy);
|
||||
mod.AdjustPalette(modifiable);
|
||||
|
||||
foreach (var pal in copy)
|
||||
{
|
||||
|
||||
@@ -50,11 +50,11 @@ namespace OpenRA.Graphics
|
||||
TempBufferCount = Game.Settings.Graphics.NumTempBuffers;
|
||||
SheetSize = Game.Settings.Graphics.SheetSize;
|
||||
|
||||
WorldSpriteShader = device.CreateShader("world-shp");
|
||||
WorldLineShader = device.CreateShader("world-line");
|
||||
LineShader = device.CreateShader("chrome-line");
|
||||
RgbaSpriteShader = device.CreateShader("chrome-rgba");
|
||||
SpriteShader = device.CreateShader("chrome-shp");
|
||||
WorldSpriteShader = device.CreateShader("shp");
|
||||
WorldLineShader = device.CreateShader("line");
|
||||
LineShader = device.CreateShader("line");
|
||||
RgbaSpriteShader = device.CreateShader("rgba");
|
||||
SpriteShader = device.CreateShader("shp");
|
||||
|
||||
WorldSpriteRenderer = new SpriteRenderer(this, WorldSpriteShader);
|
||||
WorldLineRenderer = new LineRenderer(this, WorldLineShader);
|
||||
@@ -82,9 +82,9 @@ namespace OpenRA.Graphics
|
||||
|
||||
SetShaderParams(WorldSpriteShader, zr1, r2, scroll);
|
||||
SetShaderParams(WorldLineShader, zr1, r2, scroll);
|
||||
SetShaderParams( LineShader, r1, r2, scroll );
|
||||
SetShaderParams( RgbaSpriteShader, r1, r2, scroll );
|
||||
SetShaderParams( SpriteShader, r1, r2, scroll );
|
||||
SetShaderParams(LineShader, r1, r2, float2.Zero);
|
||||
SetShaderParams(RgbaSpriteShader, r1, r2, float2.Zero);
|
||||
SetShaderParams(SpriteShader, r1, r2, float2.Zero);
|
||||
}
|
||||
|
||||
void SetShaderParams(IShader s, float2 r1, float2 r2, float2 scroll)
|
||||
|
||||
@@ -105,8 +105,17 @@ namespace OpenRA.Graphics
|
||||
return shadowBits[SpecialShroudTiles[u ^ uSides][v]];
|
||||
}
|
||||
|
||||
bool initializePalettes = true;
|
||||
PaletteReference fogPalette, shroudPalette;
|
||||
internal void Draw(WorldRenderer wr)
|
||||
{
|
||||
if (initializePalettes)
|
||||
{
|
||||
fogPalette = wr.Palette("fog");
|
||||
shroudPalette = wr.Palette("shroud");
|
||||
initializePalettes = false;
|
||||
}
|
||||
|
||||
if (shroud != null && shroud.dirty)
|
||||
{
|
||||
shroud.dirty = false;
|
||||
@@ -120,14 +129,12 @@ namespace OpenRA.Graphics
|
||||
}
|
||||
|
||||
var clipRect = Game.viewport.WorldBounds(wr.world);
|
||||
DrawShroud( wr, clipRect, fogSprites, "fog" );
|
||||
DrawShroud( wr, clipRect, sprites, "shroud" );
|
||||
DrawShroud(wr, clipRect, fogSprites, fogPalette);
|
||||
DrawShroud(wr, clipRect, sprites, shroudPalette);
|
||||
}
|
||||
|
||||
void DrawShroud( WorldRenderer wr, Rectangle clip, Sprite[,] s, string pal )
|
||||
void DrawShroud(WorldRenderer wr, Rectangle clip, Sprite[,] s, PaletteReference pal)
|
||||
{
|
||||
var shroudPalette = wr.GetPaletteIndex(pal);
|
||||
|
||||
for (var j = clip.Top; j < clip.Bottom; j++)
|
||||
{
|
||||
var starti = clip.Left;
|
||||
@@ -142,14 +149,14 @@ namespace OpenRA.Graphics
|
||||
{
|
||||
s[starti, j].DrawAt(
|
||||
Game.CellSize * new float2(starti, j),
|
||||
shroudPalette,
|
||||
pal.Index,
|
||||
new float2(Game.CellSize * (i - starti), Game.CellSize));
|
||||
starti = i + 1;
|
||||
}
|
||||
|
||||
s[i, j].DrawAt(
|
||||
Game.CellSize * new float2(i, j),
|
||||
shroudPalette);
|
||||
pal.Index);
|
||||
starti = i + 1;
|
||||
last = s[i, j];
|
||||
}
|
||||
@@ -157,7 +164,7 @@ namespace OpenRA.Graphics
|
||||
if (starti < clip.Right)
|
||||
s[starti, j].DrawAt(
|
||||
Game.CellSize * new float2(starti, j),
|
||||
shroudPalette,
|
||||
pal.Index,
|
||||
new float2(Game.CellSize * (clip.Right - starti), Game.CellSize));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -49,12 +49,12 @@ namespace OpenRA.Graphics
|
||||
|
||||
public void DrawSprite(Sprite s, float2 location, WorldRenderer wr, string palette)
|
||||
{
|
||||
DrawSprite(s, location, wr.GetPaletteIndex(palette), s.size);
|
||||
DrawSprite(s, location, wr.Palette(palette).Index, s.size);
|
||||
}
|
||||
|
||||
public void DrawSprite(Sprite s, float2 location, WorldRenderer wr, string palette, float2 size)
|
||||
{
|
||||
DrawSprite(s, location, wr.GetPaletteIndex(palette), size);
|
||||
DrawSprite(s, location, wr.Palette(palette).Index, size);
|
||||
}
|
||||
|
||||
public void DrawSprite(Sprite s, float2 location, int paletteIndex, float2 size)
|
||||
|
||||
@@ -39,7 +39,7 @@ namespace OpenRA.Graphics
|
||||
|
||||
int nv = 0;
|
||||
|
||||
var terrainPalette = Game.modData.Palette.GetPaletteIndex("terrain");
|
||||
var terrainPalette = wr.Palette("terrain").Index;
|
||||
|
||||
for( int j = map.Bounds.Top; j < map.Bounds.Bottom; j++ )
|
||||
for( int i = map.Bounds.Left; i < map.Bounds.Right; i++ )
|
||||
|
||||
@@ -133,7 +133,7 @@ namespace OpenRA.Graphics
|
||||
|
||||
renderer.SpriteRenderer.DrawSprite(cursorSprite,
|
||||
Viewport.LastMousePos - cursorSequence.Hotspot,
|
||||
Game.modData.Palette.GetPaletteIndex(cursorSequence.Palette),
|
||||
wr.Palette(cursorSequence.Palette).Index,
|
||||
cursorSprite.size);
|
||||
}
|
||||
|
||||
|
||||
@@ -17,27 +17,56 @@ using OpenRA.Traits;
|
||||
|
||||
namespace OpenRA.Graphics
|
||||
{
|
||||
public class PaletteReference
|
||||
{
|
||||
public readonly string Name;
|
||||
public readonly int Index;
|
||||
public readonly Palette Palette;
|
||||
public PaletteReference(string name, int index, Palette palette)
|
||||
{
|
||||
Name = name;
|
||||
Index = index;
|
||||
Palette = palette;
|
||||
}
|
||||
}
|
||||
|
||||
public class WorldRenderer
|
||||
{
|
||||
public readonly World world;
|
||||
internal readonly TerrainRenderer terrainRenderer;
|
||||
internal readonly ShroudRenderer shroudRenderer;
|
||||
internal readonly HardwarePalette palette;
|
||||
internal Cache<string, PaletteReference> palettes;
|
||||
|
||||
internal WorldRenderer(World world)
|
||||
{
|
||||
this.world = world;
|
||||
this.palette = Game.modData.Palette;
|
||||
palette = new HardwarePalette();
|
||||
foreach (var p in CursorProvider.Palettes)
|
||||
palette.AddPalette(p.Key, p.Value, false);
|
||||
|
||||
palettes = new Cache<string, PaletteReference>(CreatePaletteReference);
|
||||
foreach (var pal in world.traitDict.ActorsWithTraitMultiple<IPalette>(world))
|
||||
pal.Trait.InitPalette( this );
|
||||
|
||||
// Generate initial palette texture
|
||||
palette.Update(new IPaletteModifier[] {});
|
||||
|
||||
terrainRenderer = new TerrainRenderer(world, this);
|
||||
shroudRenderer = new ShroudRenderer(world);
|
||||
}
|
||||
|
||||
public int GetPaletteIndex(string name) { return palette.GetPaletteIndex(name); }
|
||||
public Palette GetPalette(string name) { return palette.GetPalette(name); }
|
||||
public void AddPalette(string name, Palette pal) { palette.AddPalette(name, pal); }
|
||||
PaletteReference CreatePaletteReference(string name)
|
||||
{
|
||||
var pal = palette.GetPalette(name);
|
||||
if (pal == null)
|
||||
throw new InvalidOperationException("Palette `{0}` does not exist".F(name));
|
||||
|
||||
return new PaletteReference(name, palette.GetPaletteIndex(name), pal);
|
||||
}
|
||||
|
||||
public PaletteReference Palette(string name) { return palettes[name]; }
|
||||
public void AddPalette(string name, Palette pal, bool allowModifiers) { palette.AddPalette(name, pal, allowModifiers); }
|
||||
|
||||
class SpriteComparer : IComparer<Renderable>
|
||||
{
|
||||
@@ -57,10 +86,10 @@ namespace OpenRA.Graphics
|
||||
bounds.BottomRightAsCPos().ToPPos()
|
||||
);
|
||||
|
||||
var renderables = actors.SelectMany(a => a.Render())
|
||||
var renderables = actors.SelectMany(a => a.Render(this))
|
||||
.OrderBy(r => r, comparer);
|
||||
|
||||
var effects = world.Effects.SelectMany(e => e.Render());
|
||||
var effects = world.Effects.SelectMany(e => e.Render(this));
|
||||
|
||||
return renderables.Concat(effects);
|
||||
}
|
||||
@@ -77,8 +106,8 @@ namespace OpenRA.Graphics
|
||||
|
||||
terrainRenderer.Draw(this, Game.viewport);
|
||||
foreach (var a in world.traitDict.ActorsWithTraitMultiple<IRenderAsTerrain>(world))
|
||||
foreach (var r in a.Trait.RenderAsTerrain(a.Actor))
|
||||
r.Sprite.DrawAt(r.Pos, this.GetPaletteIndex(r.Palette), r.Scale);
|
||||
foreach (var r in a.Trait.RenderAsTerrain(this, a.Actor))
|
||||
r.Sprite.DrawAt(r.Pos, r.Palette.Index, r.Scale);
|
||||
|
||||
foreach (var a in world.Selection.Actors)
|
||||
if (!a.Destroyed)
|
||||
@@ -91,7 +120,7 @@ namespace OpenRA.Graphics
|
||||
world.OrderGenerator.RenderBeforeWorld(this, world);
|
||||
|
||||
foreach (var image in SpritesToRender())
|
||||
image.Sprite.DrawAt(image.Pos, this.GetPaletteIndex(image.Palette), image.Scale);
|
||||
image.Sprite.DrawAt(image.Pos, image.Palette.Index, image.Scale);
|
||||
|
||||
// added for contrails
|
||||
foreach (var a in world.ActorsWithTrait<IPostRender>())
|
||||
|
||||
@@ -28,7 +28,6 @@ namespace OpenRA
|
||||
public ILoadScreen LoadScreen = null;
|
||||
public SheetBuilder SheetBuilder;
|
||||
public SpriteLoader SpriteLoader;
|
||||
public HardwarePalette Palette { get; private set; }
|
||||
|
||||
public ModData( params string[] mods )
|
||||
{
|
||||
@@ -51,13 +50,11 @@ namespace OpenRA
|
||||
|
||||
AvailableMaps = FindMaps(Manifest.Mods);
|
||||
|
||||
Palette = new HardwarePalette();
|
||||
ChromeMetrics.Initialize(Manifest.ChromeMetrics);
|
||||
ChromeProvider.Initialize(Manifest.Chrome);
|
||||
SheetBuilder = new SheetBuilder(TextureChannel.Red);
|
||||
SpriteLoader = new SpriteLoader(new string[] { ".shp" }, SheetBuilder);
|
||||
CursorProvider.Initialize(Manifest.Cursors);
|
||||
Palette.Update(new IPaletteModifier[] { });
|
||||
}
|
||||
|
||||
public Map PrepareMap(string uid)
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using OpenRA.Graphics;
|
||||
|
||||
namespace OpenRA.Traits
|
||||
@@ -23,16 +24,16 @@ namespace OpenRA.Traits
|
||||
|
||||
public virtual object Create(ActorInitializer init) { return new RenderSimple(init.self); }
|
||||
|
||||
public virtual IEnumerable<Renderable> RenderPreview(ActorInfo building, Player owner)
|
||||
public virtual IEnumerable<Renderable> RenderPreview(ActorInfo building, PaletteReference pr)
|
||||
{
|
||||
var anim = new Animation(RenderSimple.GetImage(building), () => 0);
|
||||
anim.PlayRepeating("idle");
|
||||
yield return new Renderable(anim.Image, 0.5f * anim.Image.size * (1 - Scale),
|
||||
Palette ?? (owner != null ? PlayerPalette + owner.InternalName : null), 0, Scale);
|
||||
|
||||
yield return new Renderable(anim.Image, 0.5f * anim.Image.size * (1 - Scale), pr, 0, Scale);
|
||||
}
|
||||
}
|
||||
|
||||
public class RenderSimple : IRender, ITick
|
||||
public class RenderSimple : IRender, IAutoSelectionSize, ITick, INotifyOwnerChanged
|
||||
{
|
||||
public Dictionary<string, AnimationWithOffset> anims = new Dictionary<string, AnimationWithOffset>();
|
||||
|
||||
@@ -55,7 +56,6 @@ namespace OpenRA.Traits
|
||||
return Info.Image ?? actor.Name;
|
||||
}
|
||||
|
||||
string cachedImage = null;
|
||||
public string GetImage(Actor self)
|
||||
{
|
||||
if (cachedImage != null)
|
||||
@@ -65,6 +65,9 @@ namespace OpenRA.Traits
|
||||
}
|
||||
|
||||
RenderSimpleInfo Info;
|
||||
string cachedImage = null;
|
||||
bool initializePalette = true;
|
||||
protected PaletteReference palette;
|
||||
|
||||
public RenderSimple(Actor self, Func<int> baseFacing)
|
||||
{
|
||||
@@ -77,20 +80,40 @@ namespace OpenRA.Traits
|
||||
anim.PlayRepeating("idle");
|
||||
}
|
||||
|
||||
public string Palette(Player p) { return Info.Palette ?? Info.PlayerPalette + p.InternalName; }
|
||||
|
||||
public virtual IEnumerable<Renderable> Render(Actor self)
|
||||
protected virtual string PaletteName(Actor self)
|
||||
{
|
||||
return Info.Palette ?? Info.PlayerPalette + self.Owner.InternalName;
|
||||
}
|
||||
|
||||
protected void UpdatePalette() { initializePalette = true; }
|
||||
public void OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) { UpdatePalette(); }
|
||||
|
||||
public virtual IEnumerable<Renderable> Render(Actor self, WorldRenderer wr)
|
||||
{
|
||||
if (initializePalette)
|
||||
{
|
||||
palette = wr.Palette(PaletteName(self));
|
||||
initializePalette = false;
|
||||
}
|
||||
|
||||
foreach (var a in anims.Values)
|
||||
if (a.DisableFunc == null || !a.DisableFunc())
|
||||
{
|
||||
Renderable ret = a.Image(self, Palette(self.Owner));
|
||||
Renderable ret = a.Image(self, palette);
|
||||
if (Info.Scale != 1f)
|
||||
ret = ret.WithScale(Info.Scale).WithPos(ret.Pos + 0.5f * ret.Sprite.size * (1 - Info.Scale));
|
||||
yield return ret;
|
||||
}
|
||||
}
|
||||
|
||||
public int2 SelectionSize(Actor self)
|
||||
{
|
||||
return anims.Values.Where(b => (b.DisableFunc == null || !b.DisableFunc())
|
||||
&& b.Animation.CurrentSequence != null)
|
||||
.Select(a => (a.Animation.Image.size*Info.Scale).ToInt2())
|
||||
.FirstOrDefault();
|
||||
}
|
||||
|
||||
public virtual void Tick(Actor self)
|
||||
{
|
||||
foreach (var a in anims.Values)
|
||||
|
||||
@@ -34,7 +34,8 @@ namespace OpenRA.Traits
|
||||
}
|
||||
|
||||
public interface ITick { void Tick(Actor self); }
|
||||
public interface IRender { IEnumerable<Renderable> Render(Actor self); }
|
||||
public interface IRender { IEnumerable<Renderable> Render(Actor self, WorldRenderer wr); }
|
||||
public interface IAutoSelectionSize { int2 SelectionSize(Actor self); }
|
||||
|
||||
public interface IIssueOrder
|
||||
{
|
||||
@@ -62,6 +63,7 @@ namespace OpenRA.Traits
|
||||
public interface INotifyAppliedDamage { void AppliedDamage(Actor self, Actor damaged, AttackInfo e); }
|
||||
public interface INotifyBuildComplete { void BuildingComplete(Actor self); }
|
||||
public interface INotifyProduction { void UnitProduced(Actor self, Actor other, CPos exit); }
|
||||
public interface INotifyOwnerChanged { void OnOwnerChanged(Actor self, Player oldOwner, Player newOwner); }
|
||||
public interface INotifyCapture { void OnCapture(Actor self, Actor captor, Player oldOwner, Player newOwner); }
|
||||
public interface INotifyOtherCaptured { void OnActorCaptured(Actor self, Actor captured, Actor captor, Player oldOwner, Player newOwner); }
|
||||
public interface IAcceptSpy { void OnInfiltrate(Actor self, Actor spy); }
|
||||
@@ -113,7 +115,7 @@ namespace OpenRA.Traits
|
||||
}
|
||||
|
||||
public interface INotifyAttack { void Attacking(Actor self, Target target); }
|
||||
public interface IRenderModifier { IEnumerable<Renderable> ModifyRender(Actor self, IEnumerable<Renderable> r); }
|
||||
public interface IRenderModifier { IEnumerable<Renderable> ModifyRender(Actor self, WorldRenderer wr, IEnumerable<Renderable> r); }
|
||||
public interface IDamageModifier { float GetDamageModifier(Actor attacker, WarheadInfo warhead); }
|
||||
public interface ISpeedModifier { decimal GetSpeedModifier(); }
|
||||
public interface IFirepowerModifier { float GetFirepowerModifier(); }
|
||||
@@ -154,12 +156,12 @@ namespace OpenRA.Traits
|
||||
{
|
||||
public readonly Sprite Sprite;
|
||||
public readonly float2 Pos;
|
||||
public readonly string Palette;
|
||||
public readonly PaletteReference Palette;
|
||||
public readonly int Z;
|
||||
public readonly int ZOffset;
|
||||
public float Scale;
|
||||
|
||||
public Renderable(Sprite sprite, float2 pos, string palette, int z, int zOffset, float scale)
|
||||
public Renderable(Sprite sprite, float2 pos, PaletteReference palette, int z, int zOffset, float scale)
|
||||
{
|
||||
Sprite = sprite;
|
||||
Pos = pos;
|
||||
@@ -169,14 +171,14 @@ namespace OpenRA.Traits
|
||||
Scale = scale; /* default */
|
||||
}
|
||||
|
||||
public Renderable(Sprite sprite, float2 pos, string palette, int z)
|
||||
public Renderable(Sprite sprite, float2 pos, PaletteReference palette, int z)
|
||||
: this(sprite, pos, palette, z, 0, 1f) { }
|
||||
|
||||
public Renderable(Sprite sprite, float2 pos, string palette, int z, float scale)
|
||||
public Renderable(Sprite sprite, float2 pos, PaletteReference palette, int z, float scale)
|
||||
: this(sprite, pos, palette, z, 0, scale) { }
|
||||
|
||||
public Renderable WithScale(float newScale) { return new Renderable(Sprite, Pos, Palette, Z, ZOffset, newScale); }
|
||||
public Renderable WithPalette(string newPalette) { return new Renderable(Sprite, Pos, newPalette, Z, ZOffset, Scale); }
|
||||
public Renderable WithPalette(PaletteReference newPalette) { return new Renderable(Sprite, Pos, newPalette, Z, ZOffset, Scale); }
|
||||
public Renderable WithZOffset(int newOffset) { return new Renderable(Sprite, Pos, Palette, Z, newOffset, Scale); }
|
||||
public Renderable WithPos(float2 newPos) { return new Renderable(Sprite, newPos, Palette, Z, ZOffset, Scale); }
|
||||
}
|
||||
@@ -208,7 +210,7 @@ namespace OpenRA.Traits
|
||||
|
||||
public interface IPostRenderSelection { void RenderAfterWorld(WorldRenderer wr); }
|
||||
public interface IPreRenderSelection { void RenderBeforeWorld(WorldRenderer wr, Actor self); }
|
||||
public interface IRenderAsTerrain { IEnumerable<Renderable> RenderAsTerrain(Actor self); }
|
||||
public interface IRenderAsTerrain { IEnumerable<Renderable> RenderAsTerrain(WorldRenderer wr, Actor self); }
|
||||
|
||||
public interface ITargetable
|
||||
{
|
||||
|
||||
@@ -18,6 +18,7 @@ namespace OpenRA.Traits
|
||||
public readonly string BasePalette = null;
|
||||
public readonly string BaseName = "player";
|
||||
public readonly int[] RemapIndex = {};
|
||||
public readonly bool AllowModifiers = true;
|
||||
|
||||
public object Create( ActorInitializer init ) { return new PlayerColorPalette( init.self.Owner, this ); }
|
||||
}
|
||||
@@ -36,9 +37,9 @@ namespace OpenRA.Traits
|
||||
public void InitPalette( WorldRenderer wr )
|
||||
{
|
||||
var paletteName = "{0}{1}".F( info.BaseName, owner.InternalName );
|
||||
var newpal = new Palette(wr.GetPalette(info.BasePalette),
|
||||
var newpal = new Palette(wr.Palette(info.BasePalette).Palette,
|
||||
new PlayerColorRemap(info.RemapIndex, owner.ColorRamp));
|
||||
wr.AddPalette(paletteName, newpal);
|
||||
wr.AddPalette(paletteName, newpal, info.AllowModifiers);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,7 +33,7 @@ namespace OpenRA.Traits
|
||||
{
|
||||
hasSetupPalettes = true;
|
||||
foreach (var rt in world.WorldActor.TraitsImplementing<ResourceType>())
|
||||
rt.info.PaletteIndex = wr.GetPaletteIndex(rt.info.Palette);
|
||||
rt.info.PaletteRef = wr.Palette(rt.info.Palette);
|
||||
}
|
||||
|
||||
var clip = Game.viewport.WorldBounds(world);
|
||||
@@ -47,7 +47,7 @@ namespace OpenRA.Traits
|
||||
if (c.image != null)
|
||||
c.image[c.density].DrawAt(
|
||||
new CPos(x, y).ToPPos().ToFloat2(),
|
||||
c.type.info.PaletteIndex);
|
||||
c.type.info.PaletteRef.Index);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ namespace OpenRA.Traits
|
||||
public readonly bool AllowUnderActors = false;
|
||||
|
||||
public Sprite[][] Sprites;
|
||||
public int PaletteIndex;
|
||||
public PaletteReference PaletteRef;
|
||||
|
||||
public PipType PipColor = PipType.Yellow;
|
||||
|
||||
|
||||
@@ -61,8 +61,6 @@ namespace OpenRA.Mods.Cnc
|
||||
}
|
||||
}
|
||||
|
||||
static Set<string> excludePalettes = new Set<string>("cursor", "chrome", "colorpicker", "shroud", "fog");
|
||||
|
||||
public void AdjustPalette(Dictionary<string,Palette> palettes)
|
||||
{
|
||||
if (to == EffectType.None && remainingFrames == 0)
|
||||
@@ -70,9 +68,6 @@ namespace OpenRA.Mods.Cnc
|
||||
|
||||
foreach (var pal in palettes)
|
||||
{
|
||||
if (excludePalettes.Contains(pal.Key))
|
||||
continue;
|
||||
|
||||
for (var x = 0; x < 256; x++)
|
||||
{
|
||||
var orig = pal.Value.GetColor(x);
|
||||
|
||||
@@ -32,11 +32,11 @@ namespace OpenRA.Mods.Cnc.Effects
|
||||
|
||||
public void Tick(World world) { anim.Tick(); }
|
||||
|
||||
public IEnumerable<Renderable> Render()
|
||||
public IEnumerable<Renderable> Render(WorldRenderer wr)
|
||||
{
|
||||
yield return new Renderable(anim.Image,
|
||||
target.CenterLocation.ToFloat2() - new float2(.5f * anim.Image.size.X, anim.Image.size.Y - Game.CellSize),
|
||||
"effect", (int)target.CenterLocation.Y);
|
||||
wr.Palette("effect"), (int)target.CenterLocation.Y);
|
||||
}
|
||||
|
||||
void Finish( World world )
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using OpenRA.Mods.RA;
|
||||
using OpenRA.Graphics;
|
||||
using OpenRA.Traits;
|
||||
|
||||
namespace OpenRA.Mods.Cnc
|
||||
@@ -39,7 +40,7 @@ namespace OpenRA.Mods.Cnc
|
||||
Info = info;
|
||||
}
|
||||
|
||||
public IEnumerable<Renderable> ModifyRender(Actor self, IEnumerable<Renderable> r)
|
||||
public IEnumerable<Renderable> ModifyRender(Actor self, WorldRenderer wr, IEnumerable<Renderable> r)
|
||||
{
|
||||
foreach (var c in cargo.Passengers)
|
||||
{
|
||||
@@ -55,7 +56,7 @@ namespace OpenRA.Mods.Cnc
|
||||
Info.PassengerTypes.Contains(p.Trait<Passenger>().info.CargoType))
|
||||
: cargo.Passengers;
|
||||
|
||||
return r.Concat(visiblePassengers.SelectMany(a => a.Render())
|
||||
return r.Concat(visiblePassengers.SelectMany(a => a.Render(wr))
|
||||
.Select(a => a.WithPos(a.Pos - new float2(0, Info.RelativeAltitude))
|
||||
.WithZOffset(a.ZOffset + Info.RelativeAltitude)));
|
||||
}
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
|
||||
using System;
|
||||
using System.Linq;
|
||||
using OpenRA.Graphics;
|
||||
using OpenRA.Traits;
|
||||
using OpenRA.Widgets;
|
||||
|
||||
@@ -20,7 +21,7 @@ namespace OpenRA.Mods.Cnc.Widgets.Logic
|
||||
Widget menu;
|
||||
|
||||
[ObjectCreator.UseCtor]
|
||||
public CncIngameMenuLogic(Widget widget, World world, Action onExit)
|
||||
public CncIngameMenuLogic(Widget widget, World world, Action onExit, WorldRenderer worldRenderer)
|
||||
{
|
||||
var resumeDisabled = false;
|
||||
menu = widget.Get("INGAME_MENU");
|
||||
@@ -72,6 +73,7 @@ namespace OpenRA.Mods.Cnc.Widgets.Logic
|
||||
Ui.OpenWindow("SETTINGS_PANEL", new WidgetArgs()
|
||||
{
|
||||
{ "world", world },
|
||||
{ "worldRenderer", worldRenderer },
|
||||
{ "onExit", () => hideButtons = false },
|
||||
});
|
||||
};
|
||||
|
||||
@@ -85,9 +85,8 @@ namespace OpenRA.Mods.Cnc.Widgets.Logic
|
||||
settingsMenu.Get<ButtonWidget>("SETTINGS_BUTTON").OnClick = () =>
|
||||
{
|
||||
Menu = MenuType.None;
|
||||
Ui.OpenWindow("SETTINGS_PANEL", new WidgetArgs()
|
||||
Game.OpenWindow("SETTINGS_PANEL", new WidgetArgs()
|
||||
{
|
||||
{ "world", world },
|
||||
{ "onExit", () => Menu = MenuType.Settings },
|
||||
});
|
||||
};
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
* as published by the Free Software Foundation. For more information,
|
||||
* see COPYING.
|
||||
*/
|
||||
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
@@ -17,6 +18,7 @@ using OpenRA.GameRules;
|
||||
using OpenRA.Mods.RA;
|
||||
using OpenRA.Mods.RA.Widgets.Logic;
|
||||
using OpenRA.Widgets;
|
||||
using OpenRA.Mods.RA.Widgets;
|
||||
|
||||
namespace OpenRA.Mods.Cnc.Widgets.Logic
|
||||
{
|
||||
@@ -25,7 +27,7 @@ namespace OpenRA.Mods.Cnc.Widgets.Logic
|
||||
enum PanelType { General, Input }
|
||||
|
||||
PanelType Settings = PanelType.General;
|
||||
ColorPickerPaletteModifier playerPalettePreview;
|
||||
ColorPreviewManagerWidget colorPreview;
|
||||
World world;
|
||||
|
||||
[ObjectCreator.UseCtor]
|
||||
@@ -52,8 +54,8 @@ namespace OpenRA.Mods.Cnc.Widgets.Logic
|
||||
var nameTextfield = generalPane.Get<TextFieldWidget>("NAME_TEXTFIELD");
|
||||
nameTextfield.Text = playerSettings.Name;
|
||||
|
||||
playerPalettePreview = world.WorldActor.Trait<ColorPickerPaletteModifier>();
|
||||
playerPalettePreview.Ramp = playerSettings.ColorRamp;
|
||||
colorPreview = panel.Get<ColorPreviewManagerWidget>("COLOR_MANAGER");
|
||||
colorPreview.Ramp = playerSettings.ColorRamp;
|
||||
|
||||
var colorDropdown = generalPane.Get<DropDownButtonWidget>("COLOR");
|
||||
colorDropdown.OnMouseDown = _ => ShowColorPicker(colorDropdown, playerSettings);
|
||||
@@ -154,7 +156,7 @@ namespace OpenRA.Mods.Cnc.Widgets.Logic
|
||||
bool ShowColorPicker(DropDownButtonWidget color, PlayerSettings s)
|
||||
{
|
||||
Action<ColorRamp> onSelect = c => {s.ColorRamp = c; color.RemovePanel();};
|
||||
Action<ColorRamp> onChange = c => { playerPalettePreview.Ramp = c; };
|
||||
Action<ColorRamp> onChange = c => {colorPreview.Ramp = c;};
|
||||
|
||||
var colorChooser = Game.LoadWidget(world, "COLOR_CHOOSER", null, new WidgetArgs()
|
||||
{
|
||||
|
||||
@@ -35,10 +35,8 @@ namespace OpenRA.Mods.RA
|
||||
if (IsSuitableCell(pilot, self.Location) && r > 100 - info.SuccessRate && aircraft.Altitude > 10
|
||||
&& self.Owner.WinState != WinState.Lost)
|
||||
{
|
||||
self.World.AddFrameEndTask(w => w.Add(
|
||||
new Parachute(pilot.Owner,
|
||||
Util.CenterOfCell(self.CenterLocation.ToCPos()),
|
||||
aircraft.Altitude, pilot)));
|
||||
self.World.AddFrameEndTask(w => w.Add(new Parachute(pilot,
|
||||
Util.CenterOfCell(self.CenterLocation.ToCPos()), aircraft.Altitude)));
|
||||
|
||||
Sound.Play(info.ChuteSound, self.CenterLocation);
|
||||
}
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using OpenRA.Graphics;
|
||||
using OpenRA.Traits;
|
||||
|
||||
namespace OpenRA.Mods.RA
|
||||
@@ -18,7 +19,7 @@ namespace OpenRA.Mods.RA
|
||||
|
||||
class BelowUnits : IRenderModifier
|
||||
{
|
||||
public IEnumerable<Renderable> ModifyRender(Actor self, IEnumerable<Renderable> r)
|
||||
public IEnumerable<Renderable> ModifyRender(Actor self, WorldRenderer wr, IEnumerable<Renderable> r)
|
||||
{
|
||||
return r.Select(a => a.WithZOffset((int) -a.Sprite.size.Y));
|
||||
}
|
||||
|
||||
@@ -135,10 +135,18 @@ namespace OpenRA.Mods.RA
|
||||
return bridges.GetBridge(self.Location + new CVec(offset[0], offset[1]));
|
||||
}
|
||||
|
||||
public IEnumerable<Renderable> RenderAsTerrain(Actor self)
|
||||
bool initializePalettes = true;
|
||||
PaletteReference terrainPalette;
|
||||
public IEnumerable<Renderable> RenderAsTerrain(WorldRenderer wr, Actor self)
|
||||
{
|
||||
if (initializePalettes)
|
||||
{
|
||||
terrainPalette = wr.Palette("terrain");
|
||||
initializePalettes = false;
|
||||
}
|
||||
|
||||
foreach (var t in TileSprites[currentTemplate])
|
||||
yield return new Renderable(t.Value, t.Key.ToPPos().ToFloat2(), "terrain", Game.CellSize * t.Key.Y);
|
||||
yield return new Renderable(t.Value, t.Key.ToPPos().ToFloat2(), terrainPalette, Game.CellSize * t.Key.Y);
|
||||
}
|
||||
|
||||
bool IsIntact(Bridge b)
|
||||
|
||||
@@ -19,6 +19,7 @@ namespace OpenRA.Mods.RA.Buildings
|
||||
public readonly int RepairPercent = 20;
|
||||
public readonly int RepairInterval = 24;
|
||||
public readonly int RepairStep = 7;
|
||||
public readonly string IndicatorPalettePrefix = "player";
|
||||
|
||||
public object Create(ActorInitializer init) { return new RepairableBuilding(init.self, this); }
|
||||
}
|
||||
@@ -51,7 +52,7 @@ namespace OpenRA.Mods.RA.Buildings
|
||||
Sound.PlayNotification(Repairer, "Speech", "Repairing", self.Owner.Country.Race);
|
||||
|
||||
self.World.AddFrameEndTask(
|
||||
w => w.Add(new RepairIndicator(self, p)));
|
||||
w => w.Add(new RepairIndicator(self, Info.IndicatorPalettePrefix, p)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,8 +33,6 @@ namespace OpenRA.Mods.RA
|
||||
remainingFrames--;
|
||||
}
|
||||
|
||||
static List<string> excludePalettes = new List<string>{"cursor", "chrome", "colorpicker", "shroud", "fog"};
|
||||
|
||||
public void AdjustPalette(Dictionary<string,Palette> palettes)
|
||||
{
|
||||
if (remainingFrames == 0)
|
||||
@@ -44,9 +42,6 @@ namespace OpenRA.Mods.RA
|
||||
|
||||
foreach (var pal in palettes)
|
||||
{
|
||||
if (excludePalettes.Contains(pal.Key))
|
||||
continue;
|
||||
|
||||
for (var x = 0; x < 256; x++)
|
||||
{
|
||||
var orig = pal.Value.GetColor(x);
|
||||
|
||||
@@ -12,6 +12,7 @@ using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using OpenRA.Graphics;
|
||||
using OpenRA.Traits;
|
||||
|
||||
namespace OpenRA.Mods.RA
|
||||
@@ -67,13 +68,13 @@ namespace OpenRA.Mods.RA
|
||||
|
||||
static readonly Renderable[] Nothing = { };
|
||||
|
||||
public IEnumerable<Renderable> ModifyRender(Actor self, IEnumerable<Renderable> rs)
|
||||
public IEnumerable<Renderable> ModifyRender(Actor self, WorldRenderer wr, IEnumerable<Renderable> r)
|
||||
{
|
||||
if (remainingTime > 0)
|
||||
return rs;
|
||||
return r;
|
||||
|
||||
if (Cloaked && IsVisible(self))
|
||||
return rs.Select(a => a.WithPalette(info.Palette));
|
||||
return r.Select(a => a.WithPalette(wr.Palette(info.Palette)));
|
||||
else
|
||||
return Nothing;
|
||||
}
|
||||
|
||||
@@ -1,47 +0,0 @@
|
||||
#region Copyright & License Information
|
||||
/*
|
||||
* Copyright 2007-2011 The OpenRA Developers (see AUTHORS)
|
||||
* This file is part of OpenRA, which is free software. It is made
|
||||
* available to you under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation. For more information,
|
||||
* see COPYING.
|
||||
*/
|
||||
#endregion
|
||||
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using OpenRA.FileFormats;
|
||||
using OpenRA.Graphics;
|
||||
using OpenRA.Traits;
|
||||
|
||||
namespace OpenRA.Mods.RA
|
||||
{
|
||||
public class ColorPickerPaletteModifierInfo : ITraitInfo
|
||||
{
|
||||
public string PlayerPalette = "player";
|
||||
public object Create( ActorInitializer init ) { return new ColorPickerPaletteModifier( this ); }
|
||||
}
|
||||
|
||||
public class ColorPickerPaletteModifier : IPalette, IPaletteModifier
|
||||
{
|
||||
ColorPickerPaletteModifierInfo Info;
|
||||
int[] index;
|
||||
public ColorRamp Ramp;
|
||||
|
||||
public ColorPickerPaletteModifier(ColorPickerPaletteModifierInfo info) { Info = info; }
|
||||
|
||||
public void InitPalette( WorldRenderer wr )
|
||||
{
|
||||
var info = Rules.Info["player"].Traits.WithInterface<PlayerColorPaletteInfo>()
|
||||
.First(p => p.BaseName == Info.PlayerPalette);
|
||||
index = info.RemapIndex;
|
||||
wr.AddPalette("colorpicker", wr.GetPalette(info.BasePalette));
|
||||
}
|
||||
|
||||
public void AdjustPalette(Dictionary<string, Palette> palettes)
|
||||
{
|
||||
palettes["colorpicker"] = new Palette(palettes["colorpicker"],
|
||||
new PlayerColorRemap(index, Ramp));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -13,10 +13,11 @@ using System.Linq;
|
||||
using OpenRA.Traits;
|
||||
using OpenRA.Mods.RA.Effects;
|
||||
using OpenRA.Mods.RA.Move;
|
||||
using OpenRA.Mods.RA.Render;
|
||||
|
||||
namespace OpenRA.Mods.RA
|
||||
{
|
||||
class CrushableInfantryInfo : ITraitInfo, Requires<MobileInfo>
|
||||
class CrushableInfantryInfo : ITraitInfo, Requires<MobileInfo>, Requires<RenderInfantryInfo>
|
||||
{
|
||||
public readonly string CrushSound = "squish2.aud";
|
||||
public readonly string CorpseSequence = "die-crushed";
|
||||
@@ -29,11 +30,13 @@ namespace OpenRA.Mods.RA
|
||||
{
|
||||
readonly Actor self;
|
||||
readonly CrushableInfantryInfo Info;
|
||||
readonly RenderInfantry ri;
|
||||
|
||||
public CrushableInfantry(Actor self, CrushableInfantryInfo info)
|
||||
{
|
||||
this.self = self;
|
||||
this.Info = info;
|
||||
ri = self.Trait<RenderInfantry>();
|
||||
}
|
||||
|
||||
public void WarnCrush(Actor crusher)
|
||||
@@ -45,12 +48,7 @@ namespace OpenRA.Mods.RA
|
||||
public void OnCrush(Actor crusher)
|
||||
{
|
||||
Sound.Play(Info.CrushSound, crusher.CenterLocation);
|
||||
self.World.AddFrameEndTask(w =>
|
||||
{
|
||||
if (!self.Destroyed)
|
||||
w.Add(new Corpse(self, Info.CorpseSequence));
|
||||
});
|
||||
|
||||
ri.SpawnCorpse(self, Info.CorpseSequence);
|
||||
self.Kill(crusher);
|
||||
}
|
||||
|
||||
|
||||
@@ -144,7 +144,7 @@ namespace OpenRA.Mods.RA.Effects
|
||||
|
||||
const float height = .1f;
|
||||
|
||||
public IEnumerable<Renderable> Render()
|
||||
public IEnumerable<Renderable> Render(WorldRenderer wr)
|
||||
{
|
||||
if (anim != null)
|
||||
{
|
||||
@@ -158,15 +158,15 @@ namespace OpenRA.Mods.RA.Effects
|
||||
if (Info.High || Info.Angle > 0)
|
||||
{
|
||||
if (Info.Shadow)
|
||||
yield return new Renderable(anim.Image, pos - .5f * anim.Image.size, "shadow", (int)pos.Y);
|
||||
yield return new Renderable(anim.Image, pos - .5f * anim.Image.size, wr.Palette("shadow"), (int)pos.Y);
|
||||
|
||||
var highPos = pos - new float2(0, GetAltitude());
|
||||
|
||||
yield return new Renderable(anim.Image, highPos - .5f * anim.Image.size, "effect", (int)pos.Y);
|
||||
yield return new Renderable(anim.Image, highPos - .5f * anim.Image.size, wr.Palette("effect"), (int)pos.Y);
|
||||
}
|
||||
else
|
||||
yield return new Renderable(anim.Image, pos - .5f * anim.Image.size,
|
||||
Args.weapon.Underwater ? "shadow" : "effect", (int)pos.Y);
|
||||
wr.Palette(Args.weapon.Underwater ? "shadow" : "effect"), (int)pos.Y);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -49,7 +49,7 @@ namespace OpenRA.Mods.RA.Effects
|
||||
pos -= new PVecInt(0, velocity);
|
||||
}
|
||||
|
||||
public IEnumerable<Renderable> Render()
|
||||
public IEnumerable<Renderable> Render(WorldRenderer wr)
|
||||
{
|
||||
font.DrawTextWithContrast(s, Game.viewport.Zoom*(pos.ToFloat2() - Game.viewport.Location) - offset, color, Color.Black,1);
|
||||
yield break;
|
||||
|
||||
@@ -19,24 +19,21 @@ namespace OpenRA.Mods.RA.Effects
|
||||
{
|
||||
readonly Animation anim;
|
||||
readonly float2 pos;
|
||||
readonly string palette;
|
||||
readonly string paletteName;
|
||||
|
||||
public Corpse(Actor fromActor, string sequence)
|
||||
public Corpse(World world, float2 pos, string image, string sequence, string paletteName)
|
||||
{
|
||||
var rs = fromActor.Trait<RenderSimple>();
|
||||
palette = rs.Palette(fromActor.Owner);
|
||||
anim = new Animation(rs.GetImage(fromActor));
|
||||
anim.PlayThen(sequence,
|
||||
() => fromActor.World.AddFrameEndTask(w => w.Remove(this)));
|
||||
|
||||
pos = fromActor.CenterLocation.ToFloat2();
|
||||
this.pos = pos;
|
||||
this.paletteName = paletteName;
|
||||
anim = new Animation(image);
|
||||
anim.PlayThen(sequence, () => world.AddFrameEndTask(w => w.Remove(this)));
|
||||
}
|
||||
|
||||
public void Tick(World world) { anim.Tick(); }
|
||||
|
||||
public IEnumerable<Renderable> Render()
|
||||
public IEnumerable<Renderable> Render(WorldRenderer wr)
|
||||
{
|
||||
yield return new Renderable(anim.Image, pos - .5f * anim.Image.size, palette, (int)pos.Y);
|
||||
yield return new Renderable(anim.Image, pos - .5f * anim.Image.size, wr.Palette(paletteName), (int)pos.Y);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -39,11 +39,12 @@ namespace OpenRA.Mods.RA.Effects
|
||||
anim.Tick();
|
||||
}
|
||||
|
||||
public IEnumerable<Renderable> Render()
|
||||
public IEnumerable<Renderable> Render(WorldRenderer wr)
|
||||
{
|
||||
if (a.IsInWorld)
|
||||
yield return new Renderable(anim.Image,
|
||||
a.CenterLocation.ToFloat2() - .5f * anim.Image.size + offset, "effect", (int)a.CenterLocation.Y);
|
||||
a.CenterLocation.ToFloat2() - .5f * anim.Image.size + offset,
|
||||
wr.Palette("effect"), (int)a.CenterLocation.Y);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,11 +32,11 @@ namespace OpenRA.Mods.RA.Effects
|
||||
|
||||
public void Tick( World world ) { anim.Tick(); }
|
||||
|
||||
public IEnumerable<Renderable> Render()
|
||||
public IEnumerable<Renderable> Render(WorldRenderer wr)
|
||||
{
|
||||
yield return new Renderable(anim.Image,
|
||||
pos.ToFloat2() - .5f * anim.Image.size - new int2(0,altitude),
|
||||
"effect", (int)pos.Y - altitude);
|
||||
wr.Palette("effect"), (int)pos.Y - altitude);
|
||||
}
|
||||
|
||||
public Player Owner { get { return null; } }
|
||||
|
||||
@@ -15,65 +15,76 @@ using OpenRA.Traits;
|
||||
|
||||
namespace OpenRA.Mods.RA.Effects
|
||||
{
|
||||
class GpsDotInfo : ITraitInfo, Requires<RenderSimpleInfo>
|
||||
class GpsDotInfo : ITraitInfo
|
||||
{
|
||||
public readonly string String = "Infantry";
|
||||
public readonly string IndicatorPalettePrefix = "player";
|
||||
|
||||
public object Create(ActorInitializer init)
|
||||
{
|
||||
return new GpsDot(init, String);
|
||||
return new GpsDot(init.self, this);
|
||||
}
|
||||
}
|
||||
|
||||
class GpsDot : IEffect
|
||||
{
|
||||
Actor self;
|
||||
GpsWatcher watcher;
|
||||
RenderSimple rs;
|
||||
bool show = false;
|
||||
GpsDotInfo info;
|
||||
Animation anim;
|
||||
|
||||
public GpsDot(ActorInitializer init, string s)
|
||||
{
|
||||
anim = new Animation("gpsdot");
|
||||
anim.PlayRepeating(s);
|
||||
GpsWatcher watcher;
|
||||
HiddenUnderFog huf;
|
||||
Spy spy;
|
||||
bool show = false;
|
||||
|
||||
public GpsDot(Actor self, GpsDotInfo info)
|
||||
{
|
||||
this.self = self;
|
||||
this.info = info;
|
||||
anim = new Animation("gpsdot");
|
||||
anim.PlayRepeating(info.String);
|
||||
|
||||
self = init.self;
|
||||
rs = self.Trait<RenderSimple>();
|
||||
self.World.AddFrameEndTask(w => w.Add(this));
|
||||
if (self.World.LocalPlayer != null)
|
||||
watcher = self.World.LocalPlayer.PlayerActor.Trait<GpsWatcher>();
|
||||
}
|
||||
|
||||
bool firstTick = true;
|
||||
public void Tick(World world)
|
||||
{
|
||||
show = false;
|
||||
|
||||
if (self.Destroyed)
|
||||
world.AddFrameEndTask(w => w.Remove(this));
|
||||
|
||||
if (world.LocalPlayer == null)
|
||||
if (world.LocalPlayer == null || !self.IsInWorld || self.Destroyed)
|
||||
return;
|
||||
|
||||
if (
|
||||
self.IsInWorld
|
||||
&& (watcher.Granted || watcher.GrantedAllies)
|
||||
&& !self.Trait<HiddenUnderFog>().IsVisible(self.World.RenderedShroud, self) // WRONG
|
||||
&& (!self.HasTrait<Cloak>() || !self.Trait<Cloak>().Cloaked)
|
||||
&& (!self.HasTrait<Spy>() || !self.Trait<Spy>().Disguised)
|
||||
)
|
||||
// Can be granted at runtime via a crate, so can't cache
|
||||
var cloak = self.TraitOrDefault<Cloak>();
|
||||
|
||||
if (firstTick)
|
||||
{
|
||||
show = true;
|
||||
}
|
||||
huf = self.TraitOrDefault<HiddenUnderFog>();
|
||||
spy = self.TraitOrDefault<Spy>();
|
||||
firstTick = false;
|
||||
}
|
||||
|
||||
public IEnumerable<Renderable> Render()
|
||||
{
|
||||
if (show && !self.Destroyed)
|
||||
var hasGps = (watcher != null && (watcher.Granted || watcher.GrantedAllies));
|
||||
var hasDot = (huf != null && !huf.IsVisible(self.World.RenderedShroud, self)); // WRONG (why?)
|
||||
var dotHidden = (cloak != null && cloak.Cloaked) || (spy != null && spy.Disguised);
|
||||
|
||||
show = hasGps && hasDot && !dotHidden;
|
||||
}
|
||||
|
||||
public IEnumerable<Renderable> Render(WorldRenderer wr)
|
||||
{
|
||||
if (!show || self.Destroyed)
|
||||
yield break;
|
||||
|
||||
var p = self.CenterLocation;
|
||||
yield return new Renderable(anim.Image, p.ToFloat2() - 0.5f * anim.Image.size, rs.Palette(self.Owner), p.Y)
|
||||
var palette = wr.Palette(info.IndicatorPalettePrefix+self.Owner.InternalName);
|
||||
yield return new Renderable(anim.Image, p.ToFloat2() - 0.5f * anim.Image.size, palette, p.Y)
|
||||
.WithScale(1.5f);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -36,9 +36,9 @@ namespace OpenRA.Mods.RA.Effects
|
||||
world.AddFrameEndTask(w => w.Remove(this));
|
||||
}
|
||||
|
||||
public IEnumerable<Renderable> Render()
|
||||
public IEnumerable<Renderable> Render(WorldRenderer wr)
|
||||
{
|
||||
yield return new Renderable(anim.Image,offset, "effect", (int)offset.Y);
|
||||
yield return new Renderable(anim.Image,offset, wr.Palette("effect"), (int)offset.Y);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -51,10 +51,10 @@ namespace OpenRA.Mods.RA.Effects
|
||||
anim.Tick();
|
||||
}
|
||||
|
||||
public IEnumerable<Renderable> Render()
|
||||
public IEnumerable<Renderable> Render(WorldRenderer wr)
|
||||
{
|
||||
yield return new Renderable(anim.Image,
|
||||
Args.dest.ToInt2() - new int2(0, altitude) - .5f * anim.Image.size, "effect", Args.dest.Y);
|
||||
var pos = Args.dest.ToInt2() - new int2(0, altitude) - .5f * anim.Image.size;
|
||||
yield return new Renderable(anim.Image, pos, wr.Palette("effect"), Args.dest.Y);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
|
||||
using System.Collections.Generic;
|
||||
using OpenRA.Effects;
|
||||
using OpenRA.Graphics;
|
||||
using OpenRA.Traits;
|
||||
|
||||
namespace OpenRA.Mods.RA.Effects
|
||||
@@ -31,13 +32,13 @@ namespace OpenRA.Mods.RA.Effects
|
||||
world.AddFrameEndTask(w => w.Remove(this));
|
||||
}
|
||||
|
||||
public IEnumerable<Renderable> Render()
|
||||
public IEnumerable<Renderable> Render(WorldRenderer wr)
|
||||
{
|
||||
if (a.Destroyed) // Tick will clean up
|
||||
yield break;
|
||||
|
||||
foreach (var r in a.Render())
|
||||
yield return r.WithPalette("invuln");
|
||||
foreach (var r in a.Render(wr))
|
||||
yield return r.WithPalette(wr.Palette("invuln"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -74,11 +74,11 @@ namespace OpenRA.Mods.RA.Effects
|
||||
world.AddFrameEndTask(w => w.Remove(this));
|
||||
}
|
||||
|
||||
public IEnumerable<Renderable> Render()
|
||||
public IEnumerable<Renderable> Render(WorldRenderer wr)
|
||||
{
|
||||
if (explosion != null)
|
||||
yield return new Renderable(explosion.Image,
|
||||
args.dest.ToFloat2() - .5f * explosion.Image.size, "effect", (int)args.dest.Y);
|
||||
yield return new Renderable(explosion.Image, args.dest.ToFloat2() - .5f * explosion.Image.size,
|
||||
wr.Palette("effect"), (int)args.dest.Y);
|
||||
|
||||
if (ticks >= info.BeamDuration)
|
||||
yield break;
|
||||
|
||||
@@ -152,11 +152,11 @@ namespace OpenRA.Mods.RA.Effects
|
||||
Combat.DoImpacts(Args);
|
||||
}
|
||||
|
||||
public IEnumerable<Renderable> Render()
|
||||
public IEnumerable<Renderable> Render(WorldRenderer wr)
|
||||
{
|
||||
if (Args.firedBy.World.RenderedShroud.IsVisible(PxPosition.ToCPos()))
|
||||
yield return new Renderable(anim.Image, PxPosition.ToFloat2() - 0.5f * anim.Image.size - new float2(0, Altitude),
|
||||
Args.weapon.Underwater ? "shadow" : "effect", PxPosition.Y);
|
||||
wr.Palette(Args.weapon.Underwater ? "shadow" : "effect"), PxPosition.Y);
|
||||
|
||||
if (Trail != null)
|
||||
Trail.Render(Args.firedBy);
|
||||
|
||||
@@ -77,10 +77,10 @@ namespace OpenRA.Mods.RA.Effects
|
||||
a.Trait.Enable();
|
||||
}
|
||||
|
||||
public IEnumerable<Renderable> Render()
|
||||
public IEnumerable<Renderable> Render(WorldRenderer wr)
|
||||
{
|
||||
yield return new Renderable(anim.Image, pos.ToFloat2() - 0.5f * anim.Image.size - new float2(0, altitude),
|
||||
"effect", (int)pos.Y);
|
||||
wr.Palette("effect"), (int)pos.Y);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
#endregion
|
||||
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using OpenRA.Effects;
|
||||
using OpenRA.Graphics;
|
||||
using OpenRA.Traits;
|
||||
@@ -17,8 +18,6 @@ namespace OpenRA.Mods.RA.Effects
|
||||
{
|
||||
public class Parachute : IEffect
|
||||
{
|
||||
readonly Animation anim;
|
||||
readonly string palette;
|
||||
readonly Animation paraAnim;
|
||||
readonly PPos location;
|
||||
|
||||
@@ -28,29 +27,19 @@ namespace OpenRA.Mods.RA.Effects
|
||||
float altitude;
|
||||
const float fallRate = .3f;
|
||||
|
||||
public Parachute(Player owner, PPos location, int altitude, Actor cargo)
|
||||
public Parachute(Actor cargo, PPos location, int altitude)
|
||||
{
|
||||
this.location = location;
|
||||
this.altitude = altitude;
|
||||
this.cargo = cargo;
|
||||
|
||||
var rs = cargo.Trait<RenderSimple>();
|
||||
var image = rs.anim.Name;
|
||||
palette = rs.Palette(owner);
|
||||
|
||||
anim = new Animation(image);
|
||||
if (anim.HasSequence("idle"))
|
||||
anim.PlayFetchIndex("idle", () => 0);
|
||||
else
|
||||
anim.PlayFetchIndex("stand", () => 0);
|
||||
anim.Tick();
|
||||
|
||||
var pai = cargo.Info.Traits.GetOrDefault<ParachuteAttachmentInfo>();
|
||||
|
||||
paraAnim = new Animation(pai != null ? pai.ParachuteSprite : "parach");
|
||||
paraAnim.PlayThen("open", () => paraAnim.PlayRepeating("idle"));
|
||||
|
||||
if (pai != null) offset = pai.Offset;
|
||||
|
||||
cargo.Trait<ITeleportable>().SetPxPosition(cargo, location);
|
||||
}
|
||||
|
||||
public void Tick(World world)
|
||||
@@ -73,12 +62,18 @@ namespace OpenRA.Mods.RA.Effects
|
||||
});
|
||||
}
|
||||
|
||||
public IEnumerable<Renderable> Render()
|
||||
public IEnumerable<Renderable> Render(WorldRenderer wr)
|
||||
{
|
||||
var rc = cargo.Render(wr).Select(a => a.WithPos(a.Pos - new float2(0, altitude))
|
||||
.WithZOffset(a.ZOffset + (int)altitude));
|
||||
foreach (var c in rc)
|
||||
{
|
||||
yield return c.WithPos(location.ToFloat2() - .5f * c.Sprite.size).WithPalette(wr.Palette("shadow")).WithZOffset(0);
|
||||
yield return c.WithZOffset(2);
|
||||
}
|
||||
|
||||
var pos = location.ToFloat2() - new float2(0, altitude);
|
||||
yield return new Renderable(anim.Image, location.ToFloat2() - .5f * anim.Image.size, "shadow", 0);
|
||||
yield return new Renderable(anim.Image, pos - .5f * anim.Image.size, palette, 2);
|
||||
yield return new Renderable(paraAnim.Image, pos - .5f * paraAnim.Image.size + offset, palette, 3);
|
||||
yield return new Renderable(paraAnim.Image, pos - .5f * paraAnim.Image.size + offset, rc.First().Palette, 3);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,11 +34,11 @@ namespace OpenRA.Mods.RA.Effects
|
||||
anim.Tick();
|
||||
}
|
||||
|
||||
public IEnumerable<Renderable> Render()
|
||||
public IEnumerable<Renderable> Render(WorldRenderer wr)
|
||||
{
|
||||
if (!a.Destroyed && (a.World.LocalPlayer == null || a.Owner.Stances[a.Owner.World.LocalPlayer] == Stance.Ally))
|
||||
yield return new Renderable(anim.Image,
|
||||
a.CenterLocation.ToFloat2() - .5f * anim.Image.size, "chrome", (int)a.CenterLocation.Y);
|
||||
yield return new Renderable(anim.Image, a.CenterLocation.ToFloat2() - .5f * anim.Image.size,
|
||||
wr.Palette("chrome"), (int)a.CenterLocation.Y);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,13 +20,15 @@ namespace OpenRA.Mods.RA.Effects
|
||||
{
|
||||
readonly Actor building;
|
||||
readonly RA.RallyPoint rp;
|
||||
readonly string palettePrefix;
|
||||
public Animation flag = new Animation("rallypoint");
|
||||
public Animation circles = new Animation("rallypoint");
|
||||
|
||||
public RallyPoint(Actor building)
|
||||
public RallyPoint(Actor building, string palettePrefix)
|
||||
{
|
||||
this.building = building;
|
||||
rp = building.Trait<RA.RallyPoint>();
|
||||
this.palettePrefix = palettePrefix;
|
||||
flag.PlayRepeating("flag");
|
||||
circles.Play("circles");
|
||||
}
|
||||
@@ -46,13 +48,13 @@ namespace OpenRA.Mods.RA.Effects
|
||||
world.AddFrameEndTask(w => w.Remove(this));
|
||||
}
|
||||
|
||||
public IEnumerable<Renderable> Render()
|
||||
public IEnumerable<Renderable> Render(WorldRenderer wr)
|
||||
{
|
||||
if (building.IsInWorld && building.Owner == building.World.LocalPlayer
|
||||
&& building.World.Selection.Actors.Contains(building))
|
||||
{
|
||||
var pos = Traits.Util.CenterOfCell(rp.rallyPoint);
|
||||
var palette = building.Trait<RenderSimple>().Palette(building.Owner);
|
||||
var palette = wr.Palette(palettePrefix+building.Owner.InternalName);
|
||||
|
||||
yield return new Renderable(circles.Image,
|
||||
pos.ToFloat2() - .5f * circles.Image.size,
|
||||
|
||||
@@ -20,34 +20,35 @@ namespace OpenRA.Mods.RA.Effects
|
||||
{
|
||||
Actor building;
|
||||
Player player;
|
||||
string palettePrefix;
|
||||
Animation anim = new Animation("allyrepair");
|
||||
RepairableBuilding rb;
|
||||
|
||||
public RepairIndicator(Actor building, Player player)
|
||||
public RepairIndicator(Actor building, string palettePrefix, Player player)
|
||||
{
|
||||
this.building = building;
|
||||
this.player = player;
|
||||
this.palettePrefix = palettePrefix;
|
||||
rb = building.Trait<RepairableBuilding>();
|
||||
anim.PlayRepeating("repair");
|
||||
}
|
||||
|
||||
public void Tick(World world)
|
||||
{
|
||||
if (!building.IsInWorld ||
|
||||
building.IsDead() ||
|
||||
building.Trait<RepairableBuilding>().Repairer == null ||
|
||||
building.Trait<RepairableBuilding>().Repairer != player)
|
||||
if (!building.IsInWorld || building.IsDead() ||
|
||||
rb.Repairer == null || rb.Repairer != player)
|
||||
world.AddFrameEndTask(w => w.Remove(this));
|
||||
|
||||
anim.Tick();
|
||||
}
|
||||
|
||||
public IEnumerable<Renderable> Render()
|
||||
public IEnumerable<Renderable> Render(WorldRenderer wr)
|
||||
{
|
||||
if (!building.Destroyed)
|
||||
{
|
||||
var palette = building.Trait<RenderSimple>().Palette(player);
|
||||
|
||||
yield return new Renderable(anim.Image,
|
||||
building.CenterLocation.ToFloat2() - .5f * anim.Image.size, palette, (int)building.CenterLocation.Y);
|
||||
building.CenterLocation.ToFloat2() - .5f * anim.Image.size,
|
||||
wr.Palette(palettePrefix+player.InternalName), (int)building.CenterLocation.Y);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -40,9 +40,9 @@ namespace OpenRA.Mods.RA.Effects
|
||||
}
|
||||
}
|
||||
|
||||
public IEnumerable<Renderable> Render()
|
||||
public IEnumerable<Renderable> Render(WorldRenderer wr)
|
||||
{
|
||||
yield return new Renderable(doors.Image, pos, "effect", (int)doorOffset.Y);
|
||||
yield return new Renderable(doors.Image, pos, wr.Palette("effect"), (int)doorOffset.Y);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,9 +33,10 @@ namespace OpenRA.Mods.RA.Effects
|
||||
anim.Tick();
|
||||
}
|
||||
|
||||
public IEnumerable<Renderable> Render()
|
||||
public IEnumerable<Renderable> Render(WorldRenderer wr)
|
||||
{
|
||||
yield return new Renderable(anim.Image, pos.ToFloat2() - .5f * anim.Image.size, "effect", (int)pos.Y);
|
||||
yield return new Renderable(anim.Image, pos.ToFloat2() - .5f * anim.Image.size,
|
||||
wr.Palette("effect"), (int)pos.Y);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,21 +29,29 @@ namespace OpenRA.Mods.RA.Effects
|
||||
class TeslaZap : IEffect
|
||||
{
|
||||
readonly ProjectileArgs Args;
|
||||
readonly TeslaZapInfo Info;
|
||||
IEnumerable<Renderable> renderables;
|
||||
int timeUntilRemove = 2; // # of frames
|
||||
bool doneDamage = false;
|
||||
|
||||
readonly List<Renderable> renderables = new List<Renderable>();
|
||||
bool initialized = false;
|
||||
|
||||
public TeslaZap(TeslaZapInfo info, ProjectileArgs args)
|
||||
{
|
||||
Args = args;
|
||||
var bright = SequenceProvider.GetSequence(info.Image, "bright");
|
||||
var dim = SequenceProvider.GetSequence(info.Image, "dim");
|
||||
Info = info;
|
||||
}
|
||||
|
||||
for( var n = 0; n < info.DimZaps; n++ )
|
||||
renderables.AddRange(DrawZapWandering(args.src, args.dest, dim));
|
||||
for( var n = 0; n < info.BrightZaps; n++ )
|
||||
renderables.AddRange(DrawZapWandering(args.src, args.dest, bright));
|
||||
public IEnumerable<Renderable> GenerateRenderables(WorldRenderer wr)
|
||||
{
|
||||
var bright = SequenceProvider.GetSequence(Info.Image, "bright");
|
||||
var dim = SequenceProvider.GetSequence(Info.Image, "dim");
|
||||
|
||||
for (var n = 0; n < Info.DimZaps; n++)
|
||||
foreach (var z in DrawZapWandering(wr, Args.src, Args.dest, dim))
|
||||
yield return z;
|
||||
for (var n = 0; n < Info.BrightZaps; n++)
|
||||
foreach (var z in DrawZapWandering(wr, Args.src, Args.dest, bright))
|
||||
yield return z;
|
||||
}
|
||||
|
||||
public void Tick(World world)
|
||||
@@ -62,9 +70,18 @@ namespace OpenRA.Mods.RA.Effects
|
||||
}
|
||||
}
|
||||
|
||||
public IEnumerable<Renderable> Render() { return renderables; }
|
||||
public IEnumerable<Renderable> Render(WorldRenderer wr)
|
||||
{
|
||||
if (!initialized)
|
||||
{
|
||||
renderables = GenerateRenderables(wr);
|
||||
initialized = true;
|
||||
}
|
||||
|
||||
static IEnumerable<Renderable> DrawZapWandering(PPos from, PPos to, Sequence s)
|
||||
return renderables;
|
||||
}
|
||||
|
||||
static IEnumerable<Renderable> DrawZapWandering(WorldRenderer wr, PPos from, PPos to, Sequence s)
|
||||
{
|
||||
var z = float2.Zero; /* hack */
|
||||
var dist = to - from;
|
||||
@@ -76,22 +93,22 @@ namespace OpenRA.Mods.RA.Effects
|
||||
var p1 = from.ToFloat2() + (1 / 3f) * dist.ToFloat2() + Game.CosmeticRandom.Gauss1D(1) * .2f * dist.Length * norm;
|
||||
var p2 = from.ToFloat2() + (2 / 3f) * dist.ToFloat2() + Game.CosmeticRandom.Gauss1D(1) * .2f * dist.Length * norm;
|
||||
|
||||
renderables.AddRange(DrawZap(from.ToFloat2(), p1, s, out p1));
|
||||
renderables.AddRange(DrawZap(p1, p2, s, out p2));
|
||||
renderables.AddRange(DrawZap(p2, to.ToFloat2(), s, out z));
|
||||
renderables.AddRange(DrawZap(wr, from.ToFloat2(), p1, s, out p1));
|
||||
renderables.AddRange(DrawZap(wr, p1, p2, s, out p2));
|
||||
renderables.AddRange(DrawZap(wr, p2, to.ToFloat2(), s, out z));
|
||||
}
|
||||
else
|
||||
{
|
||||
var p1 = from.ToFloat2() + (1 / 2f) * dist.ToFloat2() + Game.CosmeticRandom.Gauss1D(1) * .2f * dist.Length * norm;
|
||||
|
||||
renderables.AddRange(DrawZap(from.ToFloat2(), p1, s, out p1));
|
||||
renderables.AddRange(DrawZap(p1, to.ToFloat2(), s, out z));
|
||||
renderables.AddRange(DrawZap(wr, from.ToFloat2(), p1, s, out p1));
|
||||
renderables.AddRange(DrawZap(wr, p1, to.ToFloat2(), s, out z));
|
||||
}
|
||||
|
||||
return renderables;
|
||||
}
|
||||
|
||||
static IEnumerable<Renderable> DrawZap(float2 from, float2 to, Sequence s, out float2 p)
|
||||
static IEnumerable<Renderable> DrawZap(WorldRenderer wr, float2 from, float2 to, Sequence s, out float2 p)
|
||||
{
|
||||
var dist = to - from;
|
||||
var q = new float2(-dist.Y, dist.X);
|
||||
@@ -104,7 +121,8 @@ namespace OpenRA.Mods.RA.Effects
|
||||
var step = steps.Where(t => (to - (z + new float2(t[0],t[1]))).LengthSquared < (to - z).LengthSquared )
|
||||
.OrderBy(t => Math.Abs(float2.Dot(z + new float2(t[0], t[1]), q) + c)).First();
|
||||
|
||||
rs.Add(new Renderable(s.GetSprite(step[4]), z + new float2(step[2], step[3]), "effect", (int)from.Y));
|
||||
rs.Add(new Renderable(s.GetSprite(step[4]), z + new float2(step[2], step[3]),
|
||||
wr.Palette("effect"), (int)from.Y));
|
||||
z += new float2(step[0], step[1]);
|
||||
if( rs.Count >= 1000 )
|
||||
break;
|
||||
|
||||
44
OpenRA.Mods.RA/FogPalette.cs
Normal file
44
OpenRA.Mods.RA/FogPalette.cs
Normal file
@@ -0,0 +1,44 @@
|
||||
#region Copyright & License Information
|
||||
/*
|
||||
* Copyright 2007-2013 The OpenRA Developers (see AUTHORS)
|
||||
* This file is part of OpenRA, which is free software. It is made
|
||||
* available to you under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation. For more information,
|
||||
* see COPYING.
|
||||
*/
|
||||
#endregion
|
||||
|
||||
using System.Drawing;
|
||||
using OpenRA.FileFormats;
|
||||
using OpenRA.Graphics;
|
||||
using OpenRA.Traits;
|
||||
|
||||
namespace OpenRA.Mods.RA
|
||||
{
|
||||
class FogPaletteInfo : ITraitInfo
|
||||
{
|
||||
public readonly string Name = "fog";
|
||||
public object Create(ActorInitializer init) { return new FogPalette(this); }
|
||||
}
|
||||
|
||||
class FogPalette : IPalette
|
||||
{
|
||||
readonly FogPaletteInfo info;
|
||||
|
||||
public FogPalette(FogPaletteInfo info) { this.info = info; }
|
||||
|
||||
public void InitPalette(WorldRenderer wr)
|
||||
{
|
||||
var c = new[] {
|
||||
Color.Transparent, Color.Green,
|
||||
Color.Blue, Color.Yellow,
|
||||
Color.FromArgb(128,0,0,0),
|
||||
Color.FromArgb(128,0,0,0),
|
||||
Color.FromArgb(128,0,0,0),
|
||||
Color.FromArgb(64,0,0,0)
|
||||
};
|
||||
|
||||
wr.AddPalette(info.Name, new Palette(Exts.MakeArray(256, i => (uint)c[i % 8].ToArgb())), false);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -97,23 +97,23 @@ namespace OpenRA.Mods.RA
|
||||
return Level > 0 ? Info.SpeedModifier[Level - 1] : 1m;
|
||||
}
|
||||
|
||||
public IEnumerable<Renderable> ModifyRender(Actor self, IEnumerable<Renderable> rs)
|
||||
public IEnumerable<Renderable> ModifyRender(Actor self, WorldRenderer wr, IEnumerable<Renderable> r)
|
||||
{
|
||||
if (self.Owner == self.World.LocalPlayer && Level > 0)
|
||||
return InnerModifyRender(self, rs);
|
||||
return InnerModifyRender(self, wr, r);
|
||||
else
|
||||
return rs;
|
||||
return r;
|
||||
}
|
||||
|
||||
IEnumerable<Renderable> InnerModifyRender(Actor self, IEnumerable<Renderable> rs)
|
||||
IEnumerable<Renderable> InnerModifyRender(Actor self, WorldRenderer wr, IEnumerable<Renderable> r)
|
||||
{
|
||||
foreach (var r in rs)
|
||||
yield return r;
|
||||
foreach (var rs in r)
|
||||
yield return rs;
|
||||
|
||||
RankAnim.Tick(); // HACK
|
||||
var bounds = self.Bounds.Value;
|
||||
yield return new Renderable(RankAnim.Image,
|
||||
new float2(bounds.Right - 6, bounds.Bottom - 8), "effect", self.CenterLocation.Y);
|
||||
yield return new Renderable(RankAnim.Image, new float2(bounds.Right - 6, bounds.Bottom - 8),
|
||||
wr.Palette("effect"), self.CenterLocation.Y);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using OpenRA.Graphics;
|
||||
using OpenRA.Traits;
|
||||
|
||||
namespace OpenRA.Mods.RA
|
||||
@@ -32,7 +33,7 @@ namespace OpenRA.Mods.RA
|
||||
|
||||
static readonly Renderable[] Nothing = { };
|
||||
|
||||
public IEnumerable<Renderable> ModifyRender(Actor self, IEnumerable<Renderable> r)
|
||||
public IEnumerable<Renderable> ModifyRender(Actor self, WorldRenderer wr, IEnumerable<Renderable> r)
|
||||
{
|
||||
return IsVisible(self.Owner.Shroud, self) ? r : Nothing;
|
||||
}
|
||||
|
||||
@@ -24,15 +24,10 @@ namespace OpenRA.Mods.RA
|
||||
t += .5f;
|
||||
}
|
||||
|
||||
static readonly string[] ExcludePalettes = { "cursor", "chrome", "colorpicker", "terrain" };
|
||||
|
||||
public void AdjustPalette(Dictionary<string,Palette> palettes)
|
||||
{
|
||||
foreach (var pal in palettes)
|
||||
{
|
||||
if (ExcludePalettes.Contains(pal.Key))
|
||||
continue;
|
||||
|
||||
var rotate = (int)t % 18;
|
||||
if (rotate > 9)
|
||||
rotate = 18 - rotate;
|
||||
|
||||
@@ -17,6 +17,7 @@ using OpenRA.Mods.RA.Activities;
|
||||
using OpenRA.Mods.RA.Buildings;
|
||||
using OpenRA.Mods.RA.Move;
|
||||
using OpenRA.Mods.RA.Render;
|
||||
using OpenRA.Graphics;
|
||||
using OpenRA.Traits;
|
||||
using OpenRA.Widgets;
|
||||
|
||||
@@ -489,19 +490,21 @@ namespace OpenRA.Mods.RA.Missions
|
||||
public override object Create(ActorInitializer init) { return new Allies04RenderHijacked(init.self, this); }
|
||||
}
|
||||
|
||||
class Allies04RenderHijacked : RenderUnit, IRenderModifier
|
||||
class Allies04RenderHijacked : RenderUnit
|
||||
{
|
||||
Allies04Hijackable hijackable;
|
||||
Allies04RenderHijackedInfo info;
|
||||
|
||||
public Allies04RenderHijacked(Actor self, Allies04RenderHijackedInfo info)
|
||||
: base(self)
|
||||
{
|
||||
this.info = info;
|
||||
hijackable = self.Trait<Allies04Hijackable>();
|
||||
}
|
||||
|
||||
public IEnumerable<Renderable> ModifyRender(Actor self, IEnumerable<Renderable> r)
|
||||
protected override string PaletteName(Actor self)
|
||||
{
|
||||
return r.Select(a => a.WithPalette(Palette(hijackable.OldOwner)));
|
||||
return info.Palette ?? info.PlayerPalette + hijackable.OldOwner.InternalName;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using OpenRA.Graphics;
|
||||
using OpenRA.Traits;
|
||||
|
||||
namespace OpenRA.Mods.RA
|
||||
@@ -24,7 +25,7 @@ namespace OpenRA.Mods.RA
|
||||
}
|
||||
|
||||
Renderable[] cache = { };
|
||||
public IEnumerable<Renderable> ModifyRender(Actor self, IEnumerable<Renderable> r)
|
||||
public IEnumerable<Renderable> ModifyRender(Actor self, WorldRenderer wr, IEnumerable<Renderable> r)
|
||||
{
|
||||
if (IsVisible(self.World.RenderedShroud, self))
|
||||
cache = r.ToArray();
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using OpenRA.Graphics;
|
||||
using OpenRA.Traits;
|
||||
|
||||
namespace OpenRA.Mods.RA
|
||||
@@ -24,7 +25,7 @@ namespace OpenRA.Mods.RA
|
||||
}
|
||||
|
||||
static Renderable[] Nothing = { };
|
||||
public IEnumerable<Renderable> ModifyRender(Actor self, IEnumerable<Renderable> r)
|
||||
public IEnumerable<Renderable> ModifyRender(Actor self, WorldRenderer wr, IEnumerable<Renderable> r)
|
||||
{
|
||||
return IsVisible(self.World.RenderedShroud, self) ? r : Nothing;
|
||||
}
|
||||
|
||||
@@ -33,8 +33,6 @@ namespace OpenRA.Mods.RA
|
||||
remainingFrames--;
|
||||
}
|
||||
|
||||
static List<string> excludePalettes = new List<string>{ "cursor", "chrome", "colorpicker", "shroud", "fog" };
|
||||
|
||||
public void AdjustPalette(Dictionary<string,Palette> palettes)
|
||||
{
|
||||
if (remainingFrames == 0)
|
||||
@@ -44,9 +42,6 @@ namespace OpenRA.Mods.RA
|
||||
|
||||
foreach (var pal in palettes)
|
||||
{
|
||||
if (excludePalettes.Contains(pal.Key))
|
||||
continue;
|
||||
|
||||
for (var x = 0; x < 256; x++)
|
||||
{
|
||||
var orig = pal.Value.GetColor(x);
|
||||
|
||||
@@ -169,7 +169,6 @@
|
||||
<Compile Include="ChronoshiftPaletteEffect.cs" />
|
||||
<Compile Include="Chronoshiftable.cs" />
|
||||
<Compile Include="Cloak.cs" />
|
||||
<Compile Include="ColorPickerPaletteModifier.cs" />
|
||||
<Compile Include="Combat.cs" />
|
||||
<Compile Include="ConquestVictoryConditions.cs" />
|
||||
<Compile Include="ContainsCrate.cs" />
|
||||
@@ -408,6 +407,8 @@
|
||||
<Compile Include="RenderShroudCircle.cs" />
|
||||
<Compile Include="Widgets\Logic\CheatsLogic.cs" />
|
||||
<Compile Include="CloakPaletteEffect.cs" />
|
||||
<Compile Include="Widgets\ColorPreviewManagerWidget.cs" />
|
||||
<Compile Include="FogPalette.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\OpenRA.FileFormats\OpenRA.FileFormats.csproj">
|
||||
|
||||
@@ -21,9 +21,10 @@ namespace OpenRA.Mods.RA.Orders
|
||||
{
|
||||
readonly Actor Producer;
|
||||
readonly string Building;
|
||||
readonly IEnumerable<Renderable> Preview;
|
||||
readonly BuildingInfo BuildingInfo;
|
||||
IEnumerable<Renderable> preview;
|
||||
Sprite buildOk, buildBlocked;
|
||||
bool initialized = false;
|
||||
|
||||
public PlaceBuildingOrderGenerator(Actor producer, string name)
|
||||
{
|
||||
@@ -31,9 +32,6 @@ namespace OpenRA.Mods.RA.Orders
|
||||
Building = name;
|
||||
BuildingInfo = Rules.Info[Building].Traits.Get<BuildingInfo>();
|
||||
|
||||
Preview = Rules.Info[Building].Traits.Get<RenderBuildingInfo>()
|
||||
.RenderPreview(Rules.Info[Building], producer.Owner);
|
||||
|
||||
buildOk = SequenceProvider.GetSequence("overlay", "build-valid").GetSprite(0);
|
||||
buildBlocked = SequenceProvider.GetSequence("overlay", "build-invalid").GetSprite(0);
|
||||
}
|
||||
@@ -89,9 +87,19 @@ namespace OpenRA.Mods.RA.Orders
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach (var r in Preview)
|
||||
if (!initialized)
|
||||
{
|
||||
var rbi = Rules.Info[Building].Traits.Get<RenderBuildingInfo>();
|
||||
var palette = rbi.Palette ?? (Producer.Owner != null ?
|
||||
rbi.PlayerPalette + Producer.Owner.InternalName : null);
|
||||
|
||||
preview = rbi.RenderPreview(Rules.Info[Building], wr.Palette(palette));
|
||||
initialized = true;
|
||||
}
|
||||
|
||||
foreach (var r in preview)
|
||||
r.Sprite.DrawAt(topLeft.ToPPos().ToFloat2() + r.Pos,
|
||||
wr.GetPaletteIndex(r.Palette),
|
||||
r.Palette.Index,
|
||||
r.Scale*r.Sprite.size);
|
||||
|
||||
var res = world.WorldActor.Trait<ResourceLayer>();
|
||||
|
||||
@@ -17,6 +17,7 @@ namespace OpenRA.Mods.RA
|
||||
{
|
||||
public readonly string Name = null;
|
||||
public readonly int[] ShadowIndex = { };
|
||||
public readonly bool AllowModifiers = true;
|
||||
|
||||
public object Create(ActorInitializer init) { return new PaletteFromCurrentTileset(init.world, this); }
|
||||
}
|
||||
@@ -34,7 +35,7 @@ namespace OpenRA.Mods.RA
|
||||
|
||||
public void InitPalette(OpenRA.Graphics.WorldRenderer wr)
|
||||
{
|
||||
wr.AddPalette( info.Name, new Palette( FileSystem.Open( world.TileSet.Palette ), info.ShadowIndex ) );
|
||||
wr.AddPalette(info.Name, new Palette(FileSystem.Open(world.TileSet.Palette), info.ShadowIndex), info.AllowModifiers);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,6 +20,7 @@ namespace OpenRA.Mods.RA
|
||||
public readonly string Tileset = null;
|
||||
public readonly string Filename = null;
|
||||
public readonly int[] ShadowIndex = { };
|
||||
public readonly bool AllowModifiers = true;
|
||||
|
||||
public object Create(ActorInitializer init) { return new PaletteFromFile(init.world, this); }
|
||||
}
|
||||
@@ -37,7 +38,7 @@ namespace OpenRA.Mods.RA
|
||||
public void InitPalette(WorldRenderer wr)
|
||||
{
|
||||
if (info.Tileset == null || info.Tileset.ToLowerInvariant() == world.Map.Tileset.ToLowerInvariant())
|
||||
wr.AddPalette( info.Name, new Palette( FileSystem.Open( info.Filename ), info.ShadowIndex ) );
|
||||
wr.AddPalette(info.Name, new Palette(FileSystem.Open(info.Filename), info.ShadowIndex), info.AllowModifiers);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,6 +23,7 @@ namespace OpenRA.Mods.RA
|
||||
public readonly int G = 0;
|
||||
public readonly int B = 0;
|
||||
public readonly int A = 255;
|
||||
public readonly bool AllowModifiers = true;
|
||||
|
||||
public object Create(ActorInitializer init) { return new PaletteFromRGBA(init.world, this); }
|
||||
}
|
||||
@@ -39,26 +40,12 @@ namespace OpenRA.Mods.RA
|
||||
|
||||
public void InitPalette(WorldRenderer wr)
|
||||
{
|
||||
if (info.Tileset == null || info.Tileset.ToLowerInvariant() == world.Map.Tileset.ToLowerInvariant())
|
||||
{
|
||||
// TODO: This shouldn't rely on a base palette
|
||||
var pal = wr.GetPalette("terrain");
|
||||
wr.AddPalette(info.Name, new Palette(pal, new SingleColorRemap(Color.FromArgb(info.A, info.R, info.G, info.B))));
|
||||
}
|
||||
}
|
||||
}
|
||||
// Enable palette only for a specific tileset
|
||||
if (info.Tileset != null && info.Tileset.ToLowerInvariant() != world.Map.Tileset.ToLowerInvariant())
|
||||
return;
|
||||
|
||||
class SingleColorRemap : IPaletteRemap
|
||||
{
|
||||
Color c;
|
||||
public SingleColorRemap(Color c)
|
||||
{
|
||||
this.c = c;
|
||||
}
|
||||
|
||||
public Color GetRemappedColor(Color original, int index)
|
||||
{
|
||||
return original.A > 0 ? c : original;
|
||||
var c = (uint)((info.A << 24) | (info.R << 16) | (info.G << 8) | info.B);
|
||||
wr.AddPalette(info.Name, new Palette(Exts.MakeArray(256, i => (i == 0) ? 0 : c)), info.AllowModifiers);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -55,11 +55,9 @@ namespace OpenRA.Mods.RA
|
||||
|
||||
var aircraft = self.Trait<IMove>();
|
||||
self.World.AddFrameEndTask(w => w.Add(
|
||||
new Parachute(
|
||||
self.Owner,
|
||||
new Parachute(a,
|
||||
Util.CenterOfCell(self.CenterLocation.ToCPos()),
|
||||
aircraft.Altitude, a
|
||||
)
|
||||
aircraft.Altitude)
|
||||
));
|
||||
|
||||
Sound.Play(info.ChuteSound, self.CenterLocation);
|
||||
|
||||
@@ -17,6 +17,7 @@ namespace OpenRA.Mods.RA
|
||||
{
|
||||
public readonly string Name = null;
|
||||
public readonly int[] ShadowIndex = { };
|
||||
public readonly bool AllowModifiers = true;
|
||||
|
||||
public object Create(ActorInitializer init) { return new PlayerPaletteFromCurrentTileset(init.world, this); }
|
||||
}
|
||||
@@ -35,7 +36,7 @@ namespace OpenRA.Mods.RA
|
||||
public void InitPalette (OpenRA.Graphics.WorldRenderer wr)
|
||||
{
|
||||
string Filename = world.TileSet.PlayerPalette == null ? world.TileSet.Palette : world.TileSet.PlayerPalette;
|
||||
wr.AddPalette(info.Name, new Palette(FileSystem.Open(Filename), info.ShadowIndex));
|
||||
wr.AddPalette(info.Name, new Palette(FileSystem.Open(Filename), info.ShadowIndex), info.AllowModifiers);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,11 +14,12 @@ using OpenRA.Traits;
|
||||
|
||||
namespace OpenRA.Mods.RA
|
||||
{
|
||||
class RallyPointInfo : ITraitInfo, Requires<RenderSimpleInfo>
|
||||
public class RallyPointInfo : ITraitInfo
|
||||
{
|
||||
public readonly int[] RallyPoint = { 1, 3 };
|
||||
public readonly string IndicatorPalettePrefix = "player";
|
||||
|
||||
public object Create(ActorInitializer init) { return new RallyPoint(init.self); }
|
||||
public object Create(ActorInitializer init) { return new RallyPoint(init.self, this); }
|
||||
}
|
||||
|
||||
public class RallyPoint : IIssueOrder, IResolveOrder, ISync
|
||||
@@ -26,11 +27,10 @@ namespace OpenRA.Mods.RA
|
||||
[Sync] public CPos rallyPoint;
|
||||
public int nearEnough = 1;
|
||||
|
||||
public RallyPoint(Actor self)
|
||||
public RallyPoint(Actor self, RallyPointInfo info)
|
||||
{
|
||||
var info = self.Info.Traits.Get<RallyPointInfo>();
|
||||
rallyPoint = self.Location + new CVec(info.RallyPoint[0], info.RallyPoint[1]);
|
||||
self.World.AddFrameEndTask(w => w.Add(new Effects.RallyPoint(self)));
|
||||
self.World.AddFrameEndTask(w => w.Add(new Effects.RallyPoint(self, info.IndicatorPalettePrefix)));
|
||||
}
|
||||
|
||||
public IEnumerable<IOrderTargeter> Orders
|
||||
|
||||
@@ -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<Renderable> RenderPreview(ActorInfo building, Player owner)
|
||||
public override IEnumerable<Renderable> RenderPreview(ActorInfo building, PaletteReference pr)
|
||||
{
|
||||
return base.RenderPreview(building, owner)
|
||||
return base.RenderPreview(building, pr)
|
||||
.Select(a => a.WithPos(a.Pos + building.Traits.Get<RenderBuildingInfo>().Origin));
|
||||
}
|
||||
}
|
||||
@@ -54,7 +54,7 @@ namespace OpenRA.Mods.RA.Render
|
||||
self.QueueActivity(new CallFunc(() => Complete(self)));
|
||||
}
|
||||
|
||||
public IEnumerable<Renderable> ModifyRender(Actor self, IEnumerable<Renderable> r)
|
||||
public IEnumerable<Renderable> ModifyRender(Actor self, WorldRenderer wr, IEnumerable<Renderable> r)
|
||||
{
|
||||
var disabled = self.IsDisabled();
|
||||
foreach (var a in r)
|
||||
@@ -62,7 +62,7 @@ namespace OpenRA.Mods.RA.Render
|
||||
var ret = a.WithPos(a.Pos - Info.Origin);
|
||||
yield return ret;
|
||||
if (disabled)
|
||||
yield return ret.WithPalette("disabled").WithZOffset(1);
|
||||
yield return ret.WithPalette(wr.Palette("disabled")).WithZOffset(1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -20,21 +20,22 @@ namespace OpenRA.Mods.RA.Render
|
||||
public override object Create(ActorInitializer init) { return new RenderBuildingWarFactory( init, this ); }
|
||||
|
||||
/* get around unverifiability */
|
||||
IEnumerable<Renderable> BaseBuildingPreview(ActorInfo building, Player owner)
|
||||
IEnumerable<Renderable> BaseBuildingPreview(ActorInfo building, PaletteReference pr)
|
||||
{
|
||||
return base.RenderPreview(building, owner);
|
||||
return base.RenderPreview(building, pr);
|
||||
}
|
||||
|
||||
public override IEnumerable<Renderable> RenderPreview(ActorInfo building, Player owner)
|
||||
public override IEnumerable<Renderable> RenderPreview(ActorInfo building, PaletteReference pr)
|
||||
{
|
||||
var p = BaseBuildingPreview(building, owner);
|
||||
var p = BaseBuildingPreview(building, pr);
|
||||
foreach (var r in p)
|
||||
yield return r;
|
||||
|
||||
var anim = new Animation(RenderSimple.GetImage(building), () => 0);
|
||||
anim.PlayRepeating("idle-top");
|
||||
var rb = building.Traits.Get<RenderBuildingInfo>();
|
||||
yield return new Renderable(anim.Image, rb.Origin + 0.5f*anim.Image.size*(1 - Scale), p.First().Palette, 0, Scale);
|
||||
yield return new Renderable(anim.Image, rb.Origin + 0.5f*anim.Image.size*(1 - Scale),
|
||||
pr, 0, Scale);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
#endregion
|
||||
|
||||
using System.Collections.Generic;
|
||||
using OpenRA.Graphics;
|
||||
using OpenRA.Traits;
|
||||
|
||||
namespace OpenRA.Mods.RA.Render
|
||||
@@ -23,6 +24,6 @@ namespace OpenRA.Mods.RA.Render
|
||||
public RenderEditorOnly(Actor self) : base(self, () => 0) { }
|
||||
|
||||
static readonly Renderable[] Nothing = { };
|
||||
public override IEnumerable<Renderable> Render(Actor self) { return Nothing; }
|
||||
public override IEnumerable<Renderable> Render(Actor self, WorldRenderer wr) { return Nothing; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -124,10 +124,16 @@ namespace OpenRA.Mods.RA.Render
|
||||
return;
|
||||
|
||||
Sound.PlayVoice("Die", self, self.Owner.Country.Race);
|
||||
SpawnCorpse(self, "die{0}".F(e.Warhead.InfDeath));
|
||||
}
|
||||
|
||||
public void SpawnCorpse(Actor self, string sequence)
|
||||
{
|
||||
self.World.AddFrameEndTask(w =>
|
||||
{
|
||||
if (!self.Destroyed)
|
||||
w.Add(new Corpse(self, "die{0}".F(e.Warhead.InfDeath)));
|
||||
w.Add(new Corpse(w, self.CenterLocation.ToFloat2(), GetImage(self),
|
||||
sequence, Info.PlayerPalette+self.Owner.InternalName));
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using OpenRA.Graphics;
|
||||
using OpenRA.Traits;
|
||||
using OpenRA.Mods.RA.Orders;
|
||||
|
||||
@@ -20,20 +21,23 @@ namespace OpenRA.Mods.RA.Render
|
||||
public override object Create(ActorInitializer init) { return new RenderSpy(init.self, this); }
|
||||
}
|
||||
|
||||
class RenderSpy : RenderInfantryProne, IRenderModifier
|
||||
class RenderSpy : RenderInfantryProne
|
||||
{
|
||||
RenderSpyInfo info;
|
||||
string disguisedAsSprite;
|
||||
Spy spy;
|
||||
|
||||
public RenderSpy(Actor self, RenderSpyInfo info) : base(self, info)
|
||||
{
|
||||
this.info = info;
|
||||
spy = self.Trait<Spy>();
|
||||
disguisedAsSprite = spy.disguisedAsSprite;
|
||||
}
|
||||
|
||||
public IEnumerable<Renderable> ModifyRender(Actor self, IEnumerable<Renderable> r)
|
||||
protected override string PaletteName(Actor self)
|
||||
{
|
||||
return spy.disguisedAsPlayer != null ? r.Select(a => a.WithPalette(Palette(spy.disguisedAsPlayer))) : r;
|
||||
var player = spy.disguisedAsPlayer != null ? spy.disguisedAsPlayer : self.Owner;
|
||||
return info.Palette ?? info.PlayerPalette + player.InternalName;
|
||||
}
|
||||
|
||||
public override void Tick(Actor self)
|
||||
@@ -45,6 +49,7 @@ namespace OpenRA.Mods.RA.Render
|
||||
anim.ChangeImage(disguisedAsSprite, "stand");
|
||||
else
|
||||
anim.ChangeImage(GetImage(self), "stand");
|
||||
UpdatePalette();
|
||||
}
|
||||
base.Tick(self);
|
||||
}
|
||||
|
||||
@@ -57,11 +57,11 @@ namespace OpenRA.Mods.RA.Render
|
||||
mf.Animation.PlayThen("muzzle", () => isShowing = false);
|
||||
}
|
||||
|
||||
public IEnumerable<Renderable> Render(Actor self)
|
||||
public IEnumerable<Renderable> Render(Actor self, WorldRenderer wr)
|
||||
{
|
||||
foreach (var a in muzzleFlashes.Values)
|
||||
if (a.DisableFunc == null || !a.DisableFunc())
|
||||
yield return a.Image(self, "effect");
|
||||
yield return a.Image(self, wr.Palette("effect"));
|
||||
}
|
||||
|
||||
public void Tick(Actor self)
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using OpenRA.Graphics;
|
||||
using OpenRA.Traits;
|
||||
using OpenRA.Mods.RA.Air;
|
||||
using OpenRA.Mods.RA.Move;
|
||||
@@ -21,7 +22,7 @@ namespace OpenRA.Mods.RA.Render
|
||||
|
||||
class WithShadow : IRenderModifier
|
||||
{
|
||||
public IEnumerable<Renderable> ModifyRender(Actor self, IEnumerable<Renderable> r)
|
||||
public IEnumerable<Renderable> ModifyRender(Actor self, WorldRenderer wr, IEnumerable<Renderable> r)
|
||||
{
|
||||
var move = self.Trait<IMove>();
|
||||
|
||||
@@ -29,7 +30,7 @@ namespace OpenRA.Mods.RA.Render
|
||||
var visualOffset = ((move is Helicopter || move is Mobile) && move.Altitude > 0)
|
||||
? Math.Abs((self.ActorID + Game.LocalTick) / 5 % 4 - 1) - 1 : 0;
|
||||
|
||||
var shadowSprites = r.Select(a => a.WithPalette("shadow"));
|
||||
var shadowSprites = r.Select(a => a.WithPalette(wr.Palette("shadow")));
|
||||
var flyingSprites = (move.Altitude <= 0) ? r
|
||||
: r.Select(a => a.WithPos(a.Pos - new float2(0, move.Altitude + visualOffset)).WithZOffset(move.Altitude + a.ZOffset));
|
||||
|
||||
|
||||
@@ -18,8 +18,6 @@ namespace OpenRA.Mods.RA
|
||||
class ShroudPaletteInfo : ITraitInfo
|
||||
{
|
||||
public readonly string Name = "shroud";
|
||||
public readonly bool IsFog = false;
|
||||
|
||||
public object Create(ActorInitializer init) { return new ShroudPalette(this); }
|
||||
}
|
||||
|
||||
@@ -31,34 +29,16 @@ namespace OpenRA.Mods.RA
|
||||
|
||||
public void InitPalette(WorldRenderer wr)
|
||||
{
|
||||
var pal = wr.GetPalette( "terrain" );
|
||||
wr.AddPalette( info.Name, new Palette( pal, new ShroudPaletteRemap( info.IsFog ) ) );
|
||||
}
|
||||
}
|
||||
|
||||
class ShroudPaletteRemap : IPaletteRemap
|
||||
{
|
||||
bool isFog;
|
||||
|
||||
public ShroudPaletteRemap(bool isFog) { this.isFog = isFog; }
|
||||
public Color GetRemappedColor(Color original, int index)
|
||||
{
|
||||
if (isFog)
|
||||
return new[] {
|
||||
Color.Transparent, Color.Green,
|
||||
Color.Blue, Color.Yellow,
|
||||
Color.FromArgb(128,0,0,0),
|
||||
Color.FromArgb(128,0,0,0),
|
||||
Color.FromArgb(128,0,0,0),
|
||||
Color.FromArgb(64,0,0,0)}[index % 8];
|
||||
else
|
||||
return new[] {
|
||||
var c = new[] {
|
||||
Color.Transparent, Color.Green,
|
||||
Color.Blue, Color.Yellow,
|
||||
Color.Black,
|
||||
Color.FromArgb(128,0,0,0),
|
||||
Color.Transparent,
|
||||
Color.Transparent}[index % 8];
|
||||
Color.Transparent
|
||||
};
|
||||
|
||||
wr.AddPalette(info.Name, new Palette(Exts.MakeArray(256, i => (uint)c[i % 8].ToArgb())), false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -243,9 +243,9 @@ namespace OpenRA.Mods.RA
|
||||
{
|
||||
if (manager.self.Owner.Shroud.IsTargetable(unit)) {
|
||||
var targetCell = unit.Location + (xy - sourceLocation);
|
||||
foreach (var r in unit.Render())
|
||||
foreach (var r in unit.Render(wr))
|
||||
r.Sprite.DrawAt(r.Pos - Traits.Util.CenterOfCell(unit.Location).ToFloat2() + Traits.Util.CenterOfCell(targetCell).ToFloat2(),
|
||||
wr.GetPaletteIndex(r.Palette),
|
||||
r.Palette.Index,
|
||||
r.Scale*r.Sprite.size);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@ namespace OpenRA.Mods.RA
|
||||
{
|
||||
class WaterPaletteRotationInfo : ITraitInfo
|
||||
{
|
||||
public readonly string[] ExcludePalettes = { "cursor", "chrome", "colorpicker", "player" };
|
||||
public readonly string[] ExcludePalettes = {};
|
||||
|
||||
public object Create(ActorInitializer init) { return new WaterPaletteRotation(init.world, this); }
|
||||
}
|
||||
|
||||
54
OpenRA.Mods.RA/Widgets/ColorPreviewManagerWidget.cs
Executable file
54
OpenRA.Mods.RA/Widgets/ColorPreviewManagerWidget.cs
Executable file
@@ -0,0 +1,54 @@
|
||||
#region Copyright & License Information
|
||||
/*
|
||||
* Copyright 2007-2011 The OpenRA Developers (see AUTHORS)
|
||||
* This file is part of OpenRA, which is free software. It is made
|
||||
* available to you under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation. For more information,
|
||||
* see COPYING.
|
||||
*/
|
||||
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
using System.Linq;
|
||||
using OpenRA.FileFormats;
|
||||
using OpenRA.Graphics;
|
||||
using OpenRA.Traits;
|
||||
using OpenRA.Widgets;
|
||||
|
||||
namespace OpenRA.Mods.RA.Widgets
|
||||
{
|
||||
public class ColorPreviewManagerWidget : Widget
|
||||
{
|
||||
public readonly string Palette = "colorpicker";
|
||||
public readonly int[] RemapIndices = {};
|
||||
public ColorRamp Ramp;
|
||||
|
||||
ColorRamp cachedRamp;
|
||||
WorldRenderer worldRenderer;
|
||||
Palette preview;
|
||||
|
||||
[ObjectCreator.UseCtor]
|
||||
public ColorPreviewManagerWidget(WorldRenderer worldRenderer)
|
||||
: base()
|
||||
{
|
||||
this.worldRenderer = worldRenderer;
|
||||
}
|
||||
|
||||
public override void Initialize(WidgetArgs args)
|
||||
{
|
||||
base.Initialize(args);
|
||||
preview = worldRenderer.Palette(Palette).Palette;
|
||||
}
|
||||
|
||||
public override void Tick()
|
||||
{
|
||||
if (cachedRamp == Ramp)
|
||||
return;
|
||||
|
||||
preview.ApplyRemap(new PlayerColorRemap(RemapIndices, Ramp));
|
||||
cachedRamp = Ramp;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,7 +30,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic
|
||||
string MapUid;
|
||||
Map Map;
|
||||
|
||||
ColorPickerPaletteModifier PlayerPalettePreview;
|
||||
ColorPreviewManagerWidget colorPreview;
|
||||
|
||||
readonly Action OnGameStart;
|
||||
readonly Action onExit;
|
||||
@@ -96,8 +96,6 @@ namespace OpenRA.Mods.RA.Widgets.Logic
|
||||
Game.ConnectionStateChanged += ConnectionStateChanged;
|
||||
|
||||
UpdateCurrentMap();
|
||||
PlayerPalettePreview = world.WorldActor.Trait<ColorPickerPaletteModifier>();
|
||||
PlayerPalettePreview.Ramp = Game.Settings.Player.ColorRamp;
|
||||
Players = lobby.Get<ScrollPanelWidget>("PLAYERS");
|
||||
EditablePlayerTemplate = Players.Get("TEMPLATE_EDITABLE_PLAYER");
|
||||
NonEditablePlayerTemplate = Players.Get("TEMPLATE_NONEDITABLE_PLAYER");
|
||||
@@ -105,6 +103,8 @@ namespace OpenRA.Mods.RA.Widgets.Logic
|
||||
EditableSpectatorTemplate = Players.Get("TEMPLATE_EDITABLE_SPECTATOR");
|
||||
NonEditableSpectatorTemplate = Players.Get("TEMPLATE_NONEDITABLE_SPECTATOR");
|
||||
NewSpectatorTemplate = Players.Get("TEMPLATE_NEW_SPECTATOR");
|
||||
colorPreview = lobby.Get<ColorPreviewManagerWidget>("COLOR_MANAGER");
|
||||
colorPreview.Ramp = Game.Settings.Player.ColorRamp;
|
||||
|
||||
var mapPreview = lobby.Get<MapPreviewWidget>("MAP_PREVIEW");
|
||||
mapPreview.IsVisible = () => Map != null;
|
||||
@@ -364,7 +364,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic
|
||||
|
||||
var color = template.Get<DropDownButtonWidget>("COLOR");
|
||||
color.IsDisabled = () => slot.LockColor || ready;
|
||||
color.OnMouseDown = _ => LobbyUtils.ShowColorDropDown(color, client, orderManager, PlayerPalettePreview);
|
||||
color.OnMouseDown = _ => LobbyUtils.ShowColorDropDown(color, client, orderManager, colorPreview);
|
||||
|
||||
var colorBlock = color.Get<ColorBlockWidget>("COLORBLOCK");
|
||||
colorBlock.GetColor = () => client.ColorRamp.GetColor(0);
|
||||
@@ -444,7 +444,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic
|
||||
|
||||
var color = template.Get<DropDownButtonWidget>("COLOR");
|
||||
color.IsDisabled = () => ready;
|
||||
color.OnMouseDown = _ => LobbyUtils.ShowColorDropDown(color, c, orderManager, PlayerPalettePreview);
|
||||
color.OnMouseDown = _ => LobbyUtils.ShowColorDropDown(color, c, orderManager, colorPreview);
|
||||
|
||||
var colorBlock = color.Get<ColorBlockWidget>("COLORBLOCK");
|
||||
colorBlock.GetColor = () => c.ColorRamp.GetColor(0);
|
||||
|
||||
@@ -121,7 +121,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic
|
||||
}
|
||||
|
||||
public static void ShowColorDropDown(DropDownButtonWidget color, Session.Client client,
|
||||
OrderManager orderManager, ColorPickerPaletteModifier preview)
|
||||
OrderManager orderManager, ColorPreviewManagerWidget preview)
|
||||
{
|
||||
Action<ColorRamp> onSelect = c =>
|
||||
{
|
||||
|
||||
@@ -1,55 +0,0 @@
|
||||
// OpenRA gui lines shader
|
||||
// Author: C. Forbes
|
||||
//--------------------------------------------------------
|
||||
|
||||
float2 r1, r2; // matrix elements
|
||||
|
||||
struct VertexIn {
|
||||
float4 Position: POSITION;
|
||||
float4 Color: TEXCOORD0;
|
||||
};
|
||||
|
||||
struct VertexOut {
|
||||
float4 Position: POSITION;
|
||||
float4 Color: COLOR0;
|
||||
};
|
||||
|
||||
VertexOut Simple_vp(VertexIn v) {
|
||||
VertexOut o;
|
||||
float2 p = v.Position.xy * r1 + r2;
|
||||
o.Position = float4(p.x,p.y,0,1);
|
||||
o.Color = v.Color;
|
||||
return o;
|
||||
}
|
||||
|
||||
float4 Simple_fp(VertexOut f) : COLOR0 {
|
||||
return f.Color;
|
||||
}
|
||||
|
||||
technique high_quality {
|
||||
pass p0 {
|
||||
BlendEnable = true;
|
||||
DepthTestEnable = false;
|
||||
//CullMode = None;
|
||||
//FillMode = Wireframe;
|
||||
VertexProgram = compile latest Simple_vp();
|
||||
FragmentProgram = compile latest Simple_fp();
|
||||
|
||||
BlendEquation = FuncAdd;
|
||||
BlendFunc = int2( SrcAlpha, OneMinusSrcAlpha );
|
||||
}
|
||||
}
|
||||
|
||||
technique high_quality_cg21 {
|
||||
pass p0 {
|
||||
BlendEnable = true;
|
||||
DepthTestEnable = false;
|
||||
//CullMode = None;
|
||||
//FillMode = Wireframe;
|
||||
VertexProgram = compile arbvp1 Simple_vp();
|
||||
FragmentProgram = compile arbfp1 Simple_fp();
|
||||
|
||||
BlendEquation = FuncAdd;
|
||||
BlendFunc = int2( SrcAlpha, OneMinusSrcAlpha );
|
||||
}
|
||||
}
|
||||
@@ -1,80 +0,0 @@
|
||||
// OpenRA test shader
|
||||
// Author: C. Forbes
|
||||
//--------------------------------------------------------
|
||||
|
||||
float2 Scroll;
|
||||
float2 r1, r2; // matrix elements
|
||||
|
||||
sampler2D DiffuseTexture = sampler_state {
|
||||
MinFilter = Nearest;
|
||||
MagFilter = Nearest;
|
||||
WrapS = Repeat;
|
||||
WrapT = Repeat;
|
||||
};
|
||||
|
||||
sampler2D Palette = sampler_state {
|
||||
MinFilter = Nearest;
|
||||
MagFilter = Nearest;
|
||||
WrapS = Repeat;
|
||||
WrapT = Repeat;
|
||||
};
|
||||
|
||||
struct VertexIn {
|
||||
float4 Position: POSITION;
|
||||
float4 Tex0: TEXCOORD0;
|
||||
};
|
||||
|
||||
struct VertexOut {
|
||||
float4 Position: POSITION;
|
||||
float3 Tex0: TEXCOORD0;
|
||||
float4 ChannelMask: TEXCOORD1;
|
||||
};
|
||||
|
||||
float4 DecodeChannelMask( float x )
|
||||
{
|
||||
if (x > 0)
|
||||
return (x > 0.5f) ? float4(1,0,0,0) : float4(0,1,0,0);
|
||||
else
|
||||
return (x <-0.5f) ? float4(0,0,0,1) : float4(0,0,1,0);
|
||||
}
|
||||
|
||||
VertexOut Simple_vp(VertexIn v) {
|
||||
VertexOut o;
|
||||
float2 p = v.Position.xy * r1 + r2;
|
||||
o.Position = float4(p.x,p.y,0,1);
|
||||
o.Tex0 = float3(v.Tex0.x, v.Tex0.y, v.Tex0.z);
|
||||
o.ChannelMask = DecodeChannelMask( v.Tex0.w );
|
||||
return o;
|
||||
}
|
||||
|
||||
float4 Palette_fp(VertexOut f) : COLOR0 {
|
||||
float4 x = tex2D(DiffuseTexture, f.Tex0.xy);
|
||||
float2 p = float2( dot(x, f.ChannelMask), f.Tex0.z );
|
||||
return tex2D(Palette, p);
|
||||
}
|
||||
|
||||
technique low_quality {
|
||||
pass p0 {
|
||||
BlendEnable = true;
|
||||
DepthTestEnable = false;
|
||||
CullFaceEnable = false;
|
||||
VertexProgram = compile latest Simple_vp();
|
||||
FragmentProgram = compile latest Palette_fp();
|
||||
|
||||
BlendEquation = FuncAdd;
|
||||
BlendFunc = int2( SrcAlpha, OneMinusSrcAlpha );
|
||||
}
|
||||
}
|
||||
|
||||
technique low_quality_cg21 {
|
||||
pass p0 {
|
||||
BlendEnable = true;
|
||||
DepthTestEnable = false;
|
||||
CullFaceEnable = false;
|
||||
VertexProgram = compile arbvp1 Simple_vp();
|
||||
FragmentProgram = compile arbfp1 Palette_fp();
|
||||
|
||||
BlendEquation = FuncAdd;
|
||||
BlendFunc = int2( SrcAlpha, OneMinusSrcAlpha );
|
||||
}
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
uniform vec2 r1, r2; // matrix elements
|
||||
void main()
|
||||
{
|
||||
vec2 p = gl_Vertex.xy*r1 + r2;
|
||||
gl_Position = vec4(p.x,p.y,0,1);
|
||||
gl_FrontColor = gl_MultiTexCoord0;
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
uniform vec2 r1,r2; // matrix elements
|
||||
|
||||
vec4 DecodeChannelMask( float x )
|
||||
{
|
||||
if (x > 0.0)
|
||||
return (x > 0.5) ? vec4(1,0,0,0) : vec4(0,1,0,0);
|
||||
else
|
||||
return (x < -0.5) ? vec4(0,0,0,1) : vec4(0,0,1,0);
|
||||
}
|
||||
|
||||
void main()
|
||||
{
|
||||
vec2 p = gl_Vertex.xy*r1 + r2;
|
||||
gl_Position = vec4(p.x,p.y,0,1);
|
||||
gl_TexCoord[0] = gl_MultiTexCoord0;
|
||||
gl_TexCoord[1] = DecodeChannelMask(gl_MultiTexCoord0.w);
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
void main()
|
||||
{
|
||||
gl_FragColor = gl_Color;
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
uniform sampler2D DiffuseTexture, Palette;
|
||||
|
||||
void main()
|
||||
{
|
||||
vec4 x = texture2D(DiffuseTexture, gl_TexCoord[0].st);
|
||||
vec2 p = vec2( dot(x, gl_TexCoord[1]), gl_TexCoord[0].p );
|
||||
gl_FragColor = texture2D(Palette,p);
|
||||
}
|
||||
@@ -5,6 +5,8 @@ Container@SERVER_LOBBY:
|
||||
Width:740
|
||||
Height:535
|
||||
Children:
|
||||
ColorPreviewManager@COLOR_MANAGER:
|
||||
RemapIndices: 176, 178, 180, 182, 184, 186, 189, 191, 177, 179, 181, 183, 185, 187, 188, 190
|
||||
Label@TITLE:
|
||||
Width:740
|
||||
Y:0-25
|
||||
|
||||
@@ -5,6 +5,8 @@ Container@SETTINGS_PANEL:
|
||||
Width:740
|
||||
Height:535
|
||||
Children:
|
||||
ColorPreviewManager@COLOR_MANAGER:
|
||||
RemapIndices: 176, 178, 180, 182, 184, 186, 189, 191, 177, 179, 181, 183, 185, 187, 188, 190
|
||||
Label@TITLE:
|
||||
Width:740
|
||||
Y:0-25
|
||||
|
||||
@@ -80,6 +80,11 @@ World:
|
||||
Name: effect
|
||||
Filename: temperat.pal
|
||||
ShadowIndex: 4
|
||||
PaletteFromFile@colorpicker:
|
||||
Name: colorpicker
|
||||
Filename: temperat.pal
|
||||
ShadowIndex: 4
|
||||
AllowModifiers: false
|
||||
PaletteFromRGBA@shadow:
|
||||
Name: shadow
|
||||
R: 0
|
||||
@@ -104,11 +109,8 @@ World:
|
||||
G: 0
|
||||
B: 0
|
||||
A: 180
|
||||
ColorPickerPaletteModifier:
|
||||
ShroudPalette@shroud:
|
||||
ShroudPalette@fog:
|
||||
IsFog: yes
|
||||
Name: fog
|
||||
ShroudPalette:
|
||||
FogPalette:
|
||||
Country@gdi:
|
||||
Name: GDI
|
||||
Race: gdi
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user