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:
@@ -23,17 +23,13 @@ func (r *ResultScene) Update(g *Game) error {
|
||||
case wordsJustPressed():
|
||||
g.SetScene(NewWordsScene(g.Assets, r))
|
||||
case inpututil_R():
|
||||
s, err := NewLevelScene(g.Assets, r.from.id, g, g.seed())
|
||||
s, err := g.startLevel(r.from.id)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
g.SetScene(s)
|
||||
case confirmJustPressed() || backJustPressed():
|
||||
m, err := NewMenuScene(g.Assets)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
g.SetScene(m)
|
||||
g.SetScene(NewMapScene(g))
|
||||
}
|
||||
return nil
|
||||
}
|
||||
@@ -42,7 +38,7 @@ func (r *ResultScene) Draw(g *Game, screen *ebiten.Image) {
|
||||
r.from.Draw(g, screen) // banan i bakgrunden
|
||||
run := r.from.run
|
||||
a := g.Assets
|
||||
vector.DrawFilledRect(screen, 20, 30, ScreenW-40, 138, colPanel, false)
|
||||
vector.DrawFilledRect(screen, 20, 30, ScreenW-40, 144, colPanel, false)
|
||||
|
||||
accent, headline := colBad, a.T("level.lost")
|
||||
if run.Outcome == sim.Won {
|
||||
@@ -96,6 +92,37 @@ func (r *ResultScene) Draw(g *Game, screen *ebiten.Image) {
|
||||
a.Draw(screen, msg, 28, y, colKnown)
|
||||
y += LineH
|
||||
}
|
||||
if o := r.from.outcome; run.Outcome == sim.Won {
|
||||
prog := fmt.Sprintf("+%d %s", o.XP, a.T("map.xp"))
|
||||
if o.LevelUps > 0 {
|
||||
prog += fmt.Sprintf(" %s %d (+%d %s)", a.T("result.level_up"), g.Progress.Level(), o.LevelUps+o.NewPoints, a.T("map.skill_points"))
|
||||
} else if o.NewPoints > 0 {
|
||||
prog += fmt.Sprintf(" +%d %s", o.NewPoints, a.T("map.skill_points"))
|
||||
}
|
||||
if len(o.NewItems) > 0 {
|
||||
var names []string
|
||||
for _, id := range o.NewItems {
|
||||
names = append(names, g.Catalog.Item(id).Name.Get(UILang))
|
||||
}
|
||||
prog += " " + a.T("result.new_items") + ": " + strings.Join(names, ", ")
|
||||
}
|
||||
if len(o.Unlocked) > 0 {
|
||||
var names []string
|
||||
for _, id := range o.Unlocked {
|
||||
if l := g.LevelByID(id); l != nil {
|
||||
names = append(names, l.Name.Get(UILang))
|
||||
}
|
||||
}
|
||||
prog += " " + a.T("result.unlocked") + ": " + strings.Join(names, ", ")
|
||||
}
|
||||
for i, l := range a.wrapLine(plainLine(prog, colGood), ScreenW-56) {
|
||||
if i > 1 {
|
||||
break
|
||||
}
|
||||
a.drawLines(screen, []line{l}, 28, y)
|
||||
y += LineH
|
||||
}
|
||||
}
|
||||
if len(run.NewDebuffs) > 0 {
|
||||
var parts []string
|
||||
for _, d := range run.NewDebuffs {
|
||||
@@ -104,7 +131,9 @@ func (r *ResultScene) Draw(g *Game, screen *ebiten.Image) {
|
||||
a.Draw(screen, a.T("result.new_debuffs")+": "+strings.Join(parts, ", "), 28, y, colBad)
|
||||
y += LineH
|
||||
}
|
||||
a.Draw(screen, fmt.Sprintf("%s Lv%d %d %s %s %d (%d %s)", a.T("hud.japanese"), run.Know.Level(), run.Know.Count(),
|
||||
a.T("hud.words"), a.T("words.points"), run.Know.Points, run.Know.Helps, a.T("result.helps")), 28, y, colDim)
|
||||
a.Draw(screen, a.T("result.hint"), 28, 155, colDim)
|
||||
if y <= 149 {
|
||||
a.Draw(screen, fmt.Sprintf("%s Lv%d %d %s %s %d (%d %s)", a.T("hud.japanese"), run.Know.Level(), run.Know.Count(),
|
||||
a.T("hud.words"), a.T("words.points"), run.Know.Points, run.Know.Helps, a.T("result.helps")), 28, y, colDim)
|
||||
}
|
||||
a.Draw(screen, a.T("result.hint"), 28, 161, colDim)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user