Skip to content

kumaranand4664-wq/LuckyEmpire

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 

Repository files navigation

<title>LuckyEmpire — Neon Casino (Demo + Admin/Auth/KYC)</title> <style> :root{ --bg:#0a0b14;--panel:#121327;--panel-2:#16183a;--text:#e9ecff;--muted:#9aa3ff; --brand:#7c4dff;--brand-2:#00e5ff;--win:#21f3a3;--lose:#ff5d73;--gold:#ffd166; --card:#111325;--shadow:0 10px 30px rgba(0,0,0,.35) } *{box-sizing:border-box} html,body{margin:0;background:radial-gradient(1200px 600px at 10% -10%,rgba(0,229,255,.12),transparent), radial-gradient(900px 500px at 110% 10%,rgba(124,77,255,.12),transparent), var(--bg);color:var(--text);font:400 16px/1.4 system-ui,Segoe UI,Roboto,Ubuntu,Inter,sans-serif} a{color:inherit;text-decoration:none} .container{max-width:1200px;margin-inline:auto;padding:20px} header{position:sticky;top:0;z-index:10;background:linear-gradient(180deg,rgba(10,11,20,.95),rgba(10,11,20,.7));backdrop-filter:blur(6px);border-bottom:1px solid #1b1d3d} .brand{display:flex;align-items:center;gap:14px} .logo{width:40px;height:40px;border-radius:12px;background:linear-gradient(135deg,var(--brand),var(--brand-2));box-shadow:0 0 30px rgba(124,77,255,.5)} h1{font-size:20px;margin:0;letter-spacing:.4px} .row{display:flex;align-items:center;gap:12px;flex-wrap:wrap} nav.primary{display:flex;gap:10px;flex-wrap:wrap} .navlink{padding:10px 12px;border-radius:12px;border:1px solid #2a2d5b;background:linear-gradient(180deg,#16183a,#10122b);cursor:pointer} .navlink.active{outline:2px solid #3a3f78} .topbar{display:grid;grid-template-columns:auto 1fr auto auto;gap:16px;align-items:center} @media (max-width:980px){.topbar{grid-template-columns:1fr;}} .search{display:flex;align-items:center;gap:10px;background:var(--panel);padding:12px 14px;border-radius:14px;border:1px solid #1b1d3d} .search input{all:unset;flex:1} .btn{padding:10px 14px;border-radius:12px;border:1px solid #2a2d5b;background:linear-gradient(180deg,#16183a,#10122b);color:var(--text);cursor:pointer;box-shadow:var(--shadow);transition:transform .06s ease} .btn:hover{transform:translateY(-1px)} .btn.primary{background:linear-gradient(180deg,var(--brand),#5b38e4);border-color:#6b4cff} .btn.ghost{background:transparent} .chip{padding:8px 12px;border-radius:999px;border:1px solid #2a2d5b;background:#0f1130;cursor:pointer} .chip.active{background:linear-gradient(180deg,#1a1d4a,#11153a);border-color:#3a3f78;box-shadow:inset 0 0 0 1px #3a3f78} .grid{display:grid;grid-template-columns:repeat(6,1fr);gap:16px} @media (max-width:1100px){.grid{grid-template-columns:repeat(4,1fr)}} @media (max-width:760px){.grid{grid-template-columns:repeat(2,1fr)}} .card{background:var(--card);border:1px solid #1b1d3d;border-radius:16px;overflow:hidden;box-shadow:var(--shadow);display:flex;flex-direction:column} .thumb{aspect-ratio:16/9;display:grid;place-items:center;background:radial-gradient(500px 120px at 20% 0,rgba(0,229,255,.15),transparent),radial-gradient(400px 120px at 120% 10%,rgba(124,77,255,.16),transparent),#0f1030} .thumb span{font-size:40px} .meta{padding:12px} .meta h3{margin:0;font-size:15px} .meta .sub{font-size:12px;color:var(--muted)} .footer{margin-top:auto;padding:12px;display:flex;justify-content:space-between;align-items:center;border-top:1px solid #1b1d3d} .pill{font-size:12px;padding:6px 10px;border-radius:999px;border:1px solid #2a2d5b;background:#0e1030} .pill.win{border-color:#1e7e5e;color:var(--win)} .layout{display:grid;grid-template-columns:1fr 320px;gap:20px} @media (max-width:1100px){.layout{grid-template-columns:1fr}} .panel{background:var(--panel);border:1px solid #1b1d3d;border-radius:18px;box-shadow:var(--shadow)} .panel h2{margin:0 0 10px;font-size:16px;color:#c9d1ff} .panel .content{padding:16px} .wallet{display:flex;align-items:center;justify-content:space-between} .balance{font-weight:700;font-size:22px} .disclaimer{font-size:12px;color:#9aa3ff99;margin-top:8px} .leader{display:grid;gap:10px} .leader .row{justify-content:space-between} .tag{font-size:12px;color:var(--muted)} .section{display:none} .section.active{display:block} table{width:100%;border-collapse:separate;border-spacing:0 8px} th,td{font-size:14px;text-align:left;padding:10px} tr{background:#0e1030;border:1px solid #1b1d3d} th{color:#b8c0ff} .kbd{font-family:ui-monospace,Menlo,Consolas,monospace;background:#0e1033;border:1px solid #2a2d5b;padding:2px 6px;border-radius:6px;color:#b9c2ff} .flag{padding:6px 8px;border-radius:8px;border:1px solid #313769;background:#11153a;font-size:12px} .flag.good{border-color:#205f48;color:var(--win)} .flag.warn{border-color:#8a6a00;color:var(--gold)} .flag.bad{border-color:#7b2130;color:var(--lose)} .input{all:unset;background:#0b0e29;border:1px solid #2a2f6b;border-radius:10px;padding:10px 12px;min-width:120px} .controls{display:flex;flex-wrap:wrap;gap:10px;margin-top:12px} .divider{height:1px;background:#22265a;margin:14px 0} footer.site{margin:40px 0 20px;color:#9aa3ff99;text-align:center}
/* Modal */
.modal{position:fixed;inset:0;background:rgba(6,7,15,.75);backdrop-filter:blur(6px);display:none;align-items:center;justify-content:center;padding:20px}
.modal.open{display:flex}
.modal-card{width:min(960px,100%);background:var(--panel-2);border:1px solid #242863;border-radius:20px;box-shadow:var(--shadow);overflow:hidden}
.modal-header{display:flex;align-items:center;justify-content:space-between;padding:14px 16px;border-bottom:1px solid #242863}
.modal-body{padding:16px}
.close{cursor:pointer;border:none;background:transparent;color:var(--text);font-size:20px}
</style>

LuckyEmpire • Demo Only

Home Wallet KYC & RG Admin
Brand ✏️
All
Slots
Poker
Roulette
Blackjack
Live
Crash
Table

Wallet (Demo)

Balance
₹10,000
Open Wallet

This is a front‑end demo. No real money, no payouts. Online gaming is regulated—always check your local laws before launching.

🔥 Recent Wins (Mock)

Wallet

₹10,000
Deposit Withdraw

To enable real payments, integrate a compliant PSP (e.g., Razorpay/Stripe) and implement KYC, geo-blocking, AML checks and ledgering. The demo uses mock transactions below.

Transactions (Mock)

IDTypeAmountStatusTime

KYC Verification

Current Status: Not Submitted
Start KYC Reset

Production flow should collect legal name, DOB, address, and verify ID (Aadhaar/Passport/Driving Licence) + selfie liveness via a compliant provider. Store only minimal data, encrypt at rest, and purge per policy.

Responsible Gaming (RG)

Daily Deposit Limit (₹) Daily Loss Limit (₹) Session Timer (min)
Save Limits Self-Exclude (7 days)

Admin Dashboard

Only admins can view. Use demo login (e.g., admin@admin.test) to get admin role locally. Replace with Firebase Auth + role claims in production.

You are not an admin. Please login as an admin user.
Users
Games
Transactions
Compliance

Users

EmailKYCBalanceRGRole

Games

GameCategoryRTP % (placeholder)Status

Transactions

IDUserTypeAmountStatus

Compliance Alerts

    © LuckyEmpire. Demo UI. Add age gates, KYC/AML, RG tools, licensing & geo controls before real launch.
    GameCategory
    Login
    Continue

    Demo auth stores a fake session in localStorage. Replace with Firebase Auth before production.

    Firebase Setup (placeholder)
    // 1) Add your Firebase config here
    // const firebaseConfig = { apiKey:"...", authDomain:"...", projectId:"...", appId:"..." };
    // 2) Initialize Firebase & Auth: initializeApp(firebaseConfig); getAuth();
    // 3) Use signInWithEmailAndPassword / createUserWithEmailAndPassword
    // 4) Store custom claims (admin) via backend Cloud Functions
              
    <script> // ---------------- GLOBAL STATE ---------------- const LS_KEY = 'casino_demo_state_v1'; const state = JSON.parse(localStorage.getItem(LS_KEY)||'null') || { user:null, // {email, admin, kyc:"none|pending|approved", rg:{limitDeposit,limitLoss,timer,selfExcludedUntil}, balance:10000} tx:[], }; if(!state.user){ state.user = { email:null, admin:false, kyc:'none', rg:{limitDeposit:5000, limitLoss:3000, timer:60, selfExcludedUntil:0}, balance:10000 }; } function save(){ localStorage.setItem(LS_KEY, JSON.stringify(state)); } // ---------------- BRAND ---------------- let brandName = 'LuckyEmpire'; function setBrand(name){ brandName = name; document.title = brandName + ' — Neon Casino (Demo + Admin/Auth/KYC)'; document.getElementById('brand').textContent = brandName; document.getElementById('brandTitle').innerHTML = brandName + ' • Demo Only'; } // ---------------- NAV / ROUTER ---------------- const routes = ['home','wallet','kyc','admin']; const navlinks = [...document.querySelectorAll('[data-route]')]; navlinks.forEach(a=> a.addEventListener('click',()=> show(a.dataset.route))); document.querySelectorAll('[data-open-route]').forEach(b=> b.addEventListener('click',()=> show(b.getAttribute('data-open-route')))); function show(route){ routes.forEach(r=>{ document.getElementById(r).classList.toggle('active', r===route); }); navlinks.forEach(a=> a.classList.toggle('active', a.dataset.route===route)); // Toggle chips/search visibility on home only document.getElementById('chipsRow').style.display = route==='home'? 'flex':'none'; document.getElementById('searchWrap').style.display = route==='home'? 'flex':'none'; if(route==='wallet') renderWallet(); if(route==='kyc') renderKycRg(); if(route==='admin') renderAdmin(); location.hash = route; } window.addEventListener('hashchange',()=>{ const r = location.hash.replace('#','')||'home'; if(routes.includes(r)) show(r); }); // ---------------- AUTH (DEMO) ---------------- const authArea = document.getElementById('authArea'); function renderAuth(){ authArea.innerHTML=''; if(state.user && state.user.email){ const email = document.createElement('span'); email.className='tag'; email.textContent = state.user.email + (state.user.admin? ' • admin':'' ); const logout = document.createElement('button'); logout.className='btn'; logout.textContent='Logout'; logout.onclick = ()=>{ state.user = { email:null, admin:false, kyc:'none', rg:{limitDeposit:5000, limitLoss:3000, timer:60, selfExcludedUntil:0}, balance:10000 }; save(); renderAuth(); renderWallet(); renderKycRg(); }; authArea.append(email, logout); }else{ const login = document.createElement('button'); login.className='btn'; login.textContent='Login'; login.onclick=()=> openAuth('Login'); const signup = document.createElement('button'); signup.className='btn primary'; signup.textContent='Sign Up'; signup.onclick=()=> openAuth('Sign Up'); authArea.append(login, signup); } } const authModal = document.getElementById('authModal'); function openAuth(title){ document.getElementById('authTitle').textContent=title; authModal.classList.add('open'); } document.querySelector('[data-close-auth]').onclick = ()=> authModal.classList.remove('open'); document.getElementById('authSubmit').onclick = ()=>{ const email = document.getElementById('authEmail').value.trim(); const pass = document.getElementById('authPass').value.trim(); if(!email || !pass){ alert('Enter email & password (demo)'); return } const isAdmin = /@admin\.test$/i.test(email); state.user.email = email; state.user.admin = isAdmin; save(); authModal.classList.remove('open'); renderAuth(); renderAdmin(); } // ---------------- GAMES DATA (same as before) ---------------- const demoPlayable = { Slots:["MegaSpin Madness"], Roulette:["Lightning Roulette"], Blackjack:["Blackjack Royale"], Crash:["Aviator Xtreme"] }; const games = [ ["Slots","🎰","MegaSpin Madness"],["Slots","💎","Fortune Frenzy"],["Slots","7️⃣","Lucky 7 Deluxe"],["Slots","✨","Starburst Royale"],["Slots","🏛️","Treasure Temple"],["Slots","💰","Jackpot Mania"],["Slots","⛏️","Gold Rush Deluxe"],["Slots","🔷","Diamond Dynasty"],["Slots","🌙","Mystic Moon Slots"],["Slots","🐯","Wild Tiger Spins"],["Slots","🌃","Vegas Nights"],["Slots","👑","Reel Kings"],["Slots","🌪️","SpinStorm"],["Slots","🎡","Cash Carnival"],["Slots","🗿","Pharaoh’s Fortune"],["Slots","🐉","Dragon Blaze"],["Slots","🌟","Sapphire Stars"],["Slots","🍒","Flaming Fruits"],["Slots","🌴","Jungle Jackpot"],["Slots","⚡","Thunder Reels"],["Slots","🍬","Candy Spin"],["Slots","💠","Crystal Cash"],["Slots","🏴‍☠️","Pirate Plunder"],["Slots","🪩","Neon Nights"],["Slots","🪄","Magic Money"],["Slots","💥","Big Bang Slots"],["Slots","🏰","Royal Riches"],["Slots","🎟️","Vegas Royale"],["Slots","☘️","Lucky Clover"],["Slots","🐚","Ocean Treasure"],["Slots","🪐","Cosmic Spins"],["Slots","🚀","Reel Rush"],["Slots","🔔","Silver Bells"],["Slots","🤠","Wild West Wins"],["Slots","🚂","Money Train"],["Slots","🔥","Inferno Gold"],["Slots","🐼","Panda Paradise"],["Slots","🏆","Spin & Win"],["Slots","🚇","Jackpot Express"],["Slots","🌊","Treasure Tides"],["Slots","📼","Retro Reels"],["Slots","⚡","Thunder Strike"],["Slots","🔮","Mystic Fortune"],["Slots","🎰","Mega Reel Rush"],["Slots","❄️","Frozen Fortune"],["Slots","🦁","Secret Safari"],["Slots","🏛️","Empire Spins"],["Slots","🥇","Triple Gold Bars"],["Slots","🧜‍♀️","Sunken Treasure"],["Slots","💨","Jackpot Blitz"], ["Poker","🂡","Royal Poker Pro"],["Poker","♠️","Texas Hold’em Clash"],["Poker","💼","High Stakes Poker"],["Poker","🃏","Bluff Masters"],["Poker","👑","Poker Royale"],["Poker","💛","Golden Flush"],["Poker","💵","Triple Jackpot Poker"],["Poker","🂮","Casino Hold’em"],["Poker","🃏","Wild Card Poker"],["Poker","🔥","All-In Showdown"],["Poker","3️⃣","3-Card Blitz"],["Poker","💎","Straight Flush Legends"],["Poker","🤒","Poker Fever"],["Poker","🂱","Double Ace Poker"],["Poker","👑","King’s Crown Poker"],["Poker","🌊","Lucky River Poker"],["Poker","⭐","Millionaire Poker"],["Poker","🏰","Bet Royale Poker"],["Poker","🃏","Teen Patti Pro"],["Poker","🃏","Andar Bahar Ultimate"], ["Roulette","🎡","Lightning Roulette"],["Roulette","🎯","Vegas Wheel Royale"],["Roulette","7️⃣","Lucky 777 Spins"],["Roulette","0️⃣","Double Zero Rush"],["Roulette","🟥","Red or Black Blitz"],["Roulette","🟡","Golden Wheel"],["Roulette","🔁","Roulette Revolution"],["Roulette","🔮","Mystic Wheel Fortune"],["Roulette","🧿","Zero Hero Roulette"],["Roulette","👑","Spin Royale"],["Roulette","💠","Crystal Wheel"],["Roulette","⚡","Turbo Roulette"],["Roulette","🪩","Neon Spin"],["Roulette","🔷","Diamond Roulette"],["Roulette","🚄","FastTrack Wheel"],["Roulette","⛏️","Roulette Gold Rush"],["Roulette","💰","Wheel of Riches"],["Roulette","🟣","Lucky Sphere"],["Roulette","🇫🇷","French Royale"],["Roulette","⚡","Rapid Roulette"], ["Blackjack","🃏","Blackjack Royale"],["Blackjack","2️⃣","21 Blitz"],["Blackjack","🂠","Lucky Ace Blackjack"],["Blackjack","🏙️","Vegas Strip 21"],["Blackjack","💼","High Stakes Blackjack"],["Blackjack","♠️","Infinite 21"],["Blackjack","⬇️","Double Down Deluxe"],["Blackjack","🃏","Wild Card Blackjack"],["Blackjack","⭐","Golden 21"],["Blackjack","🕹️","All-In Blackjack"],["Blackjack","🗡️","Vegas Edge"],["Blackjack","🏎️","Blackjack Turbo"],["Blackjack","💎","Premium 21"],["Blackjack","🎯","Ultimate Blackjack Pro"],["Blackjack","🔥","Rapid Fire 21"],["Blackjack","👑","Royal Blackjack"],["Blackjack","🧠","Card Kings"],["Blackjack","🎲","Triple Jack Bonus"],["Blackjack","🤒","Blackjack Fever"],["Blackjack","💥","Jackpot 21"], ["Live","🎥","Live Dealer Royale"],["Live","🔴","LuckySpin Live"],["Live","⚡","Lightning Baccarat"],["Live","🎡","Live Roulette Pro"],["Live","⚔️","Casino War Live"],["Live","🐉","Dragon Tiger Live"],["Live","🃏","Ultimate Andar Bahar"],["Live","🤪","Crazy Time Live"],["Live","🌟","Dream Catcher Show"],["Live","🎡","Wheel of Fortune Live"],["Live","🛫","Cash or Crash"],["Live","🏢","Monopoly Live"],["Live","🃏","Teen Patti Pro"],["Live","🂡","Poker Showdown Live"],["Live","🃏","Live Blackjack Arena"],["Live","🔢","Bet on Numbers"],["Live","💛","Golden Baccarat"],["Live","🛩️","Aviator Rush"],["Live","💼","VIP Lounge Live"],["Live","🌀","SpinMaster Live"], ["Crash","✈️","Aviator Xtreme"],["Crash","💥","CrashMania"],["Crash","🚀","Rocket Ride"],["Crash","🛩️","Aviator X"],["Crash","💣","BetBlast"],["Crash","🏔️","SkyHigh Stakes"],["Crash","🪙","Crypto Crashers"],["Crash","🛫","CashPlane"],["Crash","⚡","Turbo Rocket"],["Crash","💥","BoomBet"],["Crash","🪖","FlightWin"],["Crash","↕️","UpDown Mania"],["Crash","🌥️","AirRush Jackpot"],["Crash","🪐","SpaceBet Crash"],["Crash","🪙","Crypto Jet"],["Crash","🪙","CoinFlip X"],["Crash","🛩️","CrazyJet Gold"],["Crash","🌆","BetSkyRise"],["Crash","🛫","TakeOff Turbo"],["Crash","🚀","WinRocket"] ]; // ---------------- HOME RENDER ---------------- const grid = document.getElementById('gamesGrid'); const leader = document.getElementById('leader'); const balanceEl = document.getElementById('balance'); const walletBalanceEl = document.getElementById('walletBalance'); const txTableBody = document.querySelector('#txTable tbody'); function formatINR(n){ return '₹'+ Number(n).toLocaleString('en-IN'); } function renderGames(filterCat='all', searchTerm=''){ grid.innerHTML = ''; const list = games.filter(g=> (filterCat==='all'||g[0]===filterCat) && (g[2].toLowerCase().includes(searchTerm))) list.forEach(([cat,icon,name])=>{ const card = document.createElement('div'); card.className='card'; card.innerHTML = `
    ${icon}

    ${name}

    ${cat}
    Demo Play
    `; card.querySelector('[data-open]').onclick = ()=> openGame({name,cat}); grid.appendChild(card); }) } function mockLeader(){ const names = ['Arjun','Riya','Kabir','Aisha','Rohan','Meera','Vikram','Isha','Aarav','Sana']; const picks = Array.from({length:8},()=>({ user:names[Math.floor(Math.random()*names.length)], game: games[Math.floor(Math.random()*games.length)][2], amt: Math.floor(Math.random()*5000)+500 })) leader.innerHTML = ''; picks.forEach(p=>{ const row = document.createElement('div'); row.className='row'; row.innerHTML = `
    🏆 ${p.user} won ${formatINR(p.amt)}
    ${p.game}
    ` leader.appendChild(row); }) } // Filters & Search let currentCat='all'; document.querySelectorAll('.chip').forEach(ch=>{ ch.addEventListener('click',()=>{ document.querySelectorAll('.chip').forEach(c=>c.classList.remove('active')); ch.classList.add('active'); currentCat = ch.dataset.cat; renderGames(currentCat, search.value.trim().toLowerCase()); }) }) const search = document.getElementById('search'); search.addEventListener('input',()=> renderGames(currentCat, search.value.trim().toLowerCase())); // ---------------- WALLET ---------------- function renderWallet(){ walletBalanceEl.textContent = formatINR(state.user.balance); txTableBody.innerHTML = ''; state.tx.slice().reverse().forEach(t=>{ const tr=document.createElement('tr'); tr.innerHTML = `${t.id}${t.type}${formatINR(t.amt)}${t.status}${new Date(t.ts).toLocaleString()}`; txTableBody.appendChild(tr); }) } // Add a mock transaction helper function addTx(type, amt, status='completed'){ state.tx.push({id: 'TX'+Math.random().toString(36).slice(2,8).toUpperCase(), type, amt, status, ts: Date.now(), user: state.user.email||'guest'}); save(); renderWallet(); renderAdmin(); } // ---------------- KYC & RG ---------------- const kycStatusEl = document.getElementById('kycStatus'); const rgMsg = document.getElementById('rgMsg'); function renderKycRg(){ // KYC kycStatusEl.textContent = state.user.kyc==='approved'? 'Approved' : (state.user.kyc==='pending'? 'Pending' : 'Not Submitted'); kycStatusEl.className = 'flag ' + (state.user.kyc==='approved'?'good':(state.user.kyc==='pending'?'warn':'bad')); // RG inputs document.getElementById('rgLimitDeposit').value = state.user.rg.limitDeposit; document.getElementById('rgLimitLoss').value = state.user.rg.limitLoss; document.getElementById('rgTimer').value = state.user.rg.timer; // self-exclusion message const now = Date.now(); if(state.user.rg.selfExcludedUntil>now){ const days = Math.ceil((state.user.rg.selfExcludedUntil-now)/86400000); rgMsg.textContent = `Self-excluded. ${days} day(s) remaining.`; } else { rgMsg.textContent = ''; } } document.getElementById('btnStartKyc').onclick = ()=>{ state.user.kyc='pending'; save(); renderKycRg(); alert('KYC started (demo). In production, open provider flow.'); }; document.getElementById('btnResetKyc').onclick = ()=>{ state.user.kyc='none'; save(); renderKycRg(); }; document.getElementById('saveRG').onclick = ()=>{ const d = parseInt(document.getElementById('rgLimitDeposit').value||'0'); const l = parseInt(document.getElementById('rgLimitLoss').value||'0'); const t = parseInt(document.getElementById('rgTimer').value||'0'); state.user.rg.limitDeposit=d; state.user.rg.limitLoss=l; state.user.rg.timer=t; save(); rgMsg.textContent = 'Limits saved (demo).'; renderAdmin(); } document.getElementById('selfExclude').onclick = ()=>{ state.user.rg.selfExcludedUntil = Date.now() + 7*86400000; save(); renderKycRg(); }; // ---------------- ADMIN ---------------- const adminGate = document.getElementById('adminGate'); const adminWrap = document.getElementById('adminWrap'); function renderAdmin(){ if(!(state.user && state.user.admin)){ adminGate.style.display='block'; adminWrap.style.display='none'; return; } adminGate.style.display='none'; adminWrap.style.display='block'; // Users const uBody = document.querySelector('#adminUsers tbody'); uBody.innerHTML=''; const u = state.user; const rgFlags = (u.rg.selfExcludedUntil>Date.now()? 'Self-excluded ' : '') + `Dep ₹${u.rg.limitDeposit} Loss ₹${u.rg.limitLoss}`; const trU=document.createElement('tr'); trU.innerHTML = `${u.email||'guest'}${u.kyc}${formatINR(u.balance)}${rgFlags}${u.admin?'admin':'user'}`; uBody.appendChild(trU); // Games const gBody = document.querySelector('#adminGames tbody'); gBody.innerHTML=''; games.slice(0,10).forEach(([cat,icon,name])=>{ const tr=document.createElement('tr'); tr.innerHTML = `${name}${cat}96.0active`; gBody.appendChild(tr); }) // Transactions const tBody = document.querySelector('#adminTx tbody'); tBody.innerHTML=''; state.tx.slice(-10).reverse().forEach(t=>{ const tr=document.createElement('tr'); tr.innerHTML = `${t.id}${t.user}${t.type}${formatINR(t.amt)}${t.status}`; tBody.appendChild(tr); }) // Compliance alerts const ca = document.getElementById('compAlerts'); ca.innerHTML=''; if(u.kyc!=='approved') addAlert('KYC not approved — restrict withdrawals.'); if(u.rg.selfExcludedUntil>Date.now()) addAlert('User self-excluded — block gameplay.'); function addAlert(msg){ const li=document.createElement('li'); li.textContent = '• ' + msg; ca.appendChild(li); } } // ---------------- GAME MODAL & PLAYABLE DEMOS (unchanged) ---------------- const modal = document.getElementById('modal'); const closeModal = document.getElementById('closeModal'); const gameTitle = document.getElementById('gameTitle'); const gameCat = document.getElementById('gameCat'); const gameArea = document.getElementById('gameArea'); const gameStatus = document.getElementById('gameStatus'); function openGame({name,cat}){ // RG check: self-exclusion if(state.user.rg.selfExcludedUntil > Date.now()){ alert('You are self-excluded until your cooling period ends.'); return; } gameTitle.textContent = name; gameCat.textContent = cat; gameStatus.textContent=''; gameArea.innerHTML=''; modal.classList.add('open'); if(demoPlayable[cat] && demoPlayable[cat].includes(name)){ ({Slots:slotsDemo, Roulette:rouletteDemo, Blackjack:blackjackDemo, Crash:crashDemo}[cat])(); }else{ const wrap = document.createElement('div'); wrap.innerHTML = `

    This title is a placeholder. Build its real mechanics later. For now, try one of the playable demos:

    🎰 Slots Demo 🎡 Roulette Demo 🃏 Blackjack Demo ✈️ Crash Demo
    ` gameArea.appendChild(wrap); } } closeModal.onclick = ()=> modal.classList.remove('open'); window.addEventListener('keydown',e=>{if(e.key==='Escape') modal.classList.remove('open')}); function updateBalance(){ balanceEl.textContent = formatINR(state.user.balance); walletBalanceEl.textContent = formatINR(state.user.balance); } // Slots Demo function slotsDemo(){ const symbols = ['🍒','🍋','🔔','⭐','💎','7️⃣']; const el = document.createElement('div'); el.innerHTML = `
    Spin
    `; gameArea.appendChild(el); const reels = [...el.querySelectorAll('#reels .thumb span')]; el.querySelector('#spin').onclick = ()=>{ const bet = Math.max(1, parseInt(el.querySelector('#bet').value||'0')); if(state.user.balance symbols[Math.floor(Math.random()*symbols.length)]); let i=0; const timer = setInterval(()=>{ reels.forEach((r,idx)=>{if(idx<=i) r.textContent = res[idx];}) i++; if(i>2){ clearInterval(timer); const win = (res[0]===res[1]&&res[1]===res[2])? bet*8 : (new Set(res).size===2? bet*2:0); if(win>0){ state.user.balance += bet + win; gameStatus.textContent = `Win ${formatINR(win)}!`; addTx('Slots Win',win,'completed'); } else{ gameStatus.textContent = 'No win. Try again!'; addTx('Slots Bet',bet,'completed'); } save(); updateBalance(); } },300) } } // Roulette Demo function rouletteDemo(){ const el = document.createElement('div'); el.innerHTML = `
    Bet on
    Red Black 0
    Spin Wheel
    🎡
    `; gameArea.appendChild(el); let selection = 'RED'; el.querySelectorAll('[data-bet]').forEach(b=> b.onclick = ()=> selection=b.dataset.bet); el.querySelector('#spin').onclick = ()=>{ const bet = Math.max(1, parseInt(el.querySelector('#betAmt').value||'0')); if(state.user.balance{ const n = Math.floor(Math.random()*37); const color = n===0? 'GREEN' : (n%2? 'RED':'BLACK'); document.getElementById('wheel').textContent = n; let win=0; if(selection===color){ win = bet*2; } if(selection==='GREEN' && n===0){ win = bet*14; } if(win>0){ state.user.balance += bet + win; gameStatus.textContent=`Hit ${color} ${n}! You won ${formatINR(win)}.`; addTx('Roulette Win',win,'completed'); } else{ gameStatus.textContent=`Hit ${color} ${n}. You lost.`; addTx('Roulette Bet',bet,'completed'); } save(); updateBalance(); },900) } } // Blackjack Demo function blackjackDemo(){ const deck = []; 'A23456789TJQK'.split('').forEach(r=> ['♠','♥','♦','♣'].forEach(s=> deck.push(r+s))); function val(card){ const r = card[0]; if('TJQK'.includes(r)) return 10; if(r==='A') return 11; return parseInt(r); } function score(hand){ let s = hand.reduce((a,c)=> a+val(c),0); let aces = hand.filter(c=>c[0]==='A').length; while(s>21 && aces>0){ s-=10; aces--; } return s; } function draw(){ return deck.splice(Math.floor(Math.random()*deck.length),1)[0] } const el = document.createElement('div'); el.innerHTML = `
    Deal Hit Stand
    Target: 21
    Dealer
    You
    `; gameArea.appendChild(el); const betEl = el.querySelector('#bet'); const deal = el.querySelector('#deal'); const hit = el.querySelector('#hit'); const stand = el.querySelector('#stand'); let ph=[], dh=[], bet=0, active=false; function render(){ const dhand = el.querySelector('#dhand'); const phand = el.querySelector('#phand'); dhand.innerHTML = dh.map(c=> `${c}`).join(' '); phand.innerHTML = ph.map(c=> `${c}`).join(' '); el.querySelector('#dscore').textContent = `Score: ${score(dh)}`; el.querySelector('#pscore').textContent = `Score: ${score(ph)}`; } deal.onclick = ()=>{ bet = Math.max(1, parseInt(betEl.value||'0')); if(state.user.balance{ if(!active) return; ph.push(draw()); render(); if(score(ph)>21){ end('bust'); } } stand.onclick = ()=>{ if(!active) return; while(score(dh)<17) dh.push(draw()); render(); const ps=score(ph), ds=score(dh); if(ds>21 || ps>ds) end('win'); else if(ps
    Start Round Cash Out 1.00×
    `; gameArea.appendChild(el); const ctx = el.querySelector('#crash').getContext('2d'); const multEl = el.querySelector('#mult'); const start = el.querySelector('#start'); const cashout = el.querySelector('#cashout'); const betEl = el.querySelector('#bet'); let t=0, running=false, crashAt=0, cashed=false, bet=0, gain=0; function draw(){ const w=ctx.canvas.width, h=ctx.canvas.height; ctx.clearRect(0,0,w,h); ctx.fillStyle='#0b0e29'; ctx.fillRect(0,0,w,h); ctx.strokeStyle='#7c4dff'; ctx.lineWidth=2; ctx.beginPath(); ctx.moveTo(40,h-30); for(let x=0;x< w-50;x++){ const tm = Math.max(0,t - (w-50-x)/30); const m = 1 + Math.pow(tm/160,1.9); const y = h-30 - Math.min(150, (m-1)*80); ctx.lineTo(40+x,y);} ctx.stroke(); ctx.fillStyle='#9aa3ff'; ctx.fillText('Multiplier',10,14); } function tick(){ if(!running) return; t+=1; const m = 1 + Math.pow(t/160,1.9); multEl.textContent = m.toFixed(2)+'×'; draw(); if(m>=crashAt){ running=false; cashout.disabled=true; if(!cashed){ gameStatus.textContent=`Crashed at ${m.toFixed(2)}×. You lost.`; addTx('Crash Bet',bet,'completed'); } else { gameStatus.textContent=`Cashed at ${m.toFixed(2)}×. You won ${formatINR(gain)}.`; addTx('Crash Win',gain,'completed'); } save(); } else { requestAnimationFrame(tick); } } start.onclick = ()=>{ if(running) return; bet = Math.max(1, parseInt(betEl.value||'0')); if(state.user.balance{ if(!running||cashed) return; const m = 1 + Math.pow(t/160,1.9); cashed=true; gain=Math.floor(bet*(m-1)); state.user.balance += bet + gain; updateBalance(); cashout.disabled=true; } draw(); } // ---------------- BRAND & LEGAL BUTTONS ---------------- document.getElementById('brandBtn').onclick = ()=>{ const newName = prompt('Enter your casino brand name:', brandName) || brandName; setBrand(newName.trim()||brandName); } // ---------------- INIT ---------------- document.getElementById('year').textContent = new Date().getFullYear(); setBrand('LuckyEmpire'); renderAuth(); renderGames(); mockLeader(); updateBalance(); const initial = (location.hash||'#home').replace('#',''); show(routes.includes(initial)? initial : 'home'); </script>

    Releases

    No releases published

    Packages

    No packages published