Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 15x 15x 15x 15x 385x 385x 15x 15x 15x 15x 15x 15x 15x 15x 15x 15x 86x 86x 86x 86x 86x 86x 86x 86x 86x 86x 66x 66x 66x 86x 20x 20x 20x 86x 86x 86x 86x 86x 86x 86x 86x 86x 86x 86x 86x 15x 15x 15x 86x 86x 86x 86x 86x 86x 86x 86x 86x 86x 86x 15x 15x 15x | /**
* Geographic landmarks for Steam Train Journey
* Landmarks add visual variety to the landscape based on route themes
*/
export interface Landmark {
emoji: string
position: number // 0-100% along track
offset: { x: number; y: number } // Offset from track position
size: number // Font size multiplier
}
/**
* Generate landmarks for a specific route
* Different route themes have different landmark types
*/
export function generateLandmarks(routeNumber: number): Landmark[] {
const seed = routeNumber * 456.789
// Deterministic randomness for landmark placement
const random = (index: number) => {
return Math.abs(Math.sin(seed + index * 2.7))
}
const landmarks: Landmark[] = []
// Route theme determines landmark types
const themeIndex = (routeNumber - 1) % 10
// Generate 4-6 landmarks along the route
const landmarkCount = Math.floor(random(0) * 3) + 4
for (let i = 0; i < landmarkCount; i++) {
const position = (i + 1) * (100 / (landmarkCount + 1))
const offsetSide = random(i) > 0.5 ? 1 : -1
const offsetDistance = 30 + random(i + 10) * 40
let emoji = 'ðģ' // Default tree
let size = 24
// Choose emoji based on theme and position
switch (themeIndex) {
case 0: // Prairie Express
emoji = random(i) > 0.6 ? 'ðū' : 'ðŧ'
size = 20
break
case 1: // Mountain Climb
emoji = random(i) > 0.5 ? 'â°ïļ' : 'ðŧ'
size = 32
break
case 2: // Coastal Run
emoji = random(i) > 0.7 ? 'ð' : random(i) > 0.4 ? 'ðïļ' : 'âĩ'
size = 24
break
case 3: // Desert Crossing
emoji = random(i) > 0.6 ? 'ðĩ' : 'ðïļ'
size = 28
break
case 4: // Forest Trail
emoji = random(i) > 0.7 ? 'ðē' : random(i) > 0.4 ? 'ðģ' : 'ðĶ'
size = 26
break
case 5: // Canyon Route
emoji = random(i) > 0.5 ? 'ðïļ' : 'ðŠĻ'
size = 30
break
case 6: // River Valley
emoji = random(i) > 0.6 ? 'ð' : random(i) > 0.3 ? 'ðģ' : 'ðĶ'
size = 24
break
case 7: // Highland Pass
emoji = random(i) > 0.6 ? 'ðŧ' : 'âïļ'
size = 28
break
case 8: // Lakeside Journey
emoji = random(i) > 0.7 ? 'ðïļ' : random(i) > 0.4 ? 'ðģ' : 'ðĶĒ'
size = 26
break
case 9: // Grand Circuit
emoji = random(i) > 0.7 ? 'ðŠ' : random(i) > 0.4 ? 'ðĄ' : 'ð '
size = 28
break
}
// Add bridges at specific positions (around 40-60%)
if (position > 40 && position < 60 && random(i + 20) > 0.7) {
emoji = 'ð'
size = 36
}
landmarks.push({
emoji,
position,
offset: {
x: offsetSide * offsetDistance,
y: random(i + 5) * 20 - 10,
},
size,
})
}
return landmarks
}
|