Link?PlaceRoomTargetFixed(Room src, FixedRoom target, int connPt, int sep) { var targetDir = ((Direction)connPt).Reverse(); var connPts = (Tuple <Direction, int>[])target.ConnectionPoints.Clone(); _rand.Shuffle(connPts); Tuple <Direction, int> conn = null; foreach (var pt in connPts) { if (pt.Item1 == targetDir) { conn = pt; break; } } if (conn == null) { return(null); } int x, y; Link?link = null; switch (conn.Item1) { case Direction.North: case Direction.South: // North & South int minX = src.Pos.X - conn.Item2; int maxX = src.Pos.X + src.Width - _template.CorridorWidth - conn.Item2; x = _rand.Next(minX, maxX + 1); if (conn.Item1 == Direction.North) { y = src.Pos.Y + src.Height + sep; } else { y = src.Pos.Y - sep - target.Height; } target.Pos = new Point(x, y); if (_collision.HitTest(target)) { return(null); } link = new Link((Direction)connPt, target.Pos.X + conn.Item2); break; case Direction.East: case Direction.West: // East & West int minY = src.Pos.Y - conn.Item2; int maxY = src.Pos.Y + src.Height - _template.CorridorWidth - conn.Item2; y = _rand.Next(minY, maxY + 1); if (conn.Item1 == Direction.West) { x = src.Pos.X + src.Width + sep; } else { x = src.Pos.X - sep - target.Width; } target.Pos = new Point(x, y); if (_collision.HitTest(target)) { return(null); } link = new Link((Direction)connPt, target.Pos.Y + conn.Item2); break; } _collision.Add(target); return(link); }
Link?PlaceRoomFixed(FixedRoom src, FixedRoom target, int connPt, int sep) { var conn = src.ConnectionPoints[connPt]; var targetDirection = conn.Item1.Reverse(); var targetConns = (Tuple <Direction, int>[])target.ConnectionPoints.Clone(); _rand.Shuffle(targetConns); Tuple <Direction, int> targetConnPt = null; foreach (var targetConn in targetConns) { if (targetConn.Item1 == targetDirection) { targetConnPt = targetConn; break; } } if (targetConnPt == null) { return(null); } int x, y; Link?link = null; switch (conn.Item1) { case Direction.North: case Direction.South: // North & South x = src.Pos.X + conn.Item2 - targetConnPt.Item2; if (conn.Item1 == Direction.South) { y = src.Pos.Y + src.Height + sep; } else { y = src.Pos.Y - sep - target.Height; } target.Pos = new Point(x, y); if (_collision.HitTest(target)) { return(null); } link = new Link(conn.Item1, src.Pos.X + conn.Item2); break; case Direction.East: case Direction.West: // East & West y = src.Pos.Y + conn.Item2 - targetConnPt.Item2; if (conn.Item1 == Direction.East) { x = src.Pos.X + src.Width + sep; } else { x = src.Pos.X - sep - target.Width; } target.Pos = new Point(x, y); if (_collision.HitTest(target)) { return(null); } link = new Link(conn.Item1, src.Pos.Y + conn.Item2); break; } _collision.Add(target); return(link); }
Link?PlaceRoomSourceFixed(FixedRoom src, Room target, int connPt, int sep) { var conn = src.ConnectionPoints[connPt]; int x, y; Link?link = null; switch (conn.Item1) { case Direction.North: case Direction.South: // North & South int minX = src.Pos.X + conn.Item2 + _template.CorridorWidth - target.Width; int maxX = src.Pos.X + conn.Item2; x = _rand.Next(minX, maxX + 1); if (conn.Item1 == Direction.South) { y = src.Pos.Y + src.Height + sep; } else { y = src.Pos.Y - sep - target.Height; } target.Pos = new Point(x, y); if (_collision.HitTest(target)) { return(null); } link = new Link(conn.Item1, src.Pos.X + conn.Item2); break; case Direction.East: case Direction.West: // East & West int minY = src.Pos.Y + conn.Item2 + _template.CorridorWidth - target.Height; int maxY = src.Pos.Y + conn.Item2; y = _rand.Next(minY, maxY + 1); if (conn.Item1 == Direction.East) { x = src.Pos.X + src.Width + sep; } else { x = src.Pos.X - sep - target.Width; } target.Pos = new Point(x, y); if (_collision.HitTest(target)) { return(null); } link = new Link(conn.Item1, src.Pos.Y + conn.Item2); break; } _collision.Add(target); return(link); }