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);
}