feat: gambling (coinflip & slots)

This commit is contained in:
Face 2025-05-29 14:12:27 +03:00
parent 543a5a951c
commit 1cae171748
38 changed files with 5631 additions and 1 deletions

View file

@ -231,4 +231,101 @@ export function getTimeframeInSeconds(timeframe: string): number {
}
}
//
let availableSounds = [1, 2, 3, 4, 5, 6, 7];
export function playRandomFireworkSound() {
// If no sounds available, reset the array
if (availableSounds.length === 0) {
availableSounds = [1, 2, 3, 4, 5, 6, 7];
}
// Pick a random sound from available ones
const randomIndex = Math.floor(Math.random() * availableSounds.length);
const soundNumber = availableSounds[randomIndex];
// Remove the sound from available array to prevent repetition
availableSounds = availableSounds.filter((_, index) => index !== randomIndex);
playSound(`firework${soundNumber}`);
}
export function playSound(sound: string) {
try {
const audio = new Audio(`sound/${sound}.mp3`);
audio.volume = 0.3; // TODO: volume control
audio.play().catch(console.error);
} catch (error) {
console.error('Error playing sound:', error);
}
}
export function showConfetti(confetti: any) {
const duration = 2 * 1000;
const animationEnd = Date.now() + duration;
const defaults = { startVelocity: 30, spread: 360, ticks: 60, zIndex: 0 };
function randomInRange(min: number, max: number) {
return Math.random() * (max - min) + min;
}
playRandomFireworkSound();
const interval = setInterval(function () {
const timeLeft = animationEnd - Date.now();
if (timeLeft <= 0) {
return clearInterval(interval);
}
const particleCount = 50 * (timeLeft / duration);
confetti({
...defaults,
particleCount,
origin: { x: randomInRange(0.1, 0.3), y: Math.random() - 0.2 }
});
confetti({
...defaults,
particleCount,
origin: { x: randomInRange(0.7, 0.9), y: Math.random() - 0.2 }
});
if (Math.floor(timeLeft / 500) !== Math.floor((timeLeft - 250) / 500)) {
playRandomFireworkSound();
}
}, 250);
}
export function showSchoolPrideCannons(confetti: any) {
const end = Date.now() + (3 * 1000);
const colors = ['#bb0000', '#ffffff'];
playSound('cannon');
playSound('win');
setTimeout(() => {
playSound('cannon');
}, 100);
(function frame() {
confetti({
particleCount: 2,
angle: 60,
spread: 55,
origin: { x: 0 },
colors: colors
});
confetti({
particleCount: 2,
angle: 120,
spread: 55,
origin: { x: 1 },
colors: colors
});
if (Date.now() < end) {
requestAnimationFrame(frame);
}
}());
}
export const formatMarketCap = formatValue;