M10d: toaletter innanför och utanför spärrarna
All checks were successful
release / build-release (push) Successful in 1m38s

Björns tillägg 2026-10-24. Generatorn har nu ett betalt område per perrong
(paidDepth) och toilets inside/outside/both: 005 Ueno och 008b Nippori har
toalett bara innanför, 007b Ueno på båda sidor. Perrongceller görs till
återvändsgränder (bara passagen mot starten behålls, labyrinten repareras)
och det betalda området krymper om det skulle bli genomfart; regeln att
varje perrong nås utan att passera ett annat betalt område testas i
level och levelcheck. level.PathOutside används av testbotar och shots.
Alla genererade banor utom 003 omgjorda, skärmdumpar omtagna.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
2026-10-24 23:09:27 +02:00
parent f04d6a88f9
commit 46bd330dfc
33 changed files with 419 additions and 209 deletions

View File

@@ -645,6 +645,32 @@ func (l *Level) InsideGates() map[Point]bool {
return seen
}
// PathOutside är Path som inte går genom betalda områden (innanför
// spärrarna) utom dem som start eller mål ligger i – så att en bot inte
// checkar in vid fel perrong på vägen (spärrar utan återvändo).
func (l *Level) PathOutside(from, to Point, canEnter func(Point) bool) []Point {
inside := l.InsideGates()
allowed := map[Point]bool{}
for _, seed := range []Point{from, to} {
if !inside[seed] || allowed[seed] {
continue
}
allowed[seed] = true
queue := []Point{seed}
for len(queue) > 0 {
p := queue[0]
queue = queue[1:]
for _, n := range l.Neighbors(p) {
if inside[n] && !allowed[n] {
allowed[n] = true
queue = append(queue, n)
}
}
}
}
return l.Path(from, to, func(p Point) bool { return canEnter(p) && (!inside[p] || allowed[p]) })
}
// UngatedPlatforms listar perronger som går att nå från start utan att
// passera någon spärr. Speldesignen kräver att alla perronger ligger
// innanför spärrar, så listan ska vara tom för skeppade banor.