private void ApplyRemappables()
{
int before = _palettesToBeRecalculated.Count;
foreach (OwnableObject obj in _structureObjects.Cast<OwnableObject>().Union(_unitObjects).Union(_aircraftObjects).Union(_infantryObjects)) {
var g = obj as GameObject;
if (g != null & g.Drawable != null && g.Drawable.IsRemapable) {
if (g.Palette.IsShared) // don't wanna touch somebody elses palette..
g.Palette = g.Palette.Clone();
var color = _countryColors.ContainsKey(obj.Owner) ? _countryColors[obj.Owner] : _countryColors.First().Value;
g.Palette.Remap(color);
_palettesToBeRecalculated.Add(g.Palette);
}
}
// TS needs tiberium remapped
if (Engine <= EngineType.Firestorm) {
var tiberiums = _rules.GetSection("Tiberiums").OrderedEntries.Select(tib => tib.Value.ToString());
var remaps = tiberiums.Select(tib => _rules.GetOrCreateSection(tib).ReadString("Color"));
var tibRemaps = tiberiums.Zip(remaps, (k, v) => new { k, v }).ToDictionary(x => x.k, x => x.v);
foreach (var ovl in _overlayObjects) {
if (ovl == null) continue;
var tibType = SpecialOverlays.GetOverlayTibType(ovl, Engine);
if (tibType != OverlayTibType.NotSpecial) {
ovl.Palette = ovl.Palette.Clone();
string tibName = SpecialOverlays.GetTibName(ovl, Engine);
if (tibRemaps.ContainsKey(tibName) && _namedColors.ContainsKey(tibRemaps[tibName]))
ovl.Palette.Remap(_namedColors[tibRemaps[tibName]]);
_palettesToBeRecalculated.Add(ovl.Palette);
}
}
}
Logger.Debug("Determined palettes to be recalculated due to remappables ({0})",
_palettesToBeRecalculated.Count - before);
}