Ładowanie skinów...
Pobieram dane ze Steam CDN
NA ŻYWO
Najlepsza platforma do otwierania skrzynek 2026

Otwieraj Skrzynki
Wygrywaj Najlepsze Skiny

Otrzymaj 100 zł na start i otwieraj skrzynki ze skinami CS:GO. Co 15 minut darmowe doładowanie!

2.5M+
Otwartych skrzynek
150K+
Aktywnych graczy
99.9%
Wypłacalność
📦
💎
🔪
🎯

Skrzynki Do Otwarcia

Wybierz skrzynkę i wygraj wyjątkowe skiny

Jak to Działa?

01
💳

Otrzymaj 100 zł

Każdy nowy gracz dostaje 100 zł na start. Co 15 minut darmowe +50 zł.

02
📦

Wybierz skrzynkę

12 skrzynek w różnych cenach. Każda zawiera unikatowe skiny ze Steam CDN.

03
🎁

Otwórz i wygraj

Otwórz skrzynkę i odbierz swój skin lub sprzedaj go za realną cenę.

04

Upgrade skinów

Ulepszaj swoje skiny na droższe — zaryzykuj dla większej nagrody!

// ========================================================================== // ⚔️ ULEPSZONE BITWY (BATTLES) - PurpleCase v2 // Ulepszenia: // 1. GUI wyboru bota (9 polskich nazw) zamiast automatycznego dodawania // 2. Zwycięzca wygrywa skiny WSZYSTKICH graczy z tej bitwy // 3. Po stworzeniu bitwy → przekierowanie do widoku bitwy // 4. Wygląd wzorowany na screenie G4Skins + styl strony // 5. Bitwy znikają po 30s (lub historii dla własnych) // 6. Historia bitew (własnych) obok przycisku "Stwórz bitwę" // ========================================================================== const BATTLES = []; let battleFilter = 'all'; const battleHistory = []; // tylko własne zakończone bitwy // 9 polskich nazw botów const BOT_NAMES_PL = [ 'Marek_PL', 'Bartek99', 'Szymon_Pro', 'Karol_FPV', 'Dawid_CSer', 'Tomasz_GG', 'Piotrek_AK', 'Krzysiek_L', 'Radek_1vs1' ]; const BOT_AVATARS = ['🐺','🦊','🐻','🐯','🦁','🐸','🦅','🐉','👾']; function generateBattleId() { return 'BATTLE' + Date.now().toString(16).toUpperCase() + Math.random().toString(36).substr(2,4).toUpperCase(); } function getBattleCost(battle) { return battle.cases.reduce((sum, c) => sum + c.price, 0); } // Cleanup bitew starszych niż 30s function cleanupOldBattles() { const now = Date.now(); for (let i = BATTLES.length - 1; i >= 0; i--) { const b = BATTLES[i]; if (b.status === 'finished' && now - b.finishedAt > 30000) { const hasMe = b.players.some(p => p.isMe); if (hasMe && !battleHistory.find(h => h.id === b.id)) { battleHistory.unshift(b); } BATTLES.splice(i, 1); } } } // Inicjalizacja function initBattles() { const createBtn = document.getElementById('createBattleBtn'); if (createBtn) createBtn.onclick = openBattleCreator; const historyBtn = document.getElementById('battleHistoryBtn'); if (historyBtn) historyBtn.onclick = openBattleHistoryModal; document.querySelectorAll('.battle-filter-btn').forEach(btn => { btn.onclick = () => { document.querySelectorAll('.battle-filter-btn').forEach(b => b.classList.remove('active')); btn.classList.add('active'); battleFilter = btn.dataset.bf; renderBattlesList(); }; }); seedDemoBattles(); renderBattlesList(); // Cleanup co 5 sekund setInterval(() => { cleanupOldBattles(); renderBattlesList(); }, 5000); } function seedDemoBattles() { if (BATTLES.length > 0 || !Array.isArray(CASES) || CASES.length === 0) return; const c1 = CASES[Math.floor(Math.random() * CASES.length)]; const c2 = CASES[Math.floor(Math.random() * CASES.length)]; BATTLES.push({ id: generateBattleId(), mode: 'normal', cases: [c1, c1], players: [{ name: FAKE_USERNAMES[0], bot: false, isMe: false, items: [] }], maxPlayers: 2, status: 'waiting', createdAt: Date.now() }); BATTLES.push({ id: generateBattleId(), mode: 'underdog', cases: [c2, c2, c2], players: [{ name: FAKE_USERNAMES[1], bot: false, isMe: false, items: [] }], maxPlayers: 3, status: 'waiting', createdAt: Date.now() }); } function getFilteredBattles() { if (battleFilter === 'all') return BATTLES; return BATTLES.filter(b => b.status === battleFilter); } // ========================================================================== // RENDER LISTY BITEW // ========================================================================== function renderBattlesList() { const list = document.getElementById('battlesList'); if (!list) return; const filtered = getFilteredBattles(); if (filtered.length === 0) { list.innerHTML = `
⚔️
Brak bitew w tej kategorii
Stwórz nową bitwę i zaproś botów lub poczekaj na graczy
`; return; } list.innerHTML = filtered.map(b => renderBattleCard(b)).join(''); list.querySelectorAll('[data-battle-action]').forEach(btn => { btn.onclick = (e) => { e.stopPropagation(); const action = btn.dataset.battleAction; const id = btn.dataset.battleId; const battle = BATTLES.find(b => b.id === id); if (!battle) return; if (action === 'join') joinBattle(battle); else if (action === 'addBot') openBotSelector(battle); else if (action === 'view') openBattleViewer(battle); else if (action === 'start') startBattle(battle); }; }); } function renderBattleCard(battle) { const totalCost = getBattleCost(battle); const me = battle.players.find(p => p.isMe); const slotsLeft = battle.maxPlayers - battle.players.length; let actionsHtml = ''; if (battle.status === 'waiting') { const actions = []; if (slotsLeft > 0) { if (!me) actions.push(``); actions.push(``); } if (me) actions.push(``); actionsHtml = actions.join(''); } else if (battle.status === 'finished') { actionsHtml = ``; } else { actionsHtml = ``; } const playerSlots = []; for (let i = 0; i < battle.maxPlayers; i++) { const p = battle.players[i]; if (p) { playerSlots.push(`
${p.bot?(p.avatar||'🤖'):(p.isMe?'👤':'🎮')}
${p.name}
`); } else { playerSlots.push(`
?
Wolne
`); } } const modeBadge = battle.mode === 'underdog' ? '🎲 UNDERDOG' : '🏆 NORMAL'; const casesPreview = battle.cases.slice(0,5).map(c => `${c.emoji}`).join(''); return `
${modeBadge}
${totalCost.toFixed(2)} zł
ID: ${battle.id.substring(0,16)}
${battle.cases.length} skrzynek:${casesPreview}${battle.cases.length>5?`+${battle.cases.length-5}`:''}
${playerSlots.join('')}
${actionsHtml}
${battle.status==='finished'&&battle.winner?`
🏆 Wygrał: ${battle.winner.name} (${battle.winner.total.toFixed(2)} zł)
`:''}
`; } // ========================================================================== // 1. GUI WYBORU BOTA (9 botów z polskimi nazwami) // ========================================================================== function openBotSelector(battle) { const usedBots = new Set(battle.players.filter(p => p.bot).map(p => p.name)); let modal = document.getElementById('botSelectorModal'); if (!modal) { modal = document.createElement('div'); modal.id = 'botSelectorModal'; modal.className = 'modal-overlay'; document.body.appendChild(modal); } modal.innerHTML = ` `; setTimeout(() => modal.classList.add('active'), 10); modal.onclick = (e) => { if (e.target === modal) modal.classList.remove('active'); }; } function addSpecificBot(battleId, botName, botIdx) { const battle = BATTLES.find(b => b.id === battleId); if (!battle || battle.players.length >= battle.maxPlayers) return; battle.players.push({ name: botName, bot: true, isMe: false, items: [], avatar: BOT_AVATARS[botIdx] }); document.getElementById('botSelectorModal').classList.remove('active'); showToast(`🤖 Bot ${botName} dołączył do bitwy!`); renderBattlesList(); const bv = document.getElementById('battleViewerModal'); if (bv && bv.classList.contains('active')) renderBattleViewerContent(bv, battle); } // ========================================================================== // DOŁĄCZANIE DO BITWY // ========================================================================== function joinBattle(battle) { if (battle.players.find(p => p.isMe)) { showToast('Już jesteś w tej bitwie!'); return; } if (battle.players.length >= battle.maxPlayers) { showToast('Bitwa jest pełna!'); return; } const cost = getBattleCost(battle); if (!canAfford(cost)) { showToast(`Brak środków! Potrzebujesz ${cost.toFixed(2)} zł`); return; } subtractMoney(cost); battle.players.push({ name: 'Ty', bot: false, isMe: true, items: [] }); showToast(`✅ Dołączyłeś do bitwy za ${cost.toFixed(2)} zł!`); renderBattlesList(); openBattleViewer(battle); } // ========================================================================== // 3 & 4. WIDOK BITWY (wzorowany na screenie G4Skins) // ========================================================================== function openBattleViewer(battle) { if (!battle) return; let modal = document.getElementById('battleViewerModal'); if (!modal) { modal = document.createElement('div'); modal.id = 'battleViewerModal'; modal.className = 'modal-overlay'; document.body.appendChild(modal); } renderBattleViewerContent(modal, battle); setTimeout(() => modal.classList.add('active'), 10); modal.onclick = (e) => { if (e.target === modal) modal.classList.remove('active'); }; } function renderBattleViewerContent(modal, battle) { const totalCost = getBattleCost(battle); const currentRound = battle.currentRound || 0; const totalRounds = battle.cases.length; const isRunning = battle.status === 'running'; const isFinished = battle.status === 'finished'; const isWaiting = battle.status === 'waiting'; const me = battle.players.find(p => p.isMe); // Miniatury rund (scrool poziomy jak na screenie) const roundThumbs = battle.cases.map((c, i) => { const done = i < currentRound; const current = i === currentRound && isRunning; return `
${c.emoji}
${c.price.toFixed(0)} zł
${done?'✓':current?'▶':(i+1)+''}
`; }).join(''); // Sloty graczy (wzorowane na screenie) const playerCols = battle.players.map((p) => { const isWinner = isFinished && battle.winner && battle.winner.name === p.name; const lastItem = p.items && p.items.length > 0 ? p.items[p.items.length - 1] : null; const totalVal = (p.items||[]).reduce((s,i) => s+i.price, 0); return `
${isWinner?'
🏆 ZWYCIĘZCA
':''}
${p.bot?(p.avatar||'🤖'):(p.isMe?'👤':'🎮')}
${p.name}
${lastItem ? `
${renderItemImage(lastItem)}
${lastItem.name.substring(0,22)}
Field Tested
${lastItem.price.toFixed(2)} zł
` : `
${isWaiting?'Oczekuje...':'—'}
`}
${isFinished?`
${totalVal.toFixed(2)} zł
`:''}
`; }); // Wstaw VS między kolumny const playerColsWithVS = playerCols.reduce((acc, col, i) => { if (i > 0) acc.push(`
VS
`); acc.push(col); return acc; }, []).join(''); // Historia skinów z aktualnej rundy (mini karty na dole) const allDropped = battle.players.flatMap(p => (p.items||[]).slice(-1)); modal.innerHTML = ` `; } function copyBattleLink(id) { showToast('📋 Link do bitwy skopiowany!'); } // ========================================================================== // TWORZENIE BITWY + PRZEKIEROWANIE (punkt 3) // ========================================================================== function openBattleCreator() { let modal = document.getElementById('battleCreatorModal'); if (!modal) { modal = document.createElement('div'); modal.id = 'battleCreatorModal'; modal.className = 'modal-overlay'; document.body.appendChild(modal); } let selectedCases = []; let mode = 'normal'; let maxPlayers = 2; function totalCost() { return selectedCases.reduce((s,c) => s+c.price, 0); } function render() { modal.innerHTML = ` `; document.getElementById('bcClose').onclick = () => modal.classList.remove('active'); document.getElementById('bcCancel').onclick = () => modal.classList.remove('active'); document.getElementById('modeNormal').onclick = () => { mode = 'normal'; render(); }; document.getElementById('modeUnderdog').onclick = () => { mode = 'underdog'; render(); }; document.querySelectorAll('[data-players]').forEach(btn => { btn.onclick = () => { maxPlayers = parseInt(btn.dataset.players); render(); }; }); document.querySelectorAll('.bc-case-item').forEach(item => { item.onmouseenter = () => { item.style.borderColor='var(--border-hover)'; item.style.background='var(--bg-card-hover)'; }; item.onmouseleave = () => { item.style.borderColor='var(--border)'; item.style.background='var(--bg-tertiary)'; }; item.onclick = () => { if (selectedCases.length >= 10) { showToast('Maksymalnie 10 skrzynek!'); return; } const c = CASES.find(c => c.id === item.dataset.caseId); if (c) { selectedCases.push(c); render(); } }; }); document.querySelectorAll('[data-remove]').forEach(item => { item.onclick = (e) => { e.stopPropagation(); selectedCases.splice(parseInt(item.dataset.remove),1); render(); }; }); const createBtn = document.getElementById('bcCreate'); if (createBtn && selectedCases.length > 0) { createBtn.onclick = () => { const cost = totalCost(); if (!canAfford(cost)) { showToast(`Brak środków! Potrzebujesz ${cost.toFixed(2)} zł`); return; } subtractMoney(cost); const newBattle = { id: generateBattleId(), mode, cases: [...selectedCases], maxPlayers, players: [{ name: 'Ty', bot: false, isMe: true, items: [] }], status: 'waiting', createdAt: Date.now() }; BATTLES.unshift(newBattle); modal.classList.remove('active'); showToast(`✅ Bitwa stworzona! Koszt: ${cost.toFixed(2)} zł`); renderBattlesList(); // 3. PRZEKIEROWANIE do widoku bitwy setTimeout(() => openBattleViewer(newBattle), 350); }; } } render(); setTimeout(() => modal.classList.add('active'), 10); modal.onclick = (e) => { if (e.target === modal) modal.classList.remove('active'); }; } // ========================================================================== // 2. ZWYCIĘZCA WYGRYWA SKINY WSZYSTKICH GRACZY + START BITWY // ========================================================================== function startBattle(battle) { if (battle.status !== 'waiting') return; // Uzupełnij pustą grę botami while (battle.players.length < battle.maxPlayers) { const available = BOT_NAMES_PL.filter(n => !battle.players.some(p => p.name === n)); if (available.length === 0) break; const idx = Math.floor(Math.random() * available.length); const botName = available[idx]; const botIdx = BOT_NAMES_PL.indexOf(botName); battle.players.push({ name: botName, bot: true, isMe: false, items: [], avatar: BOT_AVATARS[botIdx] }); } battle.status = 'running'; battle.currentRound = 0; battle.players.forEach(p => p.items = []); renderBattlesList(); function playRound(round) { if (round >= battle.cases.length) { finishBattle(battle); return; } battle.currentRound = round; const caseData = battle.cases[round]; const pool = (caseData.pool && caseData.pool.length > 0) ? caseData.pool : ITEMS; battle.players.forEach(p => { const item = pickWeightedItem(pool, false); p.items.push(item); }); renderBattlesList(); const bv = document.getElementById('battleViewerModal'); if (bv && bv.classList.contains('active')) renderBattleViewerContent(bv, battle); setTimeout(() => playRound(round + 1), 1600); } playRound(0); } function finishBattle(battle) { battle.status = 'finished'; battle.finishedAt = Date.now(); battle.currentRound = battle.cases.length; // Oblicz totale const totals = battle.players.map(p => ({ ...p, total: p.items.reduce((s,i) => s+i.price, 0) })); // Wyznacz zwycięzcę const winner = battle.mode === 'underdog' ? totals.reduce((best, p) => p.total < best.total ? p : best) : totals.reduce((best, p) => p.total > best.total ? p : best); battle.winner = winner; // 2. Zwycięzca dostaje WSZYSTKIE skiny ze wszystkich graczy const allItems = battle.players.flatMap(p => p.items); if (winner.isMe) { allItems.forEach(item => addToInventory(item)); const totalWon = allItems.reduce((s, i) => s + i.price, 0); showToast(`🏆 Wygrałeś bitwę! +${allItems.length} skinów o wartości ${totalWon.toFixed(2)} zł!`); } else { showToast(`💀 Bitwa zakończona. Wygrał ${winner.name} (${winner.total.toFixed(2)} zł)`); } renderBattlesList(); const bv = document.getElementById('battleViewerModal'); if (bv && bv.classList.contains('active')) renderBattleViewerContent(bv, battle); setTimeout(() => { cleanupOldBattles(); renderBattlesList(); }, 30000); } // ========================================================================== // 5 & 6. HISTORIA BITEW (własnych) // ========================================================================== function openBattleHistoryModal() { let modal = document.getElementById('battleHistoryModal'); if (!modal) { modal = document.createElement('div'); modal.id = 'battleHistoryModal'; modal.className = 'modal-overlay'; document.body.appendChild(modal); } const myFinishedInBattles = BATTLES.filter(b => b.players.some(p => p.isMe) && b.status === 'finished'); const allHistory = [...battleHistory, ...myFinishedInBattles]; modal.innerHTML = ` `; setTimeout(() => modal.classList.add('active'), 10); modal.onclick = (e) => { if (e.target === modal) modal.classList.remove('active'); }; }