fix: sort rooms by physical position so map numbers match layout

Rooms were shuffled randomly before assignment, causing room 1 and 2
to be physically far apart on the map despite being logically connected.
Now rooms are sorted top-to-bottom, left-to-right after BSP placement,
so adjacent room numbers are also physically adjacent on the map.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-25 23:13:20 +09:00
parent 3068fc5550
commit f6419b7984

View File

@@ -1,6 +1,9 @@
package dungeon
import "math/rand"
import (
"math/rand"
"sort"
)
const (
MapWidth = 60
@@ -35,18 +38,25 @@ func GenerateFloor(floorNum int, rng *rand.Rand) *Floor {
var leaves []*bspNode
collectLeaves(root, &leaves)
// Shuffle leaves so room assignment is varied
// We want 5-8 rooms. If we have more leaves, shuffle and trim.
targetRooms := 5 + rng.Intn(4) // 5..8
if len(leaves) > targetRooms {
rng.Shuffle(len(leaves), func(i, j int) {
leaves[i], leaves[j] = leaves[j], leaves[i]
})
// We want 5-8 rooms. If we have more leaves, merge some; if fewer, accept it.
// Ensure at least 5 leaves by re-generating if needed (BSP should produce enough).
// Cap at 8 rooms.
targetRooms := 5 + rng.Intn(4) // 5..8
if len(leaves) > targetRooms {
leaves = leaves[:targetRooms]
}
// Sort leaves by physical position (left-to-right, top-to-bottom)
// so room indices match their map positions
sort.Slice(leaves, func(i, j int) bool {
ci := leaves[i].y + leaves[i].h/2
cj := leaves[j].y + leaves[j].h/2
if ci != cj {
return ci < cj
}
return leaves[i].x+leaves[i].w/2 < leaves[j].x+leaves[j].w/2
})
// If we somehow have fewer than 5, that's fine — the BSP with 60x20 and min 12x8 gives ~5-8 naturally.
// Place rooms inside each leaf