42 lines
1.6 KiB
JavaScript
42 lines
1.6 KiB
JavaScript
import { WORLD_SCALE } from '../../config.js';
|
|
|
|
// Hand-tuned profile: flat approach -> steep valley drop -> steep climb out ->
|
|
// a long stretch of tight, fast bumps that punish sloppy lean control.
|
|
function buildPoints() {
|
|
const step = 60 * WORLD_SCALE;
|
|
const points = [];
|
|
for (let x = -200 * WORLD_SCALE; x <= 3900 * WORLD_SCALE; x += step) {
|
|
let y;
|
|
if (x < 1200 * WORLD_SCALE) {
|
|
y = 420 * WORLD_SCALE + Math.sin(x / (500 * WORLD_SCALE)) * 10 * WORLD_SCALE;
|
|
} else if (x < 1500 * WORLD_SCALE) {
|
|
y = 420 * WORLD_SCALE + 220 * WORLD_SCALE * ((x - 1200 * WORLD_SCALE) / (300 * WORLD_SCALE));
|
|
} else if (x < 1650 * WORLD_SCALE) {
|
|
y = 640 * WORLD_SCALE;
|
|
} else if (x < 1950 * WORLD_SCALE) {
|
|
y = 640 * WORLD_SCALE - 260 * WORLD_SCALE * ((x - 1650 * WORLD_SCALE) / (300 * WORLD_SCALE));
|
|
} else if (x < 3650 * WORLD_SCALE) {
|
|
y = 380 * WORLD_SCALE + Math.sin(x / (150 * WORLD_SCALE)) * 45 * WORLD_SCALE;
|
|
} else {
|
|
y = 380 * WORLD_SCALE;
|
|
}
|
|
points.push({ x, y: Math.round(y) });
|
|
}
|
|
return points;
|
|
}
|
|
|
|
const END_X = 3900 * WORLD_SCALE;
|
|
|
|
export default {
|
|
id: 'level03',
|
|
name: 'Tight Squeeze',
|
|
description: 'A steep valley and a long run of sharp bumps - lean early, lean often.',
|
|
kidsAboard: 4,
|
|
startPosition: { x: 100 * WORLD_SCALE, y: 350 * WORLD_SCALE },
|
|
startAngle: 0,
|
|
terrain: [{ points: buildPoints() }],
|
|
obstacles: [],
|
|
goal: { x: END_X - 120 * WORLD_SCALE, y: 260 * WORLD_SCALE, width: 140 * WORLD_SCALE, height: 400 * WORLD_SCALE },
|
|
cameraBounds: { x: -300 * WORLD_SCALE, y: 0, width: END_X + 700 * WORLD_SCALE, height: 1000 * WORLD_SCALE },
|
|
};
|