diff options
Diffstat (limited to 'internal/game/cmd_dig.go')
| -rw-r--r-- | internal/game/cmd_dig.go | 55 |
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 } |
