Inlärning (framsteg, stjärnor, ordlista) och M4: lämmeltåget
All checks were successful
release / build-release (push) Successful in 1m49s

Inlärning enligt Björns regler:
- lang.Knowledge: framsteg per ord (3 läsningar = känt), språkpoäng,
  köp av valfria ord (kostnad = tier), Award per stjärna
- sim.Run: RunOptions med seed; stjärnor 1–3 mot par (parSec eller
  kortaste vägen × 0,5 s + 20 s); ≥2 stjärnor lär resmålets ord; att
  stanna på skylt/perrong ger seedad 35 % chans till framsteg per okänt ord
- game: ordlista (L) med kända ord, framsteg och kostnad; stjärnor, poäng
  och inlärt resmål på resultatskärmen; framstegsnotis; flaggor -points/-seed

M4 lämmeltåget:
- sim.Party: medlemmar med mat/dryck/toa-mätare, behov under tröskel,
  seedade händelser var 45 s / antal (toa, törst, hunger, distraktion),
  fartstraff, toalett (W, 3 s/person) och kiosk (K, 150 ¥/person),
  följare på ledarens spår
- level: rutor W och K, party och parSec i bandatan; banor med sällskap
  måste ha toalett och kiosk (testas); 001 har 2, 002 har 3 i sällskapet
- game: följare med färgton, behovsmarkering över huvudet, mätarpanel,
  facilitetsrutor med förlopp; genart ritar toalett och kiosk
- skriptläget: move stannar exakt på målrutan även när farten inte är
  bildruteexakt (sällskapets fartstraff), stall-skydd mot väggar
- docs/README/wiki/spelbeskrivning uppdaterade

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
2026-10-23 21:29:09 +02:00
parent b67493fddb
commit daa2089eda
38 changed files with 1436 additions and 115 deletions

View File

@@ -208,3 +208,43 @@ func TestCharClasses(t *testing.T) {
t.Fatal("HasKana/IsJapanese")
}
}
func TestProgressLearnsAfterEnoughReads(t *testing.T) {
k := NewKnowledge()
for i := 1; i < ProgressToLearn; i++ {
if k.AddProgress("改札") || k.ProgressOf("改札") != i || k.Knows("改札") {
t.Fatalf("efter %d framsteg: progress=%d known=%v", i, k.ProgressOf("改札"), k.Knows("改札"))
}
}
if !k.AddProgress("改札") || !k.Knows("改札") || k.ProgressOf("改札") != 0 {
t.Fatal("tredje framsteget ska lära ordet och nollställa framstegen")
}
if k.AddProgress("改札") {
t.Fatal("kända ord får inga framsteg")
}
}
func TestBuyWordsWithPoints(t *testing.T) {
d := testDict()
k := NewKnowledge()
e1, e3 := d.Lookup("改札"), d.Lookup("新宿駅") // tier 1 resp. 3
if WordCost(e1) != 1 || WordCost(e3) != 3 {
t.Fatal("kostnad = tier")
}
if k.CanBuy(e1) || k.Buy(e1) {
t.Fatal("utan poäng ska inget gå att köpa")
}
if got := k.Award(3); got != 3*PointsPerStar || k.Points != got {
t.Fatalf("Award = %d, points=%d", got, k.Points)
}
k.Progress["新宿駅"] = 2
if !k.Buy(e3) || !k.Knows("新宿駅") || k.Points != 0 || k.ProgressOf("新宿駅") != 0 {
t.Fatalf("köp misslyckades: points=%d known=%v", k.Points, k.Knows("新宿駅"))
}
if k.CanBuy(e3) {
t.Fatal("redan känt ord ska inte gå att köpa")
}
if k.Award(-2) != 0 || k.Points != 0 {
t.Fatal("negativa stjärnor ger inget")
}
}