98 lines
2.8 KiB
JavaScript
98 lines
2.8 KiB
JavaScript
(() => {
|
|
const { Bodies, Body } = Matter;
|
|
const scenes = (window.PhysilinksSceneDefs =
|
|
window.PhysilinksSceneDefs || []);
|
|
|
|
const makeCurveSegments = (cx, h, amp, thickness, segments) => {
|
|
const segs = [];
|
|
const stepY = h / segments;
|
|
let prevX = cx;
|
|
let prevY = 0;
|
|
for (let i = 0; i < segments; i += 1) {
|
|
const y = stepY * (i + 1);
|
|
const t = y / h;
|
|
const x = cx + Math.sin(t * Math.PI * 1.5) * amp;
|
|
const dx = x - prevX;
|
|
const dy = y - prevY;
|
|
const len = Math.max(1, Math.sqrt(dx * dx + dy * dy));
|
|
const angle = Math.atan2(dy, dx);
|
|
segs.push(
|
|
Bodies.rectangle((prevX + x) / 2, (prevY + y) / 2, thickness, len, {
|
|
isStatic: true,
|
|
angle,
|
|
render: { fillStyle: "#14213a", strokeStyle: "#14213a" },
|
|
plugin: { curve: true },
|
|
}),
|
|
);
|
|
prevX = x;
|
|
prevY = y;
|
|
}
|
|
return segs;
|
|
};
|
|
|
|
scenes.push({
|
|
id: "scene-lava",
|
|
name: "Lava drift",
|
|
config: {
|
|
gravity: -0.1,
|
|
spawnIntervalMs: 180,
|
|
spawnFrom: "bottom",
|
|
autoSpawn: true,
|
|
minChain: 3,
|
|
palette: ["#f472b6", "#38bdf8", "#fbbf24", "#a855f7", "#22c55e"],
|
|
ballRadius: 26,
|
|
blobBalls: true,
|
|
winCondition: {
|
|
type: "score",
|
|
target: 25000,
|
|
onWin: { setGravity: -0.55, removeCurves: true },
|
|
nextSceneId: "scene-grid",
|
|
},
|
|
link: {
|
|
stiffness: 0.7,
|
|
lengthScale: 1.05,
|
|
damping: 0.12,
|
|
lineWidth: 3,
|
|
rope: true,
|
|
renderType: "line",
|
|
maxLengthMultiplier: 4.8,
|
|
},
|
|
},
|
|
createBodies: (w, h) => {
|
|
const wallThickness = Math.max(24, w * 0.05);
|
|
const amp = Math.max(40, w * 0.08);
|
|
const segments = 12;
|
|
const curves = [
|
|
...makeCurveSegments(w * 0.33, h, amp, wallThickness, segments),
|
|
...makeCurveSegments(w * 0.67, h, amp * 0.95, wallThickness, segments),
|
|
];
|
|
|
|
// Gentle paddles that sway slightly
|
|
/*
|
|
const paddleWidth = Math.max(120, w * 0.18);
|
|
const paddleHeight = Math.max(12, h * 0.018);
|
|
const paddles = [
|
|
Bodies.rectangle(w * 0.45, h * 0.65, paddleWidth, paddleHeight, {
|
|
isStatic: true,
|
|
angle: -0.08,
|
|
render: { fillStyle: "#0ea5e9", strokeStyle: "#0ea5e9" },
|
|
plugin: {
|
|
oscillate: { axis: "x", amplitude: w * 0.05, speed: 0.7 },
|
|
},
|
|
}),
|
|
Bodies.rectangle(w * 0.58, h * 0.4, paddleWidth * 0.85, paddleHeight, {
|
|
isStatic: true,
|
|
angle: 0.12,
|
|
render: { fillStyle: "#f59e0b", strokeStyle: "#f59e0b" },
|
|
plugin: {
|
|
oscillate: { axis: "x", amplitude: w * 0.04, speed: 1.0 },
|
|
},
|
|
}),
|
|
];
|
|
*/
|
|
|
|
return [...curves];
|
|
},
|
|
});
|
|
})();
|