public MultiComponentList ConvertToSDK() { int count = 0; MTileList[][] tiles = new MTileList[Width][]; for (int x = 0; x < Width; ++x) { tiles[x] = new MTileList[Height]; for (int y = 0; y < Height; ++y) { tiles[x][y] = new MTileList(); } } for (int i = 0; i < Tiles.Count; ++i) { MultiTile tile = Tiles[i]; if (tile.isVirtualFloor) { continue; } tiles[tile.X][tile.Y].Add((ushort)(tile.ID), (sbyte)tile.Z, tile.Invisible ? (TileFlag)0 : (TileFlag)1); ++count; } return(new MultiComponentList(tiles, count, Width, Height)); }
private void RecalcMinMax(MultiTile tile) { if (tile.isVirtualFloor) { return; } if (tile.GetBitmap() == null) { return; } int px = tile.Xmod - GapXMod; int py = tile.Ymod - GapYMod; if (px < xMin) { xMin = px; } if (py < yMin) { yMin = py; } px += tile.GetBitmap().Width; py += tile.GetBitmap().Height; if (px > xMax) { xMax = px; } if (py > yMax) { yMax = py; } if (tile.Z > zMax) { zMax = tile.Z; } if (tile.Z < zMin) { zMin = tile.Z; } Modified = false; xMinOrg = xMin; xMaxOrg = xMax; yMinOrg = yMin; yMaxOrg = yMax; if (Parent.ShowWalkables) { CalcWalkable(); } if (Parent.ShowDoubleSurface) { CalcDoubleSurface(); } }
/// <summary> /// Removes specific <see cref="MultiTile"/> /// </summary> public void TileRemove(MultiTile tile) { if (Width == 0 || Height == 0) { return; } AddToUndoList("Remove Tile"); if (tile != null) { Tiles.Remove(tile); Modified = true; RecalcMinMax(tile); } }
/// <summary> /// Gets <see cref="MultiTile"/> from given Pixel Location /// </summary> public MultiTile GetSelected(Point mouseLoc, int maxheight, bool drawFloor) { if (Width == 0 || Height == 0) { return(null); } MultiTile selected = null; if (mouseLoc != Point.Empty) { for (int i = Tiles.Count - 1; i >= 0; --i) // inverse for speedup { MultiTile tile = Tiles[i]; if (tile.isVirtualFloor) { continue; } if (tile.Z > maxheight) { continue; } if ((drawFloor) && (Parent.DrawFloorZ > tile.Z)) { continue; } Bitmap bmp = tile.GetBitmap(); if (bmp == null) { continue; } int px = tile.Xmod; int py = tile.Ymod; px -= xMin; py -= yMin; if (((mouseLoc.X > px) && (mouseLoc.X < (px + bmp.Width))) && ((mouseLoc.Y > py) && (mouseLoc.Y < (py + bmp.Height)))) { //Check for transparent part Color p = bmp.GetPixel(mouseLoc.X - px, mouseLoc.Y - py); if (!((p.R == 0) && (p.G == 0) && (p.B == 0))) { selected = tile; break; } } } } return(selected); }
/// <summary> /// Adds an <see cref="MultiTile"/> to specific location /// </summary> public void TileAdd(int x, int y, int z, ushort id) { if ((x > Width) || (y > Height)) { return; } AddToUndoList("Add Tile"); MultiTile tile = new MultiTile(id, x, y, z, 1); Tiles.Add(tile); CalcSolver(x, y); Modified = true; Tiles.Sort(); RecalcMinMax(tile); }
public MultiEditor() { SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint, true); InitializeComponent(); refMarkerMulti = this; MouseLoc = new Point(); MovingLoc = new Point(); m_DrawTile = new MultiTile(); Selectedpanel.Visible = false; FloatingPreviewPanel.Visible = false; FloatingPreviewPanel.Tag = -1; BTN_Select.Checked = true; pictureBoxDrawTiles.MouseWheel += new MouseEventHandler(pictureBoxDrawTiles_OnMouseWheel); pictureBoxMulti.ContextMenu = null; ForceRefresh = true; }
/// <summary> /// Alters Z level for given <see cref="MultiTile"/> /// </summary> public void TileZMod(MultiTile tile, int modz) { AddToUndoList("Modify Z"); tile.Z += modz; if (tile.Z > 127) { tile.Z = 127; } if (tile.Z < -128) { tile.Z = -128; } CalcSolver(tile.X, tile.Y); Tiles.Sort(); Modified = true; RecalcMinMax(tile); }
/// <summary> /// Sets Z value of given <see cref="MultiTile"/> /// </summary> public void TileZSet(MultiTile tile, int setz) { AddToUndoList("Set Z"); tile.Z = setz; if (tile.Z > 127) { tile.Z = 127; } if (tile.Z < -128) { tile.Z = -128; } CalcSolver(tile.X, tile.Y); Tiles.Sort(); Modified = true; RecalcMinMax(tile); }
/// <summary> /// Moves given <see cref="MultiTile"/> /// </summary> public void TileMove(MultiTile tile, int newx, int newy) { if (Width == 0 || Height == 0) { return; } AddToUndoList("Move Tile"); if (tile != null) { tile.X = newx; tile.Y = newy; CalcSolver(newx, newy); Tiles.Sort(); Modified = true; RecalcMinMax(tile); } }
/// <summary> /// Resizes Multi size /// </summary> public void Resize(int width, int height) { AddToUndoList("Resize"); if ((Width > width) || (Height > height)) { for (int i = Tiles.Count - 1; i >= 0; --i) { MultiTile tile = Tiles[i]; if (tile.X >= width) { Tiles.RemoveAt(i); } else if (tile.Y >= height) { Tiles.RemoveAt(i); } } } if ((Width < width) || (Height < height)) { for (int x = 0; x < width; ++x) { for (int y = 0; y < height; ++y) { if ((x < Width) && (y < Height)) { continue; } Tiles.Add(new FloorTile(x, y, Parent.DrawFloorZ)); } } } Width = width; Height = height; Modified = true; RecalcMinMax(); }
/// <summary> /// Gets Bitmap of Multi and sets HoverTile /// </summary> public void GetImage(Graphics gfx, int xoff, int yoff, int maxheight, Point mouseLoc, bool drawFloor, bool forcerefresh) { if (Width == 0 || Height == 0) { return; } if (Modified) { RecalcMinMax(); } xMin = xMinOrg; xMax = xMaxOrg; yMin = yMinOrg; yMax = yMaxOrg; if (drawFloor) { int floorzmod = -Parent.DrawFloorZ << 2 - 44; if (yMin > floorzmod) { yMin = floorzmod; } floorzmod = (Width + Height) * 22 - Parent.DrawFloorZ << 2; if (yMaxOrg < floorzmod) { yMax = floorzmod; } } Parent.HoverTile = GetSelected(mouseLoc, maxheight, drawFloor); Rectangle clipBounds = Rectangle.Round(gfx.ClipBounds); for (int i = 0; i < Tiles.Count; ++i) { MultiTile tile = Tiles[i]; if (!tile.isVirtualFloor) { if (tile.Z > maxheight) { continue; } } Bitmap bmp = tile.GetBitmap(); if (bmp == null) { continue; } drawdestRectangle.X = tile.Xmod; drawdestRectangle.Y = tile.Ymod; drawdestRectangle.X -= xMin + xoff; drawdestRectangle.Y -= yMin + yoff; drawdestRectangle.Width = bmp.Width; drawdestRectangle.Height = bmp.Height; if (!clipBounds.IntersectsWith(drawdestRectangle)) { continue; } if (tile.isVirtualFloor) { if (drawFloor) { gfx.DrawImageUnscaled(bmp, drawdestRectangle); } } else { if ((Parent.HoverTile != null) && (Parent.HoverTile == tile)) { gfx.DrawImage(bmp, drawdestRectangle, 0, 0, drawdestRectangle.Width, drawdestRectangle.Height, GraphicsUnit.Pixel, MultiTile.HoverColor); } else if ((Parent.SelectedTile != null) && (Parent.SelectedTile == tile)) { gfx.DrawImage(bmp, drawdestRectangle, 0, 0, drawdestRectangle.Width, drawdestRectangle.Height, GraphicsUnit.Pixel, MultiTile.SelectedColor); } else if (tile.Transparent) { gfx.DrawImage(bmp, drawdestRectangle, 0, 0, drawdestRectangle.Width, drawdestRectangle.Height, GraphicsUnit.Pixel, MultiTile.TransColor); } else if ((Parent.ShowWalkables) && (tile.Walkable)) { gfx.DrawImage(bmp, drawdestRectangle, 0, 0, drawdestRectangle.Width, drawdestRectangle.Height, GraphicsUnit.Pixel, MultiTile.StandableColor); } else if ((Parent.ShowDoubleSurface) && (tile.DoubleSurface)) { gfx.DrawImage(bmp, drawdestRectangle, 0, 0, drawdestRectangle.Width, drawdestRectangle.Height, GraphicsUnit.Pixel, MultiTile.StandableColor); } else { gfx.DrawImageUnscaled(bmp, drawdestRectangle); } } } }
/// <summary> /// Adds an <see cref="MultiTile"/> to specific location /// </summary> public void TileAdd(int x, int y, int z, ushort id) { if ((x > Width) || (y > Height)) return; AddToUndoList("Add Tile"); MultiTile tile = new MultiTile(id, x, y, z, 1); Tiles.Add(tile); CalcSolver(x, y); Modified = true; Tiles.Sort(); RecalcMinMax(tile); }
/// <summary> /// Moves given <see cref="MultiTile"/> /// </summary> public void TileMove(MultiTile tile, int newx, int newy) { if (Width == 0 || Height == 0) return; AddToUndoList("Move Tile"); if (tile != null) { tile.X = newx; tile.Y = newy; CalcSolver(newx, newy); Tiles.Sort(); Modified = true; RecalcMinMax(tile); } }
/// <summary> /// Removes specific <see cref="MultiTile"/> /// </summary> public void TileRemove(MultiTile tile) { if (Width == 0 || Height == 0) return; AddToUndoList("Remove Tile"); if (tile != null) { Tiles.Remove(tile); Modified = true; RecalcMinMax(tile); } }
private void RecalcMinMax(MultiTile tile) { if (tile.isVirtualFloor) return; if (tile.GetBitmap() == null) return; int px = tile.Xmod - GapXMod; int py = tile.Ymod - GapYMod; if (px < xMin) xMin = px; if (py < yMin) yMin = py; px += tile.GetBitmap().Width; py += tile.GetBitmap().Height; if (px > xMax) xMax = px; if (py > yMax) yMax = py; if (tile.Z > zMax) zMax = tile.Z; if (tile.Z < zMin) zMin = tile.Z; Modified = false; xMinOrg = xMin; xMaxOrg = xMax; yMinOrg = yMin; yMaxOrg = yMax; if (Parent.ShowWalkables) CalcWalkable(); if (Parent.ShowDoubleSurface) CalcDoubleSurface(); }
/// <summary> /// Alters Z level for given <see cref="MultiTile"/> /// </summary> public void TileZMod(MultiTile tile, int modz) { AddToUndoList("Modify Z"); tile.Z += modz; if (tile.Z > 127) tile.Z = 127; if (tile.Z < -128) tile.Z = -128; CalcSolver(tile.X, tile.Y); Tiles.Sort(); Modified = true; RecalcMinMax(tile); }
// Public Methods (3) public int CompareTo(object x) { if (x == null) { return(1); } if (!(x is MultiTile)) { throw new ArgumentNullException(); } MultiTile a = (MultiTile)x; if (X > a.X) { return(1); } else if (X < a.X) { return(-1); } if (Y > a.Y) { return(1); } else if (Y < a.Y) { return(-1); } if (!a.isVirtualFloor && !isVirtualFloor) { ItemData ourData = TileData.ItemTable[ID]; ItemData theirData = TileData.ItemTable[a.ID]; int ourTreshold = 0; if (ourData.Height > 0) { ++ourTreshold; } if (!ourData.Background) { ++ourTreshold; } int ourZ = Z; int theirTreshold = 0; if (theirData.Height > 0) { ++theirTreshold; } if (!theirData.Background) { ++theirTreshold; } int theirZ = a.Z; ourZ += ourTreshold; theirZ += theirTreshold; int res = ourZ - theirZ; if (res == 0) { res = ourTreshold - theirTreshold; } if (res == 0) { res = Solver - a.Solver; } return(res); } else { if (Z > a.Z) { return(1); } else if (a.Z > Z) { return(-1); } if (a.isVirtualFloor) { return(1); } else if (isVirtualFloor) { return(-1); } } return(0); }
/// <summary> /// Sets Z value of given <see cref="MultiTile"/> /// </summary> public void TileZSet(MultiTile tile, int setz) { AddToUndoList("Set Z"); tile.Z = setz; if (tile.Z > 127) tile.Z = 127; if (tile.Z < -128) tile.Z = -128; CalcSolver(tile.X, tile.Y); Tiles.Sort(); Modified = true; RecalcMinMax(tile); }