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:
@@ -29,11 +29,13 @@ const (
|
||||
Gate Tile = 'G' // spärr (kräver kort/biljett)
|
||||
TicketMachine Tile = 'T' // biljett-/påfyllningsautomat
|
||||
Sign Tile = 'i' // skylt
|
||||
Toilet Tile = 'W' // toalett (sällskapets toamätare)
|
||||
Kiosk Tile = 'K' // kiosk/automat för mat och dryck
|
||||
)
|
||||
|
||||
var knownTiles = map[Tile]bool{
|
||||
Wall: true, Floor: true, Spawn: true, Platform: true, WrongPlatform: true,
|
||||
Gate: true, TicketMachine: true, Sign: true,
|
||||
Gate: true, TicketMachine: true, Sign: true, Toilet: true, Kiosk: true,
|
||||
}
|
||||
|
||||
// Passable rapporterar om en ruta går att gå på (utan hänsyn till spärrar).
|
||||
@@ -69,6 +71,7 @@ const (
|
||||
DefaultIntervalSec = 30.0
|
||||
DefaultDwellSec = 10.0
|
||||
DefaultFareYen = 200
|
||||
MaxParty = 5
|
||||
)
|
||||
|
||||
// Status returnerar om tåget står vid perrongen vid tiden t, och hur många
|
||||
@@ -108,6 +111,8 @@ type Level struct {
|
||||
Difficulty int `json:"difficulty"` // 1 (lätt) … 5 (svår)
|
||||
Destination Text `json:"destination"` // dit spelaren ska
|
||||
TimeLimitSec int `json:"timeLimitSec"` // 0 = ingen tidsgräns
|
||||
ParSec int `json:"parSec"` // "bra tid" för tre stjärnor (0 = räknas ut från kortaste vägen)
|
||||
Party int `json:"party"` // antal i sällskapet inkl. spelaren (0 = 1)
|
||||
FareYen int `json:"fareYen"` // vad spärren drar från kortet (0 = standard)
|
||||
Grid []string `json:"grid"`
|
||||
Trains []Train `json:"trains"`
|
||||
@@ -229,8 +234,14 @@ func (l *Level) Validate() error {
|
||||
if l.FareYen == 0 {
|
||||
l.FareYen = DefaultFareYen
|
||||
}
|
||||
if l.FareYen < 0 {
|
||||
return fmt.Errorf("level %s: negativ avgift", l.ID)
|
||||
if l.FareYen < 0 || l.ParSec < 0 || l.Party < 0 {
|
||||
return fmt.Errorf("level %s: negativ avgift/partid/sällskap", l.ID)
|
||||
}
|
||||
if l.Party == 0 {
|
||||
l.Party = 1
|
||||
}
|
||||
if l.Party > MaxParty {
|
||||
return fmt.Errorf("level %s: sällskapet får vara högst %d", l.ID, MaxParty)
|
||||
}
|
||||
// Skyltar: varje post måste stå på en 'i'-ruta och varje 'i'-ruta ha text.
|
||||
seen := map[Point]bool{}
|
||||
@@ -369,7 +380,7 @@ func (l *Level) UngatedPlatforms() []Point {
|
||||
func (l *Level) Unreachable() []Point {
|
||||
reach := l.Reachable()
|
||||
var out []Point
|
||||
for _, t := range []Tile{Platform, WrongPlatform, TicketMachine, Sign, Gate} {
|
||||
for _, t := range []Tile{Platform, WrongPlatform, TicketMachine, Sign, Gate, Toilet, Kiosk} {
|
||||
for _, p := range l.Find(t) {
|
||||
if !reach[p] {
|
||||
out = append(out, p)
|
||||
@@ -379,6 +390,24 @@ func (l *Level) Unreachable() []Point {
|
||||
return out
|
||||
}
|
||||
|
||||
// BoardText är avgångstavlans text på japanska, t.ex. "2番線 成田エクスプレス 新宿方面".
|
||||
func (tr *Train) BoardText() string {
|
||||
return tr.Track + "番線 " + tr.Line.Get("ja") + " " + tr.Destination.Get("ja") + "方面"
|
||||
}
|
||||
|
||||
// CorrectPlatform returnerar en perrongruta med rätt tåg (valideringen
|
||||
// garanterar att det finns minst ett rätt tåg vid en befintlig perrong).
|
||||
func (l *Level) CorrectPlatform() Point {
|
||||
for _, tr := range l.Trains {
|
||||
if tr.Correct {
|
||||
if pts := l.Find(Tile(tr.Platform[0])); len(pts) > 0 {
|
||||
return pts[0]
|
||||
}
|
||||
}
|
||||
}
|
||||
return l.SpawnPoint()
|
||||
}
|
||||
|
||||
// CanEnter rapporterar om rutan går att gå in på (för sim.Mover).
|
||||
func (l *Level) CanEnter(p Point) bool { return l.At(p.X, p.Y).Passable() }
|
||||
|
||||
|
||||
Reference in New Issue
Block a user