Inlärning (framsteg, stjärnor, ordlista) och M4: lämmeltåget
All checks were successful
release / build-release (push) Successful in 1m49s
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:
@@ -20,8 +20,8 @@ import (
|
||||
//
|
||||
// wait N vänta N bildrutor
|
||||
// waittrain vänta tills tåget vid perrongen spelaren står på är inne
|
||||
// press KEY tryck enter | esc | r | up | down en bildruta
|
||||
// move DIR N gå N rutor åt up | down | left | right (släpper när rutorna är avklarade)
|
||||
// press KEY tryck enter | esc | r | h | l | up | down en bildruta
|
||||
// move DIR N gå N rutor åt up | down | left | right (stannar exakt där)
|
||||
// shot PATH spara aktuell bild som PNG (intern upplösning × shotScale)
|
||||
// quit avsluta spelet
|
||||
//
|
||||
@@ -29,18 +29,22 @@ import (
|
||||
|
||||
const shotScale = 3
|
||||
|
||||
// moveStallFrames: så många bildrutor utan ny ruta räknas som "vägg" och
|
||||
// avslutar ett move-steg (annars skulle skriptet hänga för evigt).
|
||||
const moveStallFrames = 120
|
||||
|
||||
type scriptStep struct {
|
||||
cmd string
|
||||
arg string
|
||||
n int
|
||||
dir sim.Dir
|
||||
done bool
|
||||
cmd string
|
||||
arg string
|
||||
n int
|
||||
dir sim.Dir
|
||||
}
|
||||
|
||||
type script struct {
|
||||
steps []scriptStep
|
||||
i int
|
||||
counter int
|
||||
stall int
|
||||
lastPos level.Point
|
||||
havePos bool
|
||||
}
|
||||
@@ -108,7 +112,10 @@ func parseDir(s string) sim.Dir {
|
||||
}
|
||||
|
||||
// playerTiler implementeras av scener som har en spelare i rutnätet.
|
||||
type playerTiler interface{ PlayerTile() level.Point }
|
||||
type playerTiler interface {
|
||||
PlayerTile() level.Point
|
||||
PlayerMoving() bool
|
||||
}
|
||||
|
||||
// trainWaiter implementeras av scener där man kan vänta på ett tåg.
|
||||
type trainWaiter interface{ TrainHere() bool }
|
||||
@@ -139,26 +146,39 @@ func (s *script) tick(g *Game, frame *ebiten.Image) error {
|
||||
}
|
||||
cur := pt.PlayerTile()
|
||||
if !s.havePos {
|
||||
s.lastPos, s.havePos = cur, true
|
||||
s.lastPos, s.havePos, s.stall = cur, true, 0
|
||||
}
|
||||
if cur != s.lastPos {
|
||||
s.lastPos = cur
|
||||
s.counter++
|
||||
s.stall = 0
|
||||
} else {
|
||||
s.stall++
|
||||
}
|
||||
if s.counter >= st.n {
|
||||
if s.counter >= st.n && !pt.PlayerMoving() {
|
||||
s.advance()
|
||||
return nil
|
||||
}
|
||||
virtual.held = st.dir
|
||||
if s.stall > moveStallFrames { // blockerad av vägg: ge upp steget
|
||||
s.advance()
|
||||
return nil
|
||||
}
|
||||
// Håll riktningen tills sista rutan har påbörjats; släpp sedan så att
|
||||
// figuren stannar exakt där. Hålls tangenten kvar i ankomstbildrutan
|
||||
// fortsätter figuren annars en ruta till när farten (t.ex. med
|
||||
// sällskapets fartstraff) inte är bildruteexakt.
|
||||
if s.counter < st.n-1 || (s.counter == st.n-1 && !pt.PlayerMoving()) {
|
||||
virtual.held = st.dir
|
||||
}
|
||||
case "waittrain":
|
||||
if tw, ok := g.scene.(trainWaiter); !ok || tw.TrainHere() {
|
||||
s.advance()
|
||||
}
|
||||
case "shot":
|
||||
if err := saveShot(frame, st.arg); err != nil {
|
||||
return err
|
||||
}
|
||||
s.advance()
|
||||
case "waittrain":
|
||||
if tw, ok := g.scene.(trainWaiter); !ok || tw.TrainHere() {
|
||||
s.advance()
|
||||
}
|
||||
case "quit":
|
||||
return ebiten.Termination
|
||||
}
|
||||
@@ -168,6 +188,7 @@ func (s *script) tick(g *Game, frame *ebiten.Image) error {
|
||||
func (s *script) advance() {
|
||||
s.i++
|
||||
s.counter = 0
|
||||
s.stall = 0
|
||||
s.havePos = false
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user