M8: progression, items, bankarta och sparfil
All checks were successful
release / build-release (push) Successful in 1m46s
All checks were successful
release / build-release (push) Successful in 1m46s
- internal/progress: katalog (skills.json 12 noder, items.json 25 items) med validering; XP/nivåer (150·n(n+1)/2) och skillpoäng; skillträd med krav och kostnad; items per plats med buffar, genvägar (JR Pass, kartor, powerbank) och färgton; banresultat och upplåsning (huvudbanor i ordning, sidospår efter föräldern); 33 %-regeln som test - internal/save: versionerad JSON med kunskap, plånbok, debuffar, progression och pågående bana + seed; atomisk skrivning; migrering; ~/.config/metro-puzzle-jp/save.json resp. %AppData% - sim: RunOptions får Extra/FogRadius/Landmarks/FreeGates/RevealAll/ InfiniteBattery; luck påverkar trängselzonen; Fog.RevealAll och extra landmärken - game: bankarta i spelbrädesstil ersätter menyn (⟳ återupptar med sparad seed), skillträd (T), garderob (I), butik i kiosken (B), XP/nivå/items/ upplåsningar på resultatet, spelaren tonas av skins; autospar vid banstart, efter banan och vid köp; flaggor -save/-nosave - level: kind/order/parent/rewards/shop; ny sidobana 002b Kabukicho som belönar skinnet Kimono; 001 belönar Salaryman-skinnet; butikssortiment på 002/003 - tools/shots: demo-sparfil (build/, aldrig den riktiga), bilder av karta, skills, garderob och butik; alla körningar med -nosave - docs/README/wiki uppdaterade Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
@@ -114,7 +114,7 @@ func TestTicketBoardSeededAndAffordable(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestCrowdZoneAndAttempts(t *testing.T) {
|
||||
g := NewCrowd(rng.FromInt(7), 2)
|
||||
g := NewCrowd(rng.FromInt(7), 2, 1)
|
||||
if g.ZoneLo < 0.1 || g.ZoneHi > 0.9 || math.Abs((g.ZoneHi-g.ZoneLo)-crowdZoneWidth) > 1e-9 {
|
||||
t.Fatalf("zon %.2f–%.2f", g.ZoneLo, g.ZoneHi)
|
||||
}
|
||||
@@ -135,7 +135,7 @@ func TestCrowdZoneAndAttempts(t *testing.T) {
|
||||
t.Fatal("träff i zonen ska lyckas")
|
||||
}
|
||||
// Två bom = tåget går.
|
||||
f := NewCrowd(rng.FromInt(7), 2)
|
||||
f := NewCrowd(rng.FromInt(7), 2, 1)
|
||||
for n := 0; n < 2; n++ {
|
||||
for f.InZone() {
|
||||
f.Update(Input{}, frame)
|
||||
@@ -146,7 +146,7 @@ func TestCrowdZoneAndAttempts(t *testing.T) {
|
||||
t.Fatal("två bom ska misslyckas")
|
||||
}
|
||||
// Markören studsar och håller sig i 0..1.
|
||||
b := NewCrowd(rng.FromInt(8), 1)
|
||||
b := NewCrowd(rng.FromInt(8), 1, 1)
|
||||
for i := 0; i < 600; i++ {
|
||||
b.Update(Input{}, frame)
|
||||
if b.Pos < 0 || b.Pos > 1 {
|
||||
@@ -293,3 +293,16 @@ func TestSeatSelectionPreferences(t *testing.T) {
|
||||
t.Fatal("avbrutet sittplatsval = inget köp")
|
||||
}
|
||||
}
|
||||
|
||||
func TestCrowdLuckWidensZone(t *testing.T) {
|
||||
normal := NewCrowd(rng.FromInt(3), 2, 1)
|
||||
lucky := NewCrowd(rng.FromInt(3), 2, 1.5)
|
||||
unlucky := NewCrowd(rng.FromInt(3), 2, 0.5)
|
||||
if lucky.ZoneHi-lucky.ZoneLo <= normal.ZoneHi-normal.ZoneLo || unlucky.ZoneHi-unlucky.ZoneLo >= normal.ZoneHi-normal.ZoneLo {
|
||||
t.Fatal("tur ska ge bredare zon, otur smalare")
|
||||
}
|
||||
huge := NewCrowd(rng.FromInt(3), 2, 100)
|
||||
if huge.ZoneHi-huge.ZoneLo > 0.6+1e-9 || huge.ZoneHi > 0.9+1e-9 {
|
||||
t.Fatal("zonen klampas")
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user