M10c: vem betalar i kiosken och spärrar utan återvändo
All checks were successful
release / build-release (push) Successful in 2m7s

Björns tillägg 2026-10-24. Med egna kort och fler i sällskapet frågar
kiosken vem som betalar (minigame.Payer: kontant, spelarens kort eller en
följares kort; den som inte har råd nekas, Esc avbryter). Avgiften dras
nu när man passerar spärren in i det betalda området (level.InsideGates),
inte på spärrrutan. Banflaggan oneWayGates: incheckad släpps inte ut igen
förrän man åkt; Enter vid spärren kallar på personal (10 s) som låser upp
korten; ny inpassering kostar igen. På i 005, 007/007b och 008/008b.
Skriptkommandon urge och push. Docs, wiki och skärmdumpar uppdaterade.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
2026-10-24 22:12:13 +02:00
parent 4ae6a1d24c
commit f04d6a88f9
26 changed files with 674 additions and 64 deletions

View File

@@ -155,6 +155,25 @@ func walk(t *testing.T, r *Run, path []level.Point) {
}
}
// throughGate kapar en väg vid första rutan innanför spärrarna – där dras
// avgiften (inte på spärrrutan).
func throughGate(l *level.Level, path []level.Point) []level.Point {
in := l.InsideGates()
for i, p := range path {
if in[p] {
return path[:i+1]
}
}
if len(path) > 0 { // vägen slutar på spärren: kliv in på rutan innanför
for _, n := range l.Neighbors(path[len(path)-1]) {
if in[n] {
return append(path, n)
}
}
}
return path
}
// waitForTrain står still tills tåget vid perrongen är inne.
func waitForTrain(t *testing.T, r *Run) *level.Train {
t.Helper()
@@ -698,12 +717,7 @@ func TestPhoneSpeedRescanAndBattery(t *testing.T) {
}
gate := l.Find(level.Gate)[0]
path := l.Path(r.Player.Tile, gate, r.PathCanEnter)
for i, p := range path { // stanna på den första spärrutan – där sker skanningen
if l.At(p) == level.Gate {
path = path[:i+1]
break
}
}
path = throughGate(l, path) // in i det betalda området: där dras avgiften och sker skanningen
walk(t, r, path)
rescans[r.Rescans]++
if r.Rescans == 1 {
@@ -873,12 +887,7 @@ func TestIndividualCardsAtGateAndMachine(t *testing.T) {
// Spärren drar från allas kort.
before := r.Wallet.Spent
path := l1.Path(r.Player.Tile, gate, r.PathCanEnter)
for i, p := range path {
if l1.At(p) == level.Gate {
path = path[:i+1]
break
}
}
path = throughGate(l1, path) // in i det betalda området: där dras avgiften och sker skanningen
walk(t, r, path)
if anna.Card != 1000-l1.FareYen || r.Wallet.Card != StartCardYen-l1.FareYen || r.Wallet.Spent != before+2*l1.FareYen {
t.Fatalf("efter spärren: anna=%d egen=%d spent=%d", anna.Card, r.Wallet.Card, r.Wallet.Spent)
@@ -1039,12 +1048,7 @@ func TestRunOptionsFromProgression(t *testing.T) {
r.Step(frame, None, false)
}
path := l.Path(r.Player.Tile, gate, r.PathCanEnter)
for i, p := range path {
if l.At(p) == level.Gate {
path = path[:i+1]
break
}
}
path = throughGate(l, path) // in i det betalda området: där dras avgiften och sker skanningen
walk(t, r, path)
if r.Wallet.Spent != 0 || r.GatePasses != 1 {
t.Fatalf("gratis spärr: spent=%d passes=%d", r.Wallet.Spent, r.GatePasses)