M10b: bussar, fler sidospår och överstimulerande UI
All checks were successful
release / build-release (push) Successful in 1m36s
All checks were successful
release / build-release (push) Successful in 1m36s
Ett tåg kan vara en buss (vehicle: bus): samma tidtabell, faser, bedömning i nätet och ombordstigning, men ett fordon på en väg i stället för vagnar på räls, hållplatsskylt, "1番" på tavlan, tuta vid inrullning och dörrsignal före avgång. Nätet har tre busslinjer från Narita. Nya sidobanor: 001b Flygbussterminalen (biljettbana med tre bussar) och 003b Harajuku (Yamanote åt rätt eller fel håll runt ringen). Overload-flaggan ger en rullande reklamticker och maximalt med affischer (Ueno, Tokyo). Romaji utan makroner (fonten saknar dem). Skärmdumparna som börjar på bankartan går via titelskärmen. Tester, docs och wiki uppdaterade. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
@@ -31,15 +31,21 @@ type trackInfo struct {
|
||||
platform level.Point // perrongrutan
|
||||
track level.Point // rälsrutan bortom kanten
|
||||
horizontal bool // rälsens riktning
|
||||
bus bool // buss: väg och ett fordon i stället för räls och vagnar
|
||||
}
|
||||
|
||||
func (s *LevelScene) buildTracks() {
|
||||
s.tracks = nil
|
||||
s.rails = map[level.Point]bool{}
|
||||
s.roads = map[level.Point]bool{}
|
||||
for _, t := range level.PlatformTiles {
|
||||
for _, p := range s.run.Level.Find(t) {
|
||||
tt, horizontal := s.run.Level.TrackTile(p)
|
||||
s.tracks = append(s.tracks, trackInfo{tile: t, platform: p, track: tt, horizontal: horizontal})
|
||||
bus := false
|
||||
if tr := s.run.Level.TrainAt(t); tr != nil && tr.IsBus() {
|
||||
bus = true
|
||||
}
|
||||
s.tracks = append(s.tracks, trackInfo{tile: t, platform: p, track: tt, horizontal: horizontal, bus: bus})
|
||||
out := level.Point{X: tt.X - p.X, Y: tt.Y - p.Y} // riktningen bort från perrongen
|
||||
for k := -railsReach; k <= railsReach; k++ {
|
||||
c := tt
|
||||
@@ -51,7 +57,11 @@ func (s *LevelScene) buildTracks() {
|
||||
beyond := level.Point{X: c.X + out.X, Y: c.Y + out.Y, Z: c.Z}
|
||||
// Räls på väggrutor längs spåret, så länge det är vägg (eller kartkant) bortom dem.
|
||||
if s.run.Level.At(c) == level.Wall && s.run.Level.At(beyond) == level.Wall {
|
||||
s.rails[c] = true
|
||||
if bus {
|
||||
s.roads[c] = true
|
||||
} else {
|
||||
s.rails[c] = true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -87,7 +97,11 @@ func (s *LevelScene) drawRails(g *Game, screen *ebiten.Image, c level.Point, ox,
|
||||
op.GeoM.Translate(TileSize/2, TileSize/2)
|
||||
}
|
||||
op.GeoM.Translate(ox+float64(c.X*TileSize), oy+float64(c.Y*TileSize))
|
||||
screen.DrawImage(g.Assets.Rails, &op)
|
||||
img := g.Assets.Rails
|
||||
if s.roads[c] {
|
||||
img = g.Assets.Road
|
||||
}
|
||||
screen.DrawImage(img, &op)
|
||||
}
|
||||
|
||||
// drawTrains ritar tågen i rätt läge för sin fas.
|
||||
@@ -98,6 +112,11 @@ func (s *LevelScene) drawTrains(g *Game, screen *ebiten.Image, ox, oy float64) {
|
||||
continue // tågen på andra våningar syns inte härifrån
|
||||
}
|
||||
phase, prog := s.run.PlatformPhase(tr.tile)
|
||||
if tr.bus { // hållplatsskylten står på hållplatsen
|
||||
var op ebiten.DrawImageOptions
|
||||
op.GeoM.Translate(ox+float64(tr.platform.X*TileSize), oy+float64(tr.platform.Y*TileSize))
|
||||
screen.DrawImage(g.Assets.StopSign, &op)
|
||||
}
|
||||
// Strålkastare när tåget är på väg in: ett sken från det håll det kommer.
|
||||
if phase == level.Approaching {
|
||||
s.drawHeadlight(screen, tr, prog, ox, oy)
|
||||
@@ -106,8 +125,12 @@ func (s *LevelScene) drawTrains(g *Game, screen *ebiten.Image, ox, oy float64) {
|
||||
if !show {
|
||||
continue
|
||||
}
|
||||
for k := 0; k < trainCars; k++ {
|
||||
d := off + float64(k-trainCars/2)
|
||||
cars, sprite := trainCars, g.Assets.Train
|
||||
if tr.bus {
|
||||
cars, sprite = 1, g.Assets.Bus
|
||||
}
|
||||
for k := 0; k < cars; k++ {
|
||||
d := off + float64(k-cars/2)
|
||||
var op ebiten.DrawImageOptions
|
||||
x, y := float64(tr.track.X*TileSize), float64(tr.track.Y*TileSize)
|
||||
if tr.horizontal {
|
||||
@@ -119,7 +142,7 @@ func (s *LevelScene) drawTrains(g *Game, screen *ebiten.Image, ox, oy float64) {
|
||||
op.GeoM.Translate(TileSize/2, TileSize/2)
|
||||
}
|
||||
op.GeoM.Translate(ox+math.Round(x), oy+math.Round(y))
|
||||
screen.DrawImage(g.Assets.Train, &op)
|
||||
screen.DrawImage(sprite, &op)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -162,14 +185,19 @@ func (s *LevelScene) updateEffects(g *Game) {
|
||||
s.lastPhase[tr.tile] = phase
|
||||
dist := math.Hypot(float64(tr.platform.X*TileSize)-px, float64(tr.platform.Y*TileSize)-py) / TileSize
|
||||
mask := noiseMask(r.Level.Noise)
|
||||
switch phase {
|
||||
case level.Approaching: // ankomstjingeln: tåget är på väg
|
||||
switch {
|
||||
case tr.bus && phase == level.Arriving: // bussen tutar när den svänger in
|
||||
g.Audio.Play(SoundBusHorn, volumeAt(dist)*mask)
|
||||
case tr.bus && phase == level.Closing:
|
||||
g.Audio.Play(SoundDoors, volumeAt(dist)*mask)
|
||||
case tr.bus:
|
||||
case phase == level.Approaching: // ankomstjingeln: tåget är på väg
|
||||
g.Audio.Play(SoundApproach, volumeAt(dist)*mask)
|
||||
case level.Arriving: // ding-dong när det rullar in
|
||||
case phase == level.Arriving: // ding-dong när det rullar in
|
||||
g.Audio.Play(SoundAnnounce, volumeAt(dist)*mask)
|
||||
case level.Closing: // stationens avgångsmelodi innan dörrarna stängs
|
||||
case phase == level.Closing: // stationens avgångsmelodi innan dörrarna stängs
|
||||
g.Audio.Play(MelodyFor(r.Level), volumeAt(dist)*mask)
|
||||
case level.Leaving: // dörrsignalen när det går
|
||||
case phase == level.Leaving: // dörrsignalen när det går
|
||||
g.Audio.Play(SoundDoors, volumeAt(dist)*mask)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user