Mobile menu

Low Carb Run

Z dziennika pokładowego Jony.

Ekspres do kawy był jedyną rzeczą do naprawy.
Teraz kapsuła skacze po planetach.
A ja próbuję znaleźć coś do jedzenia bez cukru.

Kim jesteś, Jono?

Wybierz swojego towarzysza misji.

Punkty: 0
Czas: 20

Misja zakończona

Dzięki.
Kolejny dzień w kapsule bez cukrowej katastrofy.

Twój wynik: 0 pkt

LowStyleLife

'use strict'; // ============================================ // Stan gry // ============================================ const state = { screen: 'startScreen', playerAvatar: null, score: 0, combo: 0, planet: 0, timeLeft: 0, timerId: null, }; // ============================================ // Referencje do ekranów // ============================================ const screens = { startScreen: document.getElementById('startScreen'), avatarScreen: document.getElementById('avatarScreen'), gameScreen: document.getElementById('gameScreen'), resultScreen: document.getElementById('resultScreen'), }; // ============================================ // MODUŁ 2/3 — Nawigacja ekranów // ============================================ function showScreen(name) { Object.values(screens).forEach(s => s.classList.remove('active')); screens[name].classList.add('active'); state.screen = name; } // ============================================ // MODUŁ 5 — System punktów // ============================================ function addScore(points) { const multiplier = 1 + Math.floor(state.combo / 3) * 0.5; const earned = Math.round(points * multiplier); state.score += earned; updateScoreDisplay(); showFloatingText(earned > 0 ? `+${earned}` : `${earned}`, earned > 0 ? 'plus' : 'minus'); } function increaseCombo() { state.combo++; updateScoreDisplay(); } function resetCombo() { state.combo = 0; updateScoreDisplay(); } function updateScoreDisplay() { const scoreEl = document.getElementById('scoreValue'); const comboEl = document.getElementById('comboValue'); if (scoreEl) scoreEl.textContent = state.score; if (comboEl) comboEl.textContent = state.combo > 1 ? `x${state.combo} combo!` : ''; } function showFloatingText(text, type) { const el = document.createElement('div'); el.className = `floating-text ${type}`; el.textContent = text; document.getElementById('gameScreen').appendChild(el); setTimeout(() => el.remove(), 900); } // ============================================ // MODUŁ 6 — Produkty // ============================================ const GOOD = [ { emoji: '🥑', name: 'Awokado', points: 10 }, { emoji: '🧀', name: 'Ser', points: 10 }, { emoji: '🥦', name: 'Brokuł', points: 10 }, { emoji: '🍅', name: 'Pomidor', points: 8 }, { emoji: '🍓', name: 'Truskawka', points: 8 }, ]; const BAD = [ { emoji: '🍬', name: 'Cukierek', points: -15 }, { emoji: '🍪', name: 'Ciastko', points: -15 }, { emoji: '🍫', name: 'Baton', points: -15 }, { emoji: '🥤', name: 'Napój gaz.', points: -15 }, { emoji: '🍩', name: 'Pączek', points: -15 }, ]; function spawnProducts() { const field = document.getElementById('gameField'); field.innerHTML = ''; const all = [...GOOD, ...GOOD, ...BAD, ...BAD] .sort(() => Math.random() - 0.5) .slice(0, 12); all.forEach((product, i) => { const btn = document.createElement('button'); btn.className = 'product-btn'; btn.innerHTML = ` ${product.emoji} ${product.name}`; btn.style.animationDelay = `${i * 0.05}s`; btn.addEventListener('click', () => { if (btn.classList.contains('clicked')) return; btn.classList.add('clicked'); if (product.points > 0) { increaseCombo(); addScore(product.points); btn.classList.add('good'); showJonaComment(state.combo >= 3 ? 'combo' : 'good'); } else { resetCombo(); addScore(product.points); btn.classList.add('bad'); showJonaComment('bad'); } setTimeout(() => btn.remove(), 400); }); field.appendChild(btn); }); } // ============================================ // MODUŁ 8 — Komentarze Jony // ============================================ const JONA_COMMENTS = { good: [ 'Ten brokuł wygląda podejrzanie świeżo. Biorę.', 'Ser. Mój jedyny przyjaciel w kosmosie.', 'Awokado na planecie bez grawitacji. Logiczne.', 'Pomidor! Czyli jednak nie wszystko tu chce mnie zabić.', 'Truskawka. Mały cud bez syropu.', ], bad: [ 'To nie jest awokado. To cukier w przebraniu.', 'Pączek? Szef musiał tu być przede mną.', 'Baton energetyczny. Energia dla kogo, nie dla mnie.', 'Napój gazowany. Kosmos i tak już wystarczająco bąbelkuje.', 'Cukierek. Ładny. Zdradziecko ładny.', ], combo: [ 'Lecę przez tę planetę jak po własnej kuchni.', 'Trzy z rzędu. Jona wchodzi w rytm.', 'Combo rośnie. Kapsuła jest ze mnie dumna.', ], urgent: [ 'Zaraz odlot. Szybciej!', 'Kapsuła czeka. Ja też.', 'Pięć sekund. Skupiam się.', ], }; let jonaTimer = null; function showJonaComment(type) { const pool = JONA_COMMENTS[type]; if (!pool) return; const text = pool[Math.floor(Math.random() * pool.length)]; const el = document.getElementById('jonaComment'); if (!el) return; el.textContent = ''; clearTimeout(jonaTimer); // lekkie opóźnienie żeby nie zasłaniać animacji punktów jonaTimer = setTimeout(() => { el.textContent = `— ${text}`; el.classList.add('visible'); jonaTimer = setTimeout(() => { el.classList.remove('visible'); }, 3000); }, 200); } function startTimer() { state.timeLeft = 20; updateTimerDisplay(); if (state.timerId) clearInterval(state.timerId); state.timerId = setInterval(() => { state.timeLeft--; updateTimerDisplay(); if (state.timeLeft <= 5) { document.getElementById('timerValue').classList.add('timer-urgent'); if (state.timeLeft === 5) showJonaComment('urgent'); } if (state.timeLeft <= 0) { endLevel(); } }, 1000); } function updateTimerDisplay() { const el = document.getElementById('timerValue'); if (el) el.textContent = state.timeLeft; } function endLevel() { clearInterval(state.timerId); state.timerId = null; document.getElementById('gameField').innerHTML = ''; showResult(); showScreen('resultScreen'); } // ============================================ // MODUŁ 12 — Ekran końcowy // ============================================ const RESULT_QUOTES = [ 'Dzięki.\nKolejny dzień w kapsule bez cukrowej katastrofy.', 'Kapsuła ląduje.\nA lodówka na pokładzie wciąż bez cukru.', 'Misja zaliczona.\nJona: 1, Słodycze: 0.', 'Przeżyłam tę planetę.\nI nie zjadłam ani jednego pączka.', ]; function getrank(score) { if (score >= 80) return { label: '🚀 Kosmiczny wynik!', cls: 'rank-gold' }; if (score >= 50) return { label: '🥑 Solidna misja', cls: 'rank-silver' }; if (score >= 20) return { label: '🌿 Dobry start', cls: 'rank-olive' }; return { label: '🍬 Cukier atakował…', cls: 'rank-muted' }; } function showResult() { const avatar = state.playerAvatar; document.getElementById('resultAvatar').textContent = avatar ? avatar.emoji : '🚀'; document.getElementById('resultScore').textContent = state.score; const quote = RESULT_QUOTES[Math.floor(Math.random() * RESULT_QUOTES.length)]; document.getElementById('resultQuote').innerHTML = quote.replace('\n', '
'); const rank = getrank(state.score); const rankEl = document.getElementById('resultRank'); rankEl.textContent = rank.label; rankEl.className = `result-rank mt-2 ${rank.cls}`; } // ============================================ // Start poziomu // ============================================ function startCollectLevel() { state.score = 0; state.combo = 0; updateScoreDisplay(); spawnProducts(); startTimer(); } // ============================================ // MODUŁ 1 — Inicjalizacja // ============================================ function init() { console.log('Low Carb Run — start'); showScreen('startScreen'); document.getElementById('btnStart').addEventListener('click', () => { showScreen('avatarScreen'); }); document.querySelectorAll('.avatar-btn').forEach(btn => { btn.addEventListener('click', () => { document.querySelectorAll('.avatar-btn').forEach(b => b.classList.remove('selected')); btn.classList.add('selected'); state.playerAvatar = { emoji: btn.dataset.avatar, name: btn.dataset.name }; document.getElementById('btnGoGame').disabled = false; }); });

To Katalog SEO                            

https://katalogseo.net.pl     

Website created in white label responsive website builder WebWave.