Files
metro-puzzle-jp/internal/game/ticker.go
claude 0c47b0ad00
All checks were successful
release / build-release (push) Successful in 1m36s
M10b: bussar, fler sidospår och överstimulerande UI
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>
2026-10-25 17:33:55 +01:00

54 lines
1.6 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package game
import (
"image/color"
"math"
"strings"
"github.com/hajimehoshi/ebiten/v2"
"github.com/hajimehoshi/ebiten/v2/vector"
)
// Överstimulerande UI (level.Overload): en rullande reklamticker i
// blinkande färger under HUD:en, och fler affischer på väggarna. Texten är
// reklamfraser som inte betyder något för spelet – det är poängen.
var adPhrases = []string{"大セール 半額!", "新発売 ラーメン", "免税 お土産", "駅弁 人気No.1", "本日限り 特価", "ポイント2倍", "新宿 ショッピング", "温泉 旅行 キャンペーン"}
const tickerSpeed = 30.0 // px/s
// drawTicker ritar reklamtickern (bara med Overload och när inget annat
// ligger där).
func (s *LevelScene) drawTicker(g *Game, screen *ebiten.Image) {
r := s.run
if !r.Level.Overload || r.Mini != nil || r.Outcome != 0 || s.tips.current != "" {
return
}
a := g.Assets
text := strings.Join(adPhrases, " ★ ") + " ★ "
w := a.Width(text)
if w == 0 {
return
}
y := 26
blink := math.Mod(r.Time, 1.0) < 0.5
bg, fg := color.RGBA{120, 30, 60, 230}, color.RGBA{255, 230, 120, 255}
if blink {
bg, fg = color.RGBA{40, 60, 140, 230}, color.RGBA{255, 255, 255, 255}
}
vector.DrawFilledRect(screen, 0, float32(y), ScreenW, LineH+2, bg, false)
x := ScreenW - int(math.Mod(r.Time*tickerSpeed, float64(w+ScreenW)))
for _, sx := range []int{x, x + w} {
if sx < ScreenW && sx+w > 0 {
a.Draw(screen, text, sx, y+1, fg)
}
}
}
// clutterLevel är den visuella röran: banans clutter, maximal med Overload.
func (s *LevelScene) clutterLevel() int {
if s.run.Level.Overload {
return 3
}
return s.run.Level.Clutter
}