/// <summary>
/// Combines all tiles to form a graphic plane.
/// </summary>
/// <returns>
/// Newly created graphic plane.
/// </returns>
public GraphicPlane Combine(CombineArgs args)
{
if (this.Type == MapType.Map2D)
{
GraphicPlane plane = new GraphicPlane(this.Width * 16, this.Height * 16);
plane.Palette = ImagePalette.GetFullPalette(this.Palette);
foreach (Tile t in this.TileData)
{
Point loc = new Point(t.X * 16, t.Y * 16);
if (args.ShowUnderlays)
{
RawImage ul = MapIcons.GetTileUnderlay(this.Tileset, t);
plane.Objects.Add(new GraphicObject(ul, loc));
}
if (!args.ShowHelpers && IsHelperTile(tilesid, t.Overlay))
{
continue;
}
if (args.ShowOverlays)
{
RawImage ol = MapIcons.GetTileOverlay(this.Tileset, t);
plane.Objects.Add(new GraphicObject(ol, loc));
}
}
if (args.ShowNPCs2D)
{
foreach (NPC npc in UsedNPCs)
{
ImageBase img = NPCGraphics.GetNPCBig(npc.ObjectID)[6];
Point loc = new Point(npc.X * 16, npc.Y * 16 - img.GetHeight() + 16);
plane.Objects.Add(new GraphicObject(img, loc));
}
}
return(plane);
}
else if (this.Type == MapType.Map3D)
{
MinimapType mt = MinimapType.Classic;
LabData ld = LabData.GetLabData(this.Labdata);
GraphicPlane plane = new GraphicPlane(this.Width * 8, this.Height * 8);
ImagePalette src = ImagePalette.GetFullPalette(this.Palette);
ImagePalette dest = plane.Palette = new MinimapPalette(src);
if (ld != null)
{
if (args.ShowFloors)
{
//Floors
IndexedCache <RawImage> floorcache = new IndexedCache <RawImage>(i => Minimize(LabGraphics.GetFloor(this.Labdata, i), src, dest));
foreach (Block b in this.BlockData)
{
if (b.Floor != 0)
{
Point loc = new Point(b.X * 8, b.Y * 8);
plane.Objects.Add(new GraphicObject(floorcache[b.Floor], loc));
}
}
}
if (args.ShowWalls)
{
//Walls
foreach (Block b in this.BlockData)
{
if (b.IsWall && !ld.GetMinimapForm(b).VisibleOnMinimap)
{
WallForm form = WallForm.Close;
if (b.Y > 0 && BlockData[b.X, b.Y - 1].IsWall)
{
form |= WallForm.OpenTop;
}
if (b.X < Width - 1 && BlockData[b.X + 1, b.Y].IsWall)
{
form |= WallForm.OpenRight;
}
if (b.Y < Height - 1 && BlockData[b.X, b.Y + 1].IsWall)
{
form |= WallForm.OpenBottom;
}
if (b.X > 0 && BlockData[b.X - 1, b.Y].IsWall)
{
form |= WallForm.OpenLeft;
}
Point loc = new Point(b.X * 8, b.Y * 8);
plane.Objects.Add(new GraphicObject(AutoGFX.GetWall(form, mt), loc));
}
}
}
}
foreach (Block b in this.BlockData)
{
Point loc = new Point(b.X * 8, (b.Y - 1) * 8);
if (args.ShowNPCs3D)
{
//NPCs
foreach (NPC npc in UsedNPCs)
{
if (npc.Positions[0].X == b.X && npc.Positions[0].Y == b.Y)
{
byte type = 0;
if (npc.Interaction == 2)
{
type = 8;
}
else
{
type = 17;
}
if (type != 0)
{
plane.Objects.Add(new GraphicObject(AutoGFX.GetIcon(type, mt), loc));
}
}
}
}
if (args.ShowObjects)
{
//Objects
if (ld != null)
{
if (!b.IsEmpty)
{
byte type = ld.GetMinimapForm(b).MinimapType;
plane.Objects.Add(new GraphicObject(AutoGFX.GetIcon(type, mt), loc));
}
}
}
if (args.ShowGotoPoints)
{
//Goto-points
if (b.GotoPoint != null)
{
plane.Objects.Add(new GraphicObject(AutoGFX.GetIcon(18, mt), loc));
}
}
}
return(plane);
}
return(null);
}