M12: ljud, inställningar och release v0.1.0
All checks were successful
release / build-release (push) Successful in 1m35s

tools/gensound syntetiserar 21 ljud: fyra stationsmelodier i klockklang
(en per station via melody-fältet eller banans id), ankomstjingel,
ding-dong vid inrullning, dörrsignal vid avgång, spärrens pip och
nekande, kiosk, toalett, lärt ord, bekräfta/varning, byte, personal,
vinst, förlust, flygplan, sorl och menymusik. sfx.go spelar effekter
utifrån vad som hänt i sim.Run sedan förra bildrutan. Ljudlagret har
huvudvolym × effekter/musik och byter inte slinga i onödan.
Inställningar (S på bankartan, sparas): volymer, språk sv/en som laddas
om direkt, fönsterskala, fullskärm (F11 överallt) och tangentöversikt.
Fönsterikon från genart. CHANGELOG.md. Tester för ljudfiler, melodival
och inställningar. Docs, wiki och skärmdumpar uppdaterade.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
2026-10-25 08:31:38 +01:00
parent 36a45563ec
commit 86f8130735
47 changed files with 800 additions and 107 deletions

View File

@@ -0,0 +1,46 @@
package game
import (
"testing"
"gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/level"
)
// TestAllSoundsDecode: alla ljud som spelet refererar finns och går att
// avkoda (utan ljudkontext eller fönster).
func TestAllSoundsDecode(t *testing.T) {
seen := map[string]bool{}
for _, name := range AllSounds() {
if seen[name] {
t.Errorf("%s listas två gånger", name)
}
seen[name] = true
pcm, err := decodeSound(name)
if err != nil {
t.Errorf("%s: %v", name, err)
continue
}
if len(pcm) < sampleRate/20*4 { // minst 50 ms stereo 16-bit
t.Errorf("%s: för kort (%d byte)", name, len(pcm))
}
}
}
func TestMelodyForIsStableAndKnown(t *testing.T) {
known := map[string]bool{}
for _, m := range StationMelodies {
known[m] = true
}
a := &level.Level{ID: "005-ueno", Station: "ueno"}
if m := MelodyFor(a); !known[m] || m != MelodyFor(a) {
t.Fatalf("MelodyFor = %q", m)
}
if m := MelodyFor(&level.Level{ID: "x", Melody: "c"}); m != "melody-c" {
t.Fatalf("melody-fältet ska vinna: %q", m)
}
var nilAudio *Audio
nilAudio.Play(SoundWin, 1) // nil-säkert
nilAudio.Loop(SoundMusicMap, 1)
nilAudio.SetVolumes(1, 1, 1)
nilAudio.StopLoop()
}