private void LoadPalettes()
{
int before = _palettesToBeRecalculated.Count;
// get the default palettes
var pc = _theater.GetPalettes();
foreach (var p in pc) _palettesToBeRecalculated.Add(p);
foreach (var tile in _tiles) {
if (tile == null) continue;
// TODO: move this to a more sensible place
/*var tse = _theater.GetTileCollection().GetTileSetEntry(tile);
if (tse != null && tse.AnimationSubtile == tile.SubTile) {
var anim = new AnimationObject(tse.AnimationDrawable.Name, tse.AnimationDrawable);
tile.AddObject(anim);
_animationObjects.Add(anim);
}*/
foreach (var obj in tile.AllObjects.Union(new[] { tile }).ToList()) {
if (obj == null) continue;
Palette p;
LightingType lt;
PaletteType pt;
if (obj is MapTile) {
lt = LightingType.Full;
pt = PaletteType.Iso;
}
else {
obj.Collection = _theater.GetObjectCollection(obj);
pt = obj.Drawable.Props.PaletteType;
lt = obj.Drawable.Props.LightingType;
}
// level, ambient and full benefit from sharing
if (lt == LightingType.Full && pt == PaletteType.Iso) {
// bridges are attached to a low tile, but their height-offset should be taken into account
int z = obj.Tile.Z + (obj.Drawable != null ? obj.Drawable.TileElevation : 0);
p = _palettePerLevel[z];
}
else if (lt >= LightingType.Level) {
// when applying lighting to its palette
p = _theater.GetPalette(obj.Drawable).Clone();
int z = obj.Tile.Z + (obj.Drawable != null ? obj.Drawable.TileElevation : 0);
p.ApplyLighting(_lighting, z, lt == LightingType.Full);
}
else {
p = _theater.GetPalette(obj.Drawable).Clone();
}
_palettesToBeRecalculated.Add(p);
obj.Palette = p;
}
}
Logger.Debug("Loaded {0} different palettes", _palettesToBeRecalculated.Count - before);
}