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

@@ -88,11 +88,20 @@ func parseScript(src string) (*script, error) {
return nil, fmt.Errorf("script: okänd riktning %q", f[1])
}
st.n, _ = strconv.Atoi(f[2])
case "shot", "pick", "waitphase":
case "shot", "pick", "waitphase", "urge":
if len(f) != 2 {
return nil, fmt.Errorf("script: '%s TEXT'", f[0])
}
st.arg = f[1]
case "push": // håll en riktning N bildrutor oavsett om spelaren kommer någonstans (t.ex. mot en spärr)
if len(f) != 3 {
return nil, fmt.Errorf("script: 'push DIR N'")
}
st.dir = parseDir(f[1])
if st.dir == sim.None {
return nil, fmt.Errorf("script: okänd riktning %q", f[1])
}
st.n, _ = strconv.Atoi(f[2])
case "quit", "waittrain", "waitstop", "waitover":
default:
return nil, fmt.Errorf("script: okänt kommando %q", f[0])
@@ -128,6 +137,7 @@ type trainWaiter interface {
RideAtDest() bool
LevelOver() bool
MiniPick(text string) bool
ForceUrge(name string) bool
TrackPhaseName() string
}
@@ -201,6 +211,17 @@ func (s *script) tick(g *Game, frame *ebiten.Image) error {
if tw, ok := g.scene.(trainWaiter); !ok || tw.LevelOver() || s.counter > 60*120 {
s.advance()
}
case "urge":
if tw, ok := g.scene.(trainWaiter); ok {
tw.ForceUrge(st.arg)
}
s.advance()
case "push":
virtual.held = st.dir
s.counter++
if s.counter >= st.n {
s.advance()
}
case "waitphase":
s.counter++
if tw, ok := g.scene.(trainWaiter); !ok || tw.TrackPhaseName() == st.arg || s.counter > 60*60 {