M9a: stationer i flera våningar med trappor
All checks were successful
release / build-release (push) Successful in 1m34s
All checks were successful
release / build-release (push) Successful in 1m34s
- level: Point har Z; banor kan ha floors (lika stora rutnät med namn), gamla grid-banor läses som en våning; trappor U/D på samma x,y en våning upp/ner valideras parvis; Neighbors ger grannar över våningar så att Path, lösbarhet, spärregel och Unreachable fungerar; skyltar har z - sim: att kliva på en trappa flyttar spelaren till andra änden (FloorChanges); dimman är per våning och avslöjar trappans andra ände; tåg hörs/syns bara på egen våning - game: bara spelarens våning ritas (följare på andra våningar döljs), HUD och minikarta visar våningens namn, trappgrafik i genart och färg på minikartan - bana 004 Tokyo (svårighet 3, tre i sällskapet): start under mark på B1, trappa upp till 1F med perronger; generatorn gör våningar med trappor som flaskhalsar; ordboken utökad - testbotar och tools/shots förstår trappor; två våningsbilder - docs/README/wiki uppdaterade Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
@@ -47,6 +47,8 @@ type Run struct {
|
||||
Progressed []string // ord som fick framsteg vid senaste läsningen, "ord n/3"
|
||||
ProgressedAt float64 // < 0 = aldrig
|
||||
|
||||
FloorChanges int // antal trappbyten (statistik)
|
||||
|
||||
// Resultat när banan vunnits.
|
||||
Stars int // 1–3 efter tid mot par
|
||||
PointsEarned int // språkpoäng
|
||||
@@ -266,7 +268,7 @@ func (r *Run) StarsFor(t float64) int {
|
||||
// kräver biljett (på biljettbanor) eller ett användbart kort med saldo (att
|
||||
// gå mellan två spärrutor är gratis).
|
||||
func (r *Run) CanEnter(p level.Point) bool {
|
||||
t := r.Level.At(p.X, p.Y)
|
||||
t := r.Level.At(p)
|
||||
if !t.Passable() {
|
||||
return false
|
||||
}
|
||||
@@ -315,7 +317,7 @@ func (r *Run) MembersWithoutFare() []*Member {
|
||||
}
|
||||
|
||||
func (r *Run) inGate() bool {
|
||||
return r.Level.At(r.Player.Tile.X, r.Player.Tile.Y) == level.Gate
|
||||
return r.Level.At(r.Player.Tile) == level.Gate
|
||||
}
|
||||
|
||||
// Step för banan framåt dt sekunder. want är hållen riktning, board=true
|
||||
@@ -342,6 +344,18 @@ func (r *Run) Step(dt float64, want Dir, board bool) {
|
||||
}
|
||||
r.Steps += r.Player.Step(dt, want, r.CanEnter)
|
||||
if r.Player.Tile != before {
|
||||
// Trappa: hamnar man på en trappruta flyttas man till andra änden
|
||||
// (samma x, y, en våning upp eller ner) och fortsätter därifrån.
|
||||
switch r.Level.At(r.Player.Tile) {
|
||||
case level.StairsUp:
|
||||
r.Player.Tile = r.Player.Tile.Up()
|
||||
r.Player.Target = r.Player.Tile
|
||||
r.FloorChanges++
|
||||
case level.StairsDown:
|
||||
r.Player.Tile = r.Player.Tile.Down()
|
||||
r.Player.Target = r.Player.Tile
|
||||
r.FloorChanges++
|
||||
}
|
||||
r.Party.OnLeaderArrived(r.Player.Tile)
|
||||
r.Fog.Reveal(r.Level, r.Player.Tile)
|
||||
}
|
||||
@@ -372,7 +386,7 @@ func (r *Run) Step(dt float64, want Dir, board bool) {
|
||||
}
|
||||
}
|
||||
if board && !r.Player.Moving() {
|
||||
switch r.Level.At(r.Player.Tile.X, r.Player.Tile.Y) {
|
||||
switch r.Level.At(r.Player.Tile) {
|
||||
case level.Toilet:
|
||||
r.useToilet()
|
||||
case level.Kiosk:
|
||||
@@ -652,7 +666,7 @@ func (r *Run) FacilityProgress() float64 {
|
||||
// spelaren inte står på en perrong), om det är inne, och sekunder kvar
|
||||
// till avgång respektive ankomst.
|
||||
func (r *Run) PlatformHere() (tr *level.Train, atPlatform bool, seconds float64) {
|
||||
t := r.Level.At(r.Player.Tile.X, r.Player.Tile.Y)
|
||||
t := r.Level.At(r.Player.Tile)
|
||||
if t != level.Platform && t != level.WrongPlatform {
|
||||
return nil, false, 0
|
||||
}
|
||||
@@ -679,6 +693,9 @@ func (r *Run) NearTrack(maxDist int) (tr *level.Train, platform level.Point, pha
|
||||
best := maxDist + 1
|
||||
for _, t := range []level.Tile{level.Platform, level.WrongPlatform} {
|
||||
for _, p := range r.Level.Find(t) {
|
||||
if p.Z != r.Player.Tile.Z {
|
||||
continue // man ser och hör bara tågen på sin egen våning
|
||||
}
|
||||
d := max(abs(p.X-r.Player.Tile.X), abs(p.Y-r.Player.Tile.Y))
|
||||
if d < best {
|
||||
if cand := r.Level.TrainAt(t); cand != nil {
|
||||
|
||||
Reference in New Issue
Block a user