package mapgens import ( "fmt" "lab.zaar.be/thefish/alchemyst-go/engine/gamemap" "lab.zaar.be/thefish/alchemyst-go/engine/types" "lab.zaar.be/thefish/alchemyst-go/util" "lab.zaar.be/thefish/alchemyst-go/util/appctx" "lab.zaar.be/thefish/alchemyst-go/util/delaunay" ) func DelaunayMstGen(ctx appctx.ClientCtx, l *gamemap.Level) (*gamemap.Level, []gamemap.Room) { rng := util.NewRNG() //fill with walls for i := 0; i < l.W; i ++ { for j := 0; j < l.H; j++ { l.SetTileByXY(i, j, gamemap.NewWall()) } } rooms := GetRandomRoomList(ctx, rng, l, maxrooms, minRoomSize, maxRoomSize) for _, room := range rooms { err := room.BlitToLevel(l) if err != nil { fmt.Printf("err: %v", err) } } centers := make([]types.Coords, 0) for _, room := range rooms { centers = append(centers, room.Center) } edges := delaunay.GetMst(centers, l.W, l.H) for _, edge := range edges { MedianStraight(rng, l, rooms, centers, edge) } return l, rooms } func MedianStraight(rng *util.RNG, l *gamemap.Level, rooms []gamemap.Room, centers []types.Coords, edge types.Edge) { //find connected rooms var fromRoom, toRoom gamemap.Room for _, room := range rooms { if room.Center == edge.From { fromRoom = room continue } if room.Center == edge.To { toRoom = room continue } if len(fromRoom.Connectors) > 0 && len(toRoom.Connectors) > 0 { break } } midpoint := edge.Midpoint() fromConnector := FindNearestConnector(midpoint, fromRoom) toConnector := FindNearestConnector(midpoint, toRoom) ConnectStraight(rng, l, fromConnector, toConnector, midpoint) }