aboutsummaryrefslogtreecommitdiff
path: root/internal/game/cmd_dig.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/game/cmd_dig.go')
-rw-r--r--internal/game/cmd_dig.go55
1 files changed, 14 insertions, 41 deletions
diff --git a/internal/game/cmd_dig.go b/internal/game/cmd_dig.go
index 653f045..0691b90 100644
--- a/internal/game/cmd_dig.go
+++ b/internal/game/cmd_dig.go
@@ -264,58 +264,31 @@ func findNextRoomID(currentRoomPath string) (int, error) {
}
-func (g *Game) buildGridFrom(fromRoomID int) (coord map[int][2]int, roomAt map[[2]int]int) {
+func (g *Game) buildGridFrom(fromRoomID int) (coord map[int][3]int, roomAt map[[3]int]int) {
roomIndex := g.World.RoomIndex()
- coord = map[int][2]int{fromRoomID: {0, 0}}
- roomAt = map[[2]int]int{{0, 0}: fromRoomID}
- queue := []int{fromRoomID}
-
- for len(queue) > 0 {
- rid := queue[0]
- queue = queue[1:]
- room, err := g.World.LoadRoom(rid)
- if err != nil {
- continue
- }
- c := coord[rid]
- for _, ed := range world.ExitOrder {
- exit, ok := room.Exits[ed]
- if !ok || exit.Room <= 0 || !roomIndex[exit.Room] {
- continue
+ rg := world.BuildGrid(fromRoomID,
+ func(id int) (*world.Room, bool) {
+ r, err := g.World.LoadRoom(id)
+ if err != nil {
+ return nil, false
}
- target := exit.Room
- if ed == world.Up || ed == world.Down {
- continue
- }
- gd, ok := world.DirectionDeltas[ed]
- if !ok {
- continue
- }
- want := [2]int{c[0] + gd[0], c[1] + gd[1]}
-
- if _, exists := coord[target]; exists {
- continue
- }
- if occupier, exists := roomAt[want]; exists && occupier != target {
- continue
- }
- coord[target] = want
- roomAt[want] = target
- queue = append(queue, target)
- }
- }
- return coord, roomAt
+ return r, true
+ },
+ func(id int) bool { return roomIndex[id] },
+ nil,
+ )
+ return rg.Coord, rg.RoomAt
}
func (g *Game) findGridConflict(fromRoomID int, dir world.ExitDir) int {
- delta, ok := world.DirectionDeltas[dir]
+ delta, ok := world.DirectionDeltas3D[dir]
if !ok {
return 0
}
_, roomAt := g.buildGridFrom(fromRoomID)
- targetCoord := [2]int{delta[0], delta[1]}
+ targetCoord := [3]int{delta[0], delta[1], delta[2]}
if occupier, ok := roomAt[targetCoord]; ok && occupier != fromRoomID {
return occupier
}