Skip to content

Instantly share code, notes, and snippets.

@Mailaender
Created June 19, 2012 10:00
Show Gist options
  • Save Mailaender/2953338 to your computer and use it in GitHub Desktop.
Save Mailaender/2953338 to your computer and use it in GitHub Desktop.
new Dune 2000 and Tiberian Dawn remapping
#region Copyright & License Information
/*
* Copyright 2007-2012 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.Drawing;
using System.Linq;
namespace OpenRA.FileFormats
{
// TODO: ship this out of here.
public enum PaletteFormat { ra, cnc, d2k }
public class PlayerColorRemap : IPaletteRemap
{
Dictionary<int, Color> remapColors;
static readonly int[] CncRemapRamp = new[] { 0, 1, 8, 2, 9, 3, 10, 4, 11, 12, 13, 5, 14, 15, 6, 7 };
static readonly int[] D2kRemapRamp = new[] { 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
static readonly int[] NormalRemapRamp = new[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
static int GetRemapBase(PaletteFormat fmt)
{
return (fmt == PaletteFormat.cnc) ? 176 : (fmt == PaletteFormat.d2k) ? 255 : 80;
}
static int[] GetRemapRamp(PaletteFormat fmt)
{
return (fmt == PaletteFormat.cnc) ? CncRemapRamp : (fmt == PaletteFormat.d2k) ? D2kRemapRamp : NormalRemapRamp;
}
public static int GetRemapIndex(PaletteFormat fmt, int i)
{
return (fmt == PaletteFormat.d2k) ? GetRemapBase(fmt) - GetRemapRamp(fmt)[i] : GetRemapBase(fmt) + GetRemapRamp(fmt)[i];
}
public PlayerColorRemap(PaletteFormat fmt, ColorRamp c)
{
var c1 = c.GetColor(0);
var c2 = c.GetColor(1); /* temptemp: this can be expressed better */
var baseIndex = GetRemapBase(fmt);
var ramp = GetRemapRamp(fmt);
if (fmt == PaletteFormat.d2k)
remapColors = ramp.Select((x, i) => Pair.New(baseIndex - i, Exts.ColorLerp(x / 16f, c1, c2)))
.ToDictionary(u => u.First, u => u.Second);
else
remapColors = ramp.Select((x, i) => Pair.New(baseIndex + i, Exts.ColorLerp(x / 16f, c1, c2)))
.ToDictionary(u => u.First, u => u.Second);
}
public Color GetRemappedColor(Color original, int index)
{
Color c;
return remapColors.TryGetValue(index, out c)
? c : original;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment