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

@@ -141,6 +141,18 @@ func (s *LevelScene) drawModeHint(a *Assets, screen *ebiten.Image) {
a.Draw(screen, txt, 4, y+3, col)
}
// ForceUrge gör en i sällskapet törstig (skriptläget: "urge NAMN" för
// skärmdumpar av kiosken).
func (s *LevelScene) ForceUrge(name string) bool {
for _, m := range s.run.Party.Members {
if m.Name == name {
m.Meters.Drink, m.Urge = 5, sim.Thirsty
return true
}
}
return false
}
// LevelOver rapporterar om banan är avgjord (skriptläget: "waitover").
func (s *LevelScene) LevelOver() bool { return s.run.Outcome != sim.Ongoing }
@@ -222,6 +234,13 @@ func (s *LevelScene) MiniPick(text string) bool {
s.run.StepMini(0, minigame.Input{MoveX: 1})
return false
}
case *minigame.Payer:
o := m.Options[m.Cursor]
if o.Name == text || (text == "cash" && o.Cash) {
return true
}
s.run.StepMini(0, minigame.Input{MoveX: 1})
return false
case *minigame.TopUp:
switch m.Stage {
case minigame.TopUpPickMember:
@@ -492,6 +511,9 @@ func (s *LevelScene) drawHUD(g *Game, screen *ebiten.Image) {
if r.Facility.Active {
p = r.FacilityProgress()
}
if r.Staff.Active {
p = r.StaffProgress()
}
by := float32(y + h - 7)
vector.DrawFilledRect(screen, 4, by, ScreenW-8, 4, colBar, false)
vector.DrawFilledRect(screen, 4, by, float32((ScreenW-8)*p), 4, colKnown, false)
@@ -567,6 +589,17 @@ func (s *LevelScene) infoLines(a *Assets) (lines []line, accent color.Color, bar
}
switch lvl.At(tile) {
case level.Gate:
switch {
case r.Staff.Active:
return []line{plainLine(a.T("hud.staff_busy"), colDim)}, colGood, true
case r.NoExitAt >= 0 && r.Time-r.NoExitAt < deniedShowSec:
return a.wrapLine(plainLine(fmt.Sprintf(a.T("hud.no_exit"), sim.StaffSec), colBad), maxW), colBad, false
case r.NeedsStaff():
return []line{plainLine(fmt.Sprintf(a.T("hud.staff_prompt"), sim.StaffSec), colWarn)}, colWarn, false
case lvl.OneWayGates && r.StaffUnlocked:
return []line{plainLine(a.T("hud.unlocked_prompt"), colGood)}, colGood, false
}
case level.Toilet:
if r.Facility.Active {
return []line{plainLine(a.T("hud.toilet_busy"), colDim)}, colGood, true