All files / web/src/app/arcade/complement-race/lib landmarks.ts

76.69% Statements 79/103
57.14% Branches 12/21
100% Functions 2/2
76.69% Lines 79/103

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 1041x 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
}