public static List<Room> MakeRooms(Model m) { var rooms = new List<Room>(); foreach (var b in m.Brushes) { var rr = rooms.Where(r => r.IntersectsWith(b.Bounds)).ToList(); switch (rr.Count) { case 0: rooms.Add(new Room(m, b)); break; case 1: rr[0].brushes.Add(b); break; default: rr[0].brushes.Add(b); var toRemove = rr.Skip(1); rr[0].brushes.AddRange(toRemove.SelectMany(a => a.brushes)); rooms.Remove(toRemove); break; } } return rooms; }
public override bool OnMouseDown(Surface s, Model m, Point square, Point offset, MouseButtons mb) { if (mb == MouseButtons.Left) selected = m.ActorsAt(square).Where(a => a is IOrderTarget).FirstOrDefault(); if (mb == MouseButtons.Right && selected != null) ((IOrderTarget)selected).AcceptOrder( square ); return true; }
public static IEnumerable<Pair<Point, Point>> WallsUnderRay(Point a, Point b, Model m) { var tiles = TilesUnderRay(a, b); var prev = a.ToSquare(); foreach (var t in tiles) { var i = MakeDirMask(Math.Sign(t.X - prev.X), Math.Sign(t.Y - prev.Y)); var mask = m.Cache.Value.GetWallMask(prev.X, prev.Y); if (i != 0 && mask != null) if ((mask.Value & i) != ((mask.Value >> 2) & i)) yield return new Pair<Point, Point>(t, prev); prev = t; } }
public ModelCache(Model m) { var mx = m.Brushes.Select(b => b.Bounds.Right + 1).DefaultIfEmpty(0).Max(); var my = m.Brushes.Select(b => b.Bounds.Bottom + 1).DefaultIfEmpty(0).Max(); cce = new CellCacheEntry[mx, my]; for (var x = 0; x < mx; x++) for (var y = 0; y < my; y++) { cce[x, y].content = m.GetFloorContent(x, y); cce[x, y].brushes = m.GetBrushesAt(new Point(x, y)).Count(); cce[x, y].doors = m.GetDoorsEndFrom(new Point(x, y)).Count(); if (m.HasWall(x, y, x + 1, y)) cce[x, y].wallMask |= 0x1; if (m.HasWall(x, y, x, y + 1)) cce[x, y].wallMask |= 0x2; if (m.HasDoor(x, y, x + 1, y) != null) cce[x, y].wallMask |= 0x4; if (m.HasDoor(x, y, x, y + 1) != null) cce[x, y].wallMask |= 0x8; if (m.HasWall(x - 1, y, x, y)) cce[x, y].wallMask |= 0x10; if (m.HasWall(x, y - 1, x, y)) cce[x, y].wallMask |= 0x20; if (m.HasDoor(x - 1, y, x, y) != null) cce[x, y].wallMask |= 0x40; if (m.HasDoor(x, y - 1, x, y) != null) cce[x, y].wallMask |= 0x80; } }
public override void DrawToolOverlay(Surface s, Graphics g, Model m) { if (selected != null) g.DrawRectangle(Pens.White, selected.Position.X - 20, selected.Position.Y - 20, 40, 40); }
public Room(Model m, Brush firstBrush) { brushes.Add(firstBrush); model = m; }
public virtual bool OnMouseUp(Surface s, Model m, Point square, Point offset, MouseButtons mb) { return false; }
public virtual void DrawToolOverlay(Surface s, Graphics g, Model m) { }