M7: svårighet, tid, poäng, debuffar, egna kort och sittplatsval
All checks were successful
release / build-release (push) Successful in 1m37s
All checks were successful
release / build-release (push) Successful in 1m37s
- sim/stats.go: Stats (fart, törst, fokus, toalett, tur), debuffar som multiplikatorer, Profile som följer med mellan banor och räknar ned - sim.Run: tidsgräns och maxantal missade tåg förlorar banan; poängformel (tid mot par, pengar, sällskapets mätare, utforskat, avdrag); debuffar tjänas av många steg, lång tid, tom matmätare och seedad otur vid kiosken; stats påverkar fart, mätartakter, läsning och hjälptid - egna kort (individualCards): Member.Card, spärren kräver allas saldo och drar från alla, automaten frågar vems kort, biljetter köps åt alla - sittplatsval (seatSelection): Ticket får ett sittplatssteg med seedade önskemål (fönster/gång/sida/bredvid); missnöjda ger mätar- och poängavdrag - level: maxMissedTrains, individualCards, seatSelection; bana 003 Shibuya (svårighet 3, fyra i sällskapet) och 002 med tidsgräns och sittplatser; ordboken utökad; generatorn är spec-driven - game: tid kvar/missade i HUD, debuffar i meny/HUD/resultat, poäng och förlustorsaker på resultatet, vyer för personval och vagn, skript-pick, flaggan -debuffs; HUD och resultat komprimerade för fyra i sällskapet - plan (Björn 2026-10-24): flera våningar med trappor som M9a, egna kort och sittplatsval som svårighetsinställningar i M7 – i spelbeskrivning, roadmap, testplan - docs/README/wiki med sittplatsbilden Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
@@ -45,6 +45,21 @@ func (s *LevelScene) drawTopUp(a *Assets, screen *ebiten.Image, m *minigame.TopU
|
||||
a.Draw(screen, a.T("mini.topup.title"), x+60, y+2, colText)
|
||||
y += 20
|
||||
switch m.Stage {
|
||||
case minigame.TopUpPickMember:
|
||||
a.Draw(screen, a.T("mini.topup.member"), x, y, colDim)
|
||||
y += LineH + 4
|
||||
for i, name := range m.Members {
|
||||
col := colText
|
||||
if i == m.Cursor {
|
||||
vector.DrawFilledRect(screen, float32(x-2), float32(y+i*LineH-1), 200, LineH, colBar, false)
|
||||
col = colKnown
|
||||
}
|
||||
bal := s.run.Wallet.Card
|
||||
if i > 0 {
|
||||
bal = s.run.Party.Members[i].Card
|
||||
}
|
||||
a.Draw(screen, fmt.Sprintf("%-8s %5d¥", name, bal), x, y+i*LineH, col)
|
||||
}
|
||||
case minigame.TopUpPickButton:
|
||||
a.Draw(screen, a.T("mini.topup.pick"), x, y, colDim)
|
||||
y += LineH + 4
|
||||
@@ -85,6 +100,10 @@ func (s *LevelScene) drawTicket(a *Assets, screen *ebiten.Image, m *minigame.Tic
|
||||
a.DrawBig(screen, "きっぷ", x, y, colKnown)
|
||||
a.Draw(screen, a.T("mini.ticket.title"), x+48, y+2, colText)
|
||||
y += 20
|
||||
if m.Stage == minigame.TicketPickSeat {
|
||||
s.drawSeats(a, screen, m, p, x, y)
|
||||
return
|
||||
}
|
||||
a.Draw(screen, fmt.Sprintf(a.T("mini.ticket.hint"), s.run.Level.Destination.Get("romaji"), m.Cash), x, y, colDim)
|
||||
y += LineH + 4
|
||||
for i, o := range m.Options {
|
||||
@@ -154,3 +173,64 @@ func (s *LevelScene) drawRide(a *Assets, screen *ebiten.Image, m *minigame.Ride,
|
||||
}
|
||||
a.Draw(screen, hint, x, p.Max.Y-16, colGood)
|
||||
}
|
||||
|
||||
// prefText beskriver ett önskemål.
|
||||
func prefText(a *Assets, m *minigame.Ticket, p minigame.SeatPref) string {
|
||||
switch p.Kind {
|
||||
case minigame.PrefWindow:
|
||||
return a.T("seat.window")
|
||||
case minigame.PrefAisle:
|
||||
return a.T("seat.aisle")
|
||||
case minigame.PrefLeft:
|
||||
return a.T("seat.left")
|
||||
case minigame.PrefRight:
|
||||
return a.T("seat.right")
|
||||
default:
|
||||
return fmt.Sprintf(a.T("seat.with"), m.Members[p.With])
|
||||
}
|
||||
}
|
||||
|
||||
// drawSeats ritar vagnen: tre rader, fönster V | gång | fönster H, och
|
||||
// sällskapets önskemål till höger.
|
||||
func (s *LevelScene) drawSeats(a *Assets, screen *ebiten.Image, m *minigame.Ticket, p image.Rectangle, x, y int) {
|
||||
a.Draw(screen, fmt.Sprintf(a.T("mini.seat.hint"), m.Members[m.Current]), x, y, colDim)
|
||||
y += LineH + 4
|
||||
const sw, sh, gap = 22, 18, 10
|
||||
a.Draw(screen, a.T("seat.front"), x+2, y-2, colDim)
|
||||
y += 10
|
||||
for row := 0; row < minigame.SeatRows; row++ {
|
||||
for col := 0; col < minigame.SeatCols; col++ {
|
||||
sx := x + col*(sw+2)
|
||||
if col >= 2 {
|
||||
sx += gap
|
||||
}
|
||||
sy := y + row*(sh+3)
|
||||
seat := minigame.Seat{Row: row, Col: col}
|
||||
bg := colBar
|
||||
if m.SeatTaken(seat) {
|
||||
bg = color.RGBA{90, 105, 136, 255}
|
||||
}
|
||||
vector.DrawFilledRect(screen, float32(sx), float32(sy), sw, sh, bg, false)
|
||||
if seat == m.Seat {
|
||||
vector.DrawFilledRect(screen, float32(sx), float32(sy), sw, 2, colKnown, false)
|
||||
vector.DrawFilledRect(screen, float32(sx), float32(sy+sh-2), sw, 2, colKnown, false)
|
||||
}
|
||||
for i, as := range m.Assigned {
|
||||
if as == seat {
|
||||
a.Draw(screen, string([]rune(m.Members[i])[:1]), sx+8, sy+3, colText)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// Önskemål.
|
||||
px := x + 4*(sw+2) + gap + 14
|
||||
a.Draw(screen, a.T("mini.seat.prefs"), px, y-10, colDim)
|
||||
for i, pr := range m.Prefs {
|
||||
col := colText
|
||||
if pr.Member == m.Current {
|
||||
col = colKnown
|
||||
}
|
||||
a.Draw(screen, m.Members[pr.Member]+": "+prefText(a, m, pr), px, y+i*LineH, col)
|
||||
}
|
||||
a.Draw(screen, a.T("mini.cancel"), x, p.Max.Y-16, colDim)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user