{"id":493,"date":"2026-03-04T15:44:46","date_gmt":"2026-03-04T15:44:46","guid":{"rendered":"https:\/\/grossenoix.com\/?page_id=493"},"modified":"2026-03-04T16:07:02","modified_gmt":"2026-03-04T16:07:02","slug":"slotts","status":"publish","type":"page","link":"https:\/\/grossenoix.com\/index.php\/slotts\/","title":{"rendered":"Slotts"},"content":{"rendered":"\n<!--\nBEAT THE JESTERS \u2014 Court of Chaos Slots (CLEAN \/ COMPLETE \/ WP-PASTE)\n\u2705 Single block: paste in WP HTML editor\n\u2705 No external libs\n\u2705 Uses your assets + your UI style\n\u2705 LocalStorage save\n\u2705 Jester modifiers affect payouts (multMod) + chaos system\n-->\n\n<style>\n#btj-app-wrapper{position:fixed;inset:0;z-index:999999;overflow-y:auto;background:#000;font-family:ui-sans-serif,system-ui,-apple-system,Segoe UI,Roboto,Arial,sans-serif;color:#efeaff;-webkit-tap-highlight-color:transparent}\n#btj-app-wrapper *{box-sizing:border-box}\n#btj-app-wrapper{--bg:#07060b;--text:#efeaff;--muted:#bdb4e6;--gold:#d6b46b;--purple:#a76bff;--purple2:#6f2dff;--ok:#4dffb3;--bad:#ff4d6d;--shadow:0 18px 60px rgba(0,0,0,.55);--r:20px;--r2:16px;--footerH:70px}\n\n.bgMedia{position:fixed;inset:0;z-index:1;background:url('https:\/\/grossenoix.com\/wp-content\/uploads\/2026\/03\/b02.jpg') center\/cover no-repeat;transform:scale(1.05)}\n.bgShade{position:fixed;inset:0;z-index:2;background:radial-gradient(100vw 100vh at 50% 30%,rgba(167,107,255,.15),transparent 62%),linear-gradient(180deg,rgba(7,6,11,.6) 0%,rgba(4,3,10,.95) 100%);pointer-events:none}\n\n.btj-wrap{position:relative;z-index:10;max-width:860px;margin:0 auto;padding:16px 12px calc(var(--footerH) + 20px);min-height:100vh;display:flex;flex-direction:column}\n\n.hud{position:sticky;top:0;z-index:20;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);background:rgba(7,6,11,.75);border-bottom:1px solid rgba(255,255,255,.10)}\n.hudInner{max-width:860px;margin:0 auto;padding:12px 16px;display:flex;gap:12px;align-items:center;justify-content:space-between;flex-wrap:wrap}\n.logo-container{display:flex;align-items:center;gap:12px;flex:1 1 100%;justify-content:center}\n@media (min-width:600px){.logo-container{flex:0 1 auto;justify-content:flex-start}}\n.logo-img{height:49px;width:auto;display:block}\n.logo{font-weight:950;letter-spacing:.10em;text-transform:uppercase;color:var(--gold);font-size:14px;line-height:1.15;text-shadow:0 0 22px rgba(167,107,255,.18)}\n.logo span{display:block;margin-top:2px;color:rgba(239,234,255,.78);letter-spacing:.20em;font-size:9px;font-weight:850}\n.hudRight{display:flex;gap:8px;align-items:center;flex-wrap:wrap;justify-content:center;width:100%}\n@media (min-width:600px){.hudRight{width:auto;justify-content:flex-end}}\n\n.pill{border:1px solid rgba(255,255,255,.12);background:rgba(20,16,39,.6);padding:6px 10px;border-radius:999px;color:var(--muted);font-size:11px;display:flex;gap:6px;align-items:center;justify-content:center}\n.pill b{color:var(--text)}\n.pill-btn{cursor:pointer;transition:background .15s ease,border-color .15s ease;user-select:none}\n.pill-btn:hover{background:rgba(167,107,255,.15);border-color:rgba(167,107,255,.35)}\n.pill-btn:active{background:rgba(167,107,255,.25)}\n\n.btj-btn{border:1px solid rgba(167,107,255,.35);background:linear-gradient(180deg,rgba(167,107,255,.25),rgba(111,45,255,.20));color:var(--text);padding:12px 16px;border-radius:12px;cursor:pointer;font-weight:900;font-size:14px;transition:transform .1s ease,border-color .15s ease,opacity .15s ease,background .15s ease;user-select:none;touch-action:manipulation;text-align:center}\n.btj-btn:hover:not(:disabled){transform:translateY(-1px);border-color:rgba(214,180,107,.55);background:linear-gradient(180deg,rgba(167,107,255,.35),rgba(111,45,255,.30))}\n.btj-btn:active:not(:disabled){transform:translateY(0)}\n.btj-btn.secondary{border-color:rgba(214,180,107,.35);background:linear-gradient(180deg,rgba(214,180,107,.20),rgba(20,16,39,.60))}\n.btj-btn.ghost{background:transparent;border-color:rgba(255,255,255,.14);box-shadow:none;padding:12px}\n.btj-btn.full{width:100%;margin-top:12px}\n.btj-btn:disabled{opacity:.4;cursor:not-allowed}\n\n.card{margin:auto 0;border:1px solid rgba(255,255,255,.12);background:rgba(10,8,16,.70);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border-radius:var(--r);box-shadow:var(--shadow);padding:16px;position:relative;overflow:hidden;width:100%}\n.sectionTitle{display:flex;align-items:center;justify-content:space-between;gap:10px;margin:0 0 10px;flex-wrap:wrap}\n.sectionTitle h2{margin:0;font-size:15px;letter-spacing:.12em;text-transform:uppercase;color:var(--gold);font-weight:950}\n.small{font-size:13px;color:rgba(239,234,255,.7);line-height:1.5}\n.divider{height:1px;background:linear-gradient(90deg,transparent,rgba(255,255,255,.15),transparent);margin:16px 0}\n.field{display:flex;flex-direction:column;gap:6px;margin-top:10px}\n.field label{font-size:11px;color:var(--muted);letter-spacing:.10em;text-transform:uppercase;font-weight:950}\n.field input{width:100%;border-radius:12px;border:1px solid rgba(255,255,255,.15);background:rgba(0,0,0,.4);color:var(--text);padding:14px 12px;outline:none;font-size:16px;transition:border-color .2s}\n.field input:focus{border-color:rgba(214,180,107,.55)}\n.row{display:flex;gap:10px;flex-wrap:wrap;margin-top:12px;align-items:center}\n\n.centerStage{display:grid;place-items:center;padding:10px 0;text-align:center}\n.heroTitle{font-size:clamp(24px,6vw,32px);font-weight:950;margin:0;letter-spacing:.02em;text-shadow:0 4px 12px rgba(0,0,0,.8)}\n.heroSub{margin:8px 0 0;color:rgba(239,234,255,.9);font-size:clamp(14px,3.5vw,16px);line-height:1.55;text-shadow:0 2px 8px rgba(0,0,0,.8)}\n\n.creditBtns,.betBtns{display:grid;grid-template-columns:repeat(auto-fit,minmax(110px,1fr));gap:10px;margin-top:12px}\n.cbtn,.bbtn{border:1px solid rgba(255,255,255,.12);border-radius:12px;padding:12px 10px;background:rgba(20,16,39,.5);text-align:center;cursor:pointer;user-select:none;transition:transform .10s ease,border-color .15s ease,background .15s ease;touch-action:manipulation}\n.cbtn:hover,.bbtn:hover{transform:translateY(-2px);border-color:rgba(214,180,107,.40)}\n.cbtn.active,.bbtn.active{border-color:rgba(214,180,107,.75);background:rgba(214,180,107,.20);box-shadow:0 0 12px rgba(214,180,107,.15)}\n.cbtn .k{font-size:10px;color:rgba(239,234,255,.7);letter-spacing:.12em;text-transform:uppercase;font-weight:950}\n.cbtn .v{margin-top:6px;font-weight:950;font-size:15px;color:var(--text)}\n.bbtn{font-size:15px;font-weight:950}\n\n.jesterGrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:12px;margin-top:12px}\n.jesterTile{border:1px solid rgba(255,255,255,.12);border-radius:16px;padding:12px;background:rgba(20,16,39,.5);cursor:pointer;transition:transform .10s ease,border-color .15s ease,background .15s ease;position:relative;overflow:hidden;user-select:none;touch-action:manipulation;display:flex;flex-direction:column;justify-content:space-between}\n.jesterTile:hover{transform:translateY(-2px);border-color:rgba(214,180,107,.45)}\n.jesterTile.active{border-color:rgba(214,180,107,.75);background:rgba(214,180,107,.15);box-shadow:0 0 15px rgba(214,180,107,.1)}\n.jesterTile .k{font-size:10px;color:rgba(239,234,255,.6);letter-spacing:.12em;text-transform:uppercase;font-weight:950}\n.jesterTile .v{margin-top:4px;font-weight:950;color:var(--gold);font-size:14px}\n.jesterTile .n{margin-top:4px;font-size:11px;color:rgba(239,234,255,.8);line-height:1.4;flex-grow:1}\n.jMedia{margin-top:10px;border-radius:10px;overflow:hidden;display:block;aspect-ratio:1\/1}\n.jMedia img{width:100%;height:100%;display:block;object-fit:cover;object-position:50% top}\n\n.arena{margin-top:16px;border:1px dashed rgba(214,180,107,.30);border-radius:16px;padding:16px;background:rgba(0,0,0,.2)}\n.kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:10px}\n.kpi{border:1px solid rgba(255,255,255,.12);border-radius:14px;padding:12px;background:rgba(20,16,39,.5);text-align:center}\n.kpi .k{font-size:10px;color:rgba(239,234,255,.6);letter-spacing:.10em;text-transform:uppercase;font-weight:950}\n.kpi .v{margin-top:6px;font-size:16px;font-weight:950;color:var(--gold)}\n.hr{height:8px;border-radius:999px;background:rgba(255,255,255,.1);overflow:hidden;border:1px solid rgba(255,255,255,.05);margin-top:10px}\n.barFill{height:100%;width:0%;background:linear-gradient(90deg,rgba(255,77,109,.45),rgba(214,180,107,.9));transition:width .3s ease}\n\n.slotReels{display:grid;grid-template-columns:repeat(3,1fr);gap:12px}\n.slotCell{border:1px solid rgba(255,255,255,.12);border-radius:16px;padding:12px;background:rgba(0,0,0,.35);text-align:center}\n.slotCell .lbl{font-size:10px;color:rgba(239,234,255,.6);letter-spacing:.12em;text-transform:uppercase;font-weight:900;margin-bottom:10px}\n.slotCell img{width:100%;aspect-ratio:1\/1;object-fit:cover;border-radius:14px;border:1px solid rgba(255,255,255,.12);background:rgba(0,0,0,.35)}\n.logBox{border:1px solid rgba(255,255,255,.08);border-radius:16px;background:rgba(0,0,0,.35);padding:12px;font-size:13px;color:rgba(239,234,255,.85);line-height:1.55}\n.logBox b{color:var(--gold)}\n\n.footer{position:fixed;left:0;right:0;bottom:0;height:var(--footerH);z-index:20;border-top:1px solid rgba(255,255,255,.10);background:rgba(7,6,11,.85);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);display:flex;flex-direction:column;justify-content:center}\n.footerInner{max-width:860px;margin:0 auto;width:100%;padding:10px 16px;display:flex;gap:12px;align-items:center;justify-content:space-between}\n.progWrap{flex:1;width:100%}\n.progLine{height:8px;border-radius:999px;background:rgba(255,255,255,.10);overflow:hidden}\n.progFill{height:100%;width:0%;background:linear-gradient(90deg,var(--purple),var(--gold));transition:width .3s ease}\n.progLbl{display:flex;justify-content:space-between;gap:8px;margin-top:6px;font-size:10px;color:rgba(239,234,255,.6);letter-spacing:.12em;text-transform:uppercase;font-weight:900}\n\n.winOverlay{position:fixed;inset:0;z-index:1000000;display:none;place-items:center;background:radial-gradient(100vw 100vh at 50% 50%,rgba(77,255,179,.15),rgba(0,0,0,.85));backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px)}\n.winOverlay.on{display:grid}\n.winCard{width:min(420px,92vw);border-radius:24px;border:1px solid rgba(77,255,179,.3);background:rgba(10,8,16,.92);box-shadow:0 20px 80px rgba(0,0,0,.8);padding:30px 22px;position:relative;overflow:hidden;text-align:center;animation:pop .3s cubic-bezier(.175,.885,.32,1.275)}\n@keyframes pop{from{transform:scale(.8);opacity:0}to{transform:scale(1);opacity:1}}\n.winCard h3{margin:0;font-size:26px;font-weight:950;color:var(--ok)}\n.winCard p{margin:12px 0 0;color:var(--text);line-height:1.55;font-size:16px}\n<\/style>\n\n<div id=\"btj-app-wrapper\">\n  <div class=\"bgMedia\" id=\"bgMedia\"><\/div>\n  <div class=\"bgShade\"><\/div>\n\n  <div class=\"hud\">\n    <div class=\"hudInner\">\n      <div class=\"logo-container\">\n        <img decoding=\"async\" src=\"https:\/\/grossenoix.com\/wp-content\/uploads\/2026\/03\/logo-web01.png\" alt=\"Beat The Jesters Logo\" class=\"logo-img\" id=\"mainLogoImg\">\n        <div class=\"logo\">BEAT THE JESTERS <span>COURT OF CHAOS SLOTS<\/span><\/div>\n      <\/div>\n      <div class=\"hudRight\">\n        <div class=\"pill\">User: <b id=\"uiUser\">Guest<\/b><\/div>\n        <div class=\"pill\">Credits: <b id=\"uiCredits\">0<\/b><\/div>\n        <div class=\"pill pill-btn\" id=\"btnAddCredits\" style=\"color:var(--gold);border-color:rgba(214,180,107,.30)\">+ Add Credits<\/div>\n        <button type=\"button\" class=\"btj-btn ghost\" id=\"btnReset\" style=\"padding:6px 12px;font-size:12px\">Reset<\/button>\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <div class=\"btj-wrap\">\n\n    <!-- STEP 1 -->\n    <section class=\"card\" id=\"secWelcome\">\n      <div class=\"centerStage\">\n        <div style=\"width:min(460px,100%)\">\n          <h1 class=\"heroTitle\">Welcome.<\/h1>\n          <p class=\"heroSub\">Register and select your demo bankroll.<\/p>\n          <p class=\"small\" style=\"color:var(--muted);margin-bottom:22px\">\n            Enter the Court. Pick a Jester. Spin into chaos.\n          <\/p>\n\n          <div class=\"divider\"><\/div>\n\n          <div class=\"field\" style=\"text-align:left\">\n            <label>1. Username<\/label>\n            <input type=\"text\" id=\"inUser\" placeholder=\"e.g. GrosseNoix\" maxlength=\"24\">\n          <\/div>\n\n          <div class=\"field\" style=\"text-align:left;margin-top:18px\">\n            <label>2. Select Demo Bankroll<\/label>\n            <div class=\"creditBtns\" id=\"creditBtns\"><\/div>\n          <\/div>\n\n          <div class=\"row\" style=\"margin-top:20px\">\n            <button type=\"button\" class=\"btj-btn full\" id=\"btnNext1\" disabled>Lock In &amp; Continue \u2192<\/button>\n          <\/div>\n        <\/div>\n      <\/div>\n    <\/section>\n\n    <!-- STEP 2 -->\n    <section class=\"card\" id=\"secJesters\" style=\"display:none\">\n      <div class=\"sectionTitle\">\n        <h2>Step 2: Choose Your Jester<\/h2>\n        <span class=\"pill\" style=\"background:rgba(0,0,0,.35)\">Payout mod only<\/span>\n      <\/div>\n      <div class=\"small\">Your Jester changes payout volatility. (This is a demo simulation.)<\/div>\n      <div class=\"jesterGrid\" id=\"jGrid\"><\/div>\n\n      <div class=\"divider\"><\/div>\n      <div class=\"row\">\n        <button type=\"button\" class=\"btj-btn ghost\" id=\"btnBack1\">\u2190 Back<\/button>\n        <button type=\"button\" class=\"btj-btn secondary\" id=\"btnNext2\" disabled>Next: Bet \u2192<\/button>\n      <\/div>\n    <\/section>\n\n    <!-- STEP 3 -->\n    <section class=\"card\" id=\"secBet\" style=\"display:none\">\n      <div class=\"sectionTitle\">\n        <h2>Step 3: Bet Amount<\/h2>\n        <span class=\"pill\">Game: <b>Slots<\/b><\/span>\n      <\/div>\n      <div class=\"small\">Choose a stake. You can also use <b>MAX SPIN<\/b> inside the cabinet.<\/div>\n      <div class=\"betBtns\" id=\"betBtns\"><\/div>\n\n      <div class=\"divider\"><\/div>\n      <div class=\"row\">\n        <button type=\"button\" class=\"btj-btn ghost\" id=\"btnBack2\">\u2190 Back<\/button>\n        <button type=\"button\" class=\"btj-btn\" id=\"btnEnterSlots\" disabled>Enter Slot Cabinet<\/button>\n      <\/div>\n    <\/section>\n\n    <!-- SLOTS -->\n    <section class=\"card\" id=\"secSlots\" style=\"display:none\">\n      <div class=\"sectionTitle\">\n        <h2>Court of Chaos Slots<\/h2>\n        <span id=\"slotTag\" style=\"background:rgba(214,180,107,.16);color:var(--gold);border:1px solid rgba(214,180,107,.35);font-weight:900;font-size:11px;padding:4px 10px;border-radius:999px\">READY<\/span>\n      <\/div>\n\n      <div class=\"arena\">\n        <div class=\"kpis\">\n          <div class=\"kpi\"><div class=\"k\">Bet<\/div><div class=\"v\" id=\"kBet\">\u2014<\/div><\/div>\n          <div class=\"kpi\"><div class=\"k\">Jester<\/div><div class=\"v\" id=\"kJester\" style=\"font-size:14px;margin-top:8px\">\u2014<\/div><\/div>\n          <div class=\"kpi\"><div class=\"k\">Chaos<\/div><div class=\"v\" id=\"kChaos\">0%<\/div><\/div>\n          <div class=\"kpi\"><div class=\"k\">Live Mult<\/div><div class=\"v\" id=\"kMult\">x1.00<\/div><\/div>\n        <\/div>\n\n        <div style=\"margin-top:14px\">\n          <div class=\"small\" style=\"font-weight:800;color:var(--text)\">Chaos Meter<\/div>\n          <div class=\"hr\"><div class=\"barFill\" id=\"chaosFill\"><\/div><\/div>\n        <\/div>\n\n        <div class=\"divider\"><\/div>\n\n        <div class=\"slotReels\">\n          <div class=\"slotCell\">\n            <div class=\"lbl\">Reel 1<\/div>\n            <img id=\"slotImg0\" alt=\"\">\n          <\/div>\n          <div class=\"slotCell\">\n            <div class=\"lbl\">Reel 2<\/div>\n            <img id=\"slotImg1\" alt=\"\">\n          <\/div>\n          <div class=\"slotCell\">\n            <div class=\"lbl\">Reel 3<\/div>\n            <img id=\"slotImg2\" alt=\"\">\n          <\/div>\n        <\/div>\n\n        <div class=\"divider\"><\/div>\n\n        <div class=\"row\" style=\"margin-top:0\">\n          <button type=\"button\" class=\"btj-btn\" id=\"btnSpin\" style=\"flex:1\">SPIN<\/button>\n          <button type=\"button\" class=\"btj-btn secondary\" id=\"btnMax\" style=\"flex:1\">MAX SPIN<\/button>\n          <button type=\"button\" class=\"btj-btn ghost\" id=\"btnPeek\" style=\"flex:1;border-color:rgba(214,180,107,.25)\">Jester Peek<\/button>\n        <\/div>\n\n        <div class=\"row\" style=\"margin-top:10px\">\n          <button type=\"button\" class=\"btj-btn ghost\" id=\"btnBackSlots\" style=\"width:100%;border:1px solid rgba(255,255,255,.2)\">\u2190 Back to Bet<\/button>\n        <\/div>\n\n        <div class=\"divider\"><\/div>\n\n        <div class=\"logBox\" id=\"slotLog\"><b>Tip:<\/b> Chaos rises when you lose. Wins cool it down.<\/div>\n      <\/div>\n    <\/section>\n\n  <\/div>\n\n  <div class=\"footer\">\n    <div class=\"footerInner\">\n      <div class=\"progWrap\">\n        <div class=\"progLine\"><div class=\"progFill\" id=\"progFill\"><\/div><\/div>\n        <div class=\"progLbl\">\n          <span id=\"progLeft\">Setup<\/span>\n          <span id=\"progRight\">0%<\/span>\n        <\/div>\n      <\/div>\n      <button type=\"button\" class=\"btj-btn ghost\" id=\"btnHome\" style=\"padding:6px 12px;font-size:11px;opacity:.85\">Home<\/button>\n    <\/div>\n  <\/div>\n\n  <div class=\"winOverlay\" id=\"winOverlay\">\n    <div class=\"winCard\">\n      <h3 id=\"winTitle\">CHAOS WIN<\/h3>\n      <p id=\"winText\">+0 Credits<\/p>\n      <div class=\"row\" style=\"justify-content:center;margin-top:18px\">\n        <button type=\"button\" class=\"btj-btn\" id=\"btnWinClose\" style=\"width:100%\">Continue<\/button>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/div>\n\n<script>\n\/* =============================\n   CLEAN SLOT CABINET APP\n   ============================= *\/\n\nconst SKEY = \"btj_court_of_chaos_slots_v1\";\n\n\/* Assets + Jesters *\/\nconst CFG = {\n  logoUrl: \"https:\/\/grossenoix.com\/wp-content\/uploads\/2026\/03\/logo-web01.png\",\n  bgUrl: \"https:\/\/grossenoix.com\/wp-content\/uploads\/2026\/03\/b02.jpg\",\n  creditPacks: [\n    {usd:25, credits:2500},\n    {usd:50, credits:6000},\n    {usd:100, credits:15000}\n  ],\n  bets: [\n    {v:5, l:\"5 Cr\"},\n    {v:10,l:\"10 Cr\"},\n    {v:25,l:\"25 Cr\"},\n    {v:50,l:\"50 Cr\"},\n    {v:100,l:\"100 Cr\"},\n    {v:1000,l:\"MAX 1k\"}\n  ],\n  jesters: [\n    {id:\"money\",   zone:\"Money Zone\",   name:\"Cash Harvester\",     desc:\"Aggressive payouts.\", pMod:0.90, multMod:1.20, media:\"https:\/\/grossenoix.com\/wp-content\/uploads\/2026\/03\/J01.png\"},\n    {id:\"chips\",   zone:\"Chip Arena\",   name:\"Stack Architect\",    desc:\"Stable, lower pop.\",  pMod:1.15, multMod:0.85, media:\"https:\/\/grossenoix.com\/wp-content\/uploads\/2026\/03\/J02.png\"},\n    {id:\"cards\",   zone:\"Card Dominion\",name:\"Probability Dealer\", desc:\"High variance.\",      pMod:1.00, multMod:1.50, media:\"https:\/\/grossenoix.com\/wp-content\/uploads\/2026\/03\/J03.png\"},\n    {id:\"vip\",     zone:\"VIP Vault\",    name:\"Gatekeeper\",         desc:\"Balanced line.\",      pMod:1.05, multMod:1.05, media:\"https:\/\/grossenoix.com\/wp-content\/uploads\/2026\/03\/J04.png\"},\n    {id:\"supreme\", zone:\"Purple Core\",  name:\"Jester Supreme\",     desc:\"High risk, big pop.\", pMod:0.75, multMod:2.20, media:\"https:\/\/grossenoix.com\/wp-content\/uploads\/2026\/03\/J05.png\"}\n  ]\n};\n\n\/* Chaos Events *\/\nconst CHAOS_EVENTS = [\n  { id:\"lucky\",   name:\"Lucky Laugh\",  mult:1.75, msg:\"Bonus multiplier applied.\" },\n  { id:\"fake\",    name:\"Fool\u2019s Gold\",  mult:1.00, msg:\"One reel may lie mid-spin.\" },\n  { id:\"shuffle\", name:\"Chaos Spin\",   mult:1.00, msg:\"Higher chance of 2-of-kind.\" },\n  { id:\"cursed\",  name:\"Crown Theft\",  mult:0.55, msg:\"Cursed spin. Payouts weakened.\" }\n];\n\n\/* Paytable *\/\nconst PAY = {\n  match3: 6.0,\n  match2: 1.5,\n  none:   0.0\n};\n\nfunction clamp(n,a,b){ return Math.max(a, Math.min(b,n)); }\nfunction pick(arr){ return arr[Math.floor(Math.random()*arr.length)]; }\nfunction vib(ms){ try{ if(navigator.vibrate) navigator.vibrate(ms); }catch(e){} }\n\nfunction load(){\n  try{ const r=localStorage.getItem(SKEY); return r?JSON.parse(r):null; }\n  catch(e){ return null; }\n}\nfunction save(){\n  try{ localStorage.setItem(SKEY, JSON.stringify(state)); }catch(e){}\n  render();\n}\n\nlet state = load() || {\n  step: \"welcome\",  \/\/ welcome | jesters | bet | slots\n  user: null,\n  credits: 0,\n  creditPackUsd: null,\n  jesterId: null,\n  bet: null,\n  slot: { chaos: 0, liveMult: 1, lastEvent: null, rolling:false }\n};\n\n\/* UI refs *\/\nconst ui = {\n  bgMedia: document.getElementById(\"bgMedia\"),\n  mainLogoImg: document.getElementById(\"mainLogoImg\"),\n  uiUser: document.getElementById(\"uiUser\"),\n  uiCredits: document.getElementById(\"uiCredits\"),\n  progFill: document.getElementById(\"progFill\"),\n  progLeft: document.getElementById(\"progLeft\"),\n  progRight: document.getElementById(\"progRight\"),\n\n  secWelcome: document.getElementById(\"secWelcome\"),\n  secJesters: document.getElementById(\"secJesters\"),\n  secBet: document.getElementById(\"secBet\"),\n  secSlots: document.getElementById(\"secSlots\"),\n\n  inUser: document.getElementById(\"inUser\"),\n  creditBtns: document.getElementById(\"creditBtns\"),\n  btnNext1: document.getElementById(\"btnNext1\"),\n  jGrid: document.getElementById(\"jGrid\"),\n  btnNext2: document.getElementById(\"btnNext2\"),\n\n  betBtns: document.getElementById(\"betBtns\"),\n  btnEnterSlots: document.getElementById(\"btnEnterSlots\"),\n\n  kBet: document.getElementById(\"kBet\"),\n  kJester: document.getElementById(\"kJester\"),\n  kChaos: document.getElementById(\"kChaos\"),\n  kMult: document.getElementById(\"kMult\"),\n  chaosFill: document.getElementById(\"chaosFill\"),\n  slotImg0: document.getElementById(\"slotImg0\"),\n  slotImg1: document.getElementById(\"slotImg1\"),\n  slotImg2: document.getElementById(\"slotImg2\"),\n  slotLog: document.getElementById(\"slotLog\"),\n  slotTag: document.getElementById(\"slotTag\"),\n\n  winOverlay: document.getElementById(\"winOverlay\"),\n  winTitle: document.getElementById(\"winTitle\"),\n  winText: document.getElementById(\"winText\"),\n  btnWinClose: document.getElementById(\"btnWinClose\")\n};\n\nfunction selectedJester(){\n  return CFG.jesters.find(j=>j.id===state.jesterId) || null;\n}\n\nfunction setStep(step){\n  state.step = step;\n  save();\n}\n\nfunction renderProgress(){\n  let pct=0, left=\"Setup\";\n  if(state.step===\"welcome\"){pct=20; left=\"Setup\";}\n  if(state.step===\"jesters\"){pct=45; left=\"Jester\";}\n  if(state.step===\"bet\"){pct=65; left=\"Bet\";}\n  if(state.step===\"slots\"){pct=100; left=\"Slots\";}\n  ui.progFill.style.width = pct + \"%\";\n  ui.progLeft.textContent = left;\n  ui.progRight.textContent = Math.round(pct) + \"%\";\n}\n\nfunction render(){\n  ui.bgMedia.style.backgroundImage = `url('${CFG.bgUrl}')`;\n  ui.mainLogoImg.src = CFG.logoUrl;\n\n  ui.uiUser.textContent = state.user || \"Guest\";\n  ui.uiCredits.textContent = (state.credits||0).toLocaleString();\n\n  ui.secWelcome.style.display = (state.step===\"welcome\") ? \"block\" : \"none\";\n  ui.secJesters.style.display = (state.step===\"jesters\") ? \"block\" : \"none\";\n  ui.secBet.style.display     = (state.step===\"bet\") ? \"block\" : \"none\";\n  ui.secSlots.style.display   = (state.step===\"slots\") ? \"block\" : \"none\";\n\n  renderProgress();\n\n  if(state.step===\"welcome\"){\n    buildCreditBtns();\n    if(state.user && !ui.inUser.value) ui.inUser.value = state.user;\n    validateWelcome();\n  }\n\n  if(state.step===\"jesters\"){\n    buildJesters();\n    ui.btnNext2.disabled = !state.jesterId;\n  }\n\n  if(state.step===\"bet\"){\n    buildBetBtns();\n    ui.btnEnterSlots.disabled = !(state.bet && state.bet <= state.credits);\n  }\n\n  if(state.step===\"slots\"){\n    syncSlotsHUD();\n  }\n}\n\n\/* ========= Step 1 ========= *\/\nfunction buildCreditBtns(){\n  ui.creditBtns.innerHTML = \"\";\n  CFG.creditPacks.forEach(p=>{\n    const b = document.createElement(\"div\");\n    b.className = \"cbtn\" + (state.creditPackUsd===p.usd ? \" active\":\"\");\n    b.innerHTML = `<div class=\"k\">$${p.usd} Demo<\/div><div class=\"v\">${p.credits.toLocaleString()} Cr<\/div>`;\n    b.onclick = ()=>{ state.creditPackUsd = p.usd; validateWelcome(); save(); };\n    ui.creditBtns.appendChild(b);\n  });\n}\n\nfunction validateWelcome(){\n  const u = (ui.inUser.value||\"\").trim();\n  const ok = (u.length>=2 && !!state.creditPackUsd);\n  ui.btnNext1.disabled = !ok;\n}\n\nui.inUser.addEventListener(\"input\", validateWelcome);\n\ndocument.getElementById(\"btnReset\").onclick = ()=>{\n  localStorage.removeItem(SKEY);\n  location.reload();\n};\n\ndocument.getElementById(\"btnHome\").onclick = ()=>{\n  setStep(\"welcome\");\n};\n\ndocument.getElementById(\"btnAddCredits\").onclick = ()=>{\n  if(!state.user){ alert(\"Register first.\"); return; }\n  const pack = CFG.creditPacks[0]; \/\/ quick add default\n  state.credits += pack.credits;\n  save();\n  alert(`Added ${pack.credits.toLocaleString()} credits (demo).`);\n};\n\nui.btnNext1.onclick = ()=>{\n  state.user = (ui.inUser.value||\"\").trim();\n  if(!state.credits){\n    const p = CFG.creditPacks.find(x=>x.usd===state.creditPackUsd);\n    state.credits = p ? p.credits : 0;\n  }\n  setStep(\"jesters\");\n};\n\ndocument.getElementById(\"btnBack1\").onclick = ()=> setStep(\"welcome\");\n\n\/* ========= Step 2 ========= *\/\nfunction buildJesters(){\n  ui.jGrid.innerHTML = \"\";\n  CFG.jesters.forEach(j=>{\n    const t = document.createElement(\"div\");\n    t.className = \"jesterTile\" + (state.jesterId===j.id ? \" active\":\"\");\n    t.innerHTML = `\n      <div class=\"k\">${j.zone}<\/div>\n      <div class=\"v\">${j.name}<\/div>\n      <div class=\"n\">${j.desc}<br><span style=\"color:rgba(239,234,255,.65)\">Payout Mod: x${j.multMod}<\/span><\/div>\n      <div class=\"jMedia\"><img decoding=\"async\" src=\"${j.media}\" alt=\"${j.name}\"><\/div>\n    `;\n    t.onclick = ()=>{ state.jesterId = j.id; save(); };\n    ui.jGrid.appendChild(t);\n  });\n}\n\nui.btnNext2.onclick = ()=> setStep(\"bet\");\n\n\/* ========= Step 3 ========= *\/\nfunction buildBetBtns(){\n  ui.betBtns.innerHTML = \"\";\n  CFG.bets.forEach(b=>{\n    const btn = document.createElement(\"div\");\n    btn.className = \"bbtn\" + (state.bet===b.v ? \" active\":\"\");\n    btn.textContent = b.l;\n    btn.onclick = ()=>{\n      if(state.credits < b.v){ alert(\"Insufficient credits. Use + Add Credits.\"); return; }\n      state.bet = b.v;\n      save();\n    };\n    ui.betBtns.appendChild(btn);\n  });\n}\n\ndocument.getElementById(\"btnBack2\").onclick = ()=> setStep(\"jesters\");\n\nui.btnEnterSlots.onclick = ()=>{\n  if(!(state.bet && state.bet <= state.credits)) return;\n  setStep(\"slots\");\n};\n\n\/* ========= Slots Engine ========= *\/\nfunction symbols(){\n  \/\/ Use jester images as symbols (brand-consistent)\n  return CFG.jesters.map(j=>({id:j.id, name:j.name, img:j.media}));\n}\n\nfunction ensureSlotImages(){\n  const syms = symbols();\n  if(!ui.slotImg0.src) ui.slotImg0.src = syms[0].img;\n  if(!ui.slotImg1.src) ui.slotImg1.src = syms[1].img;\n  if(!ui.slotImg2.src) ui.slotImg2.src = syms[2].img;\n}\n\nfunction syncSlotsHUD(){\n  const j = selectedJester();\n  ui.kBet.textContent = (state.bet||0) + \" Cr\";\n  ui.kJester.textContent = j ? j.name : \"\u2014\";\n  ui.kChaos.textContent = Math.round(state.slot.chaos||0) + \"%\";\n  ui.kMult.textContent = \"x\" + (Number(state.slot.liveMult||1)).toFixed(2);\n  ui.chaosFill.style.width = clamp(state.slot.chaos||0,0,100) + \"%\";\n  ui.slotTag.textContent = state.slot.rolling ? \"SPINNING\" : \"READY\";\n  ensureSlotImages();\n}\n\nfunction countMatch(a,b,c){\n  if(a===b && b===c) return 3;\n  if(a===b || b===c || a===c) return 2;\n  return 0;\n}\n\nfunction maybeChaos(){\n  const chaos = clamp(state.slot.chaos||0,0,100);\n  const p = clamp(chaos \/ 130, 0, 0.85);\n  if(Math.random() < p) return pick(CHAOS_EVENTS);\n  return null;\n}\n\nasync function spin(isMax){\n  if(state.slot.rolling) return;\n\n  const cost = isMax ? Math.min(1000, Math.max(50, (state.bet||10)*5)) : (state.bet||10);\n  if(state.credits < cost){ alert(\"Insufficient credits. Use + Add Credits.\"); return; }\n\n  \/\/ Spend\n  state.credits -= cost;\n\n  \/\/ Chaos update\n  state.slot.chaos = clamp((state.slot.chaos||0) + (isMax ? 18 : 10), 0, 100);\n\n  const evt = maybeChaos();\n\n  \/\/ Final symbols\n  const syms = symbols();\n  let final = [pick(syms), pick(syms), pick(syms)];\n\n  if(evt &#038;&#038; evt.id===\"shuffle\"){\n    if(Math.random() < 0.6) final[2] = final[1];\n  }\n\n  \/\/ Rolling animation\n  state.slot.rolling = true;\n  save();\n  vib(20);\n\n  const imgs = [ui.slotImg0, ui.slotImg1, ui.slotImg2];\n  const start = Date.now();\n  const it = setInterval(()=>{\n    imgs.forEach(im=>{ const r = pick(syms); im.src = r.img; im.alt = r.name; });\n\n    \/\/ Fake symbol event: show a liar reel during rolling (visual trick only)\n    if(evt && evt.id===\"fake\"){\n      const liar = Math.floor(Math.random()*3);\n      const f = pick(syms);\n      imgs[liar].src = f.img;\n    }\n\n    if(Date.now()-start > 900) clearInterval(it);\n  }, 90);\n\n  await new Promise(r=>setTimeout(r, 980));\n  imgs[0].src = final[0].img; vib(10);\n  await new Promise(r=>setTimeout(r, 170));\n  imgs[1].src = final[1].img; vib(10);\n  await new Promise(r=>setTimeout(r, 170));\n  imgs[2].src = final[2].img; vib(15);\n\n  \/\/ Compute payout\n  const m = countMatch(final[0].id, final[1].id, final[2].id);\n  const baseMult = (m===3) ? PAY.match3 : (m===2) ? PAY.match2 : PAY.none;\n\n  const j = selectedJester();\n  const jMult = j ? Number(j.multMod||1) : 1;\n  const chaosMult = evt ? Number(evt.mult||1) : 1;\n\n  const totalMult = baseMult * jMult * chaosMult;\n  state.slot.liveMult = totalMult || 1;\n\n  const win = Math.round(cost * totalMult);\n\n  \/\/ Outcome effects\n  if(win > 0){\n    state.credits += win;\n    state.slot.chaos = clamp(state.slot.chaos - 22, 0, 100);\n    ui.slotLog.innerHTML = `<b>WIN<\/b> \u2022 +${win.toLocaleString()} credits \u2022 mult ${totalMult.toFixed(2)}x` + (evt ? `<br><b>Chaos:<\/b> ${evt.name} \u2014 ${evt.msg}` : \"\");\n    ui.winTitle.textContent = \"CHAOS WIN\";\n    ui.winText.textContent = `+${win.toLocaleString()} Credits`;\n    ui.winOverlay.classList.add(\"on\");\n  } else {\n    state.slot.chaos = clamp(state.slot.chaos + 6, 0, 100);\n    ui.slotLog.innerHTML = `<b>LOSE<\/b> \u2022 No match.` + (evt ? `<br><b>Chaos:<\/b> ${evt.name} \u2014 ${evt.msg}` : \"\");\n  }\n\n  state.slot.rolling = false;\n  save();\n}\n\ndocument.getElementById(\"btnSpin\").onclick = ()=> spin(false);\ndocument.getElementById(\"btnMax\").onclick  = ()=> spin(true);\n\ndocument.getElementById(\"btnPeek\").onclick = ()=>{\n  const j = selectedJester();\n  const chaos = clamp(state.slot.chaos||0,0,100);\n  let hint = \"Calm court.\";\n  if(chaos >= 70) hint = \"Chaos imminent. Expect rule-breaking.\";\n  else if(chaos >= 35) hint = \"Warming up. Tricks likely soon.\";\n  ui.slotLog.innerHTML = `<b>Jester Peek:<\/b> ${j ? j.name : \"\u2014\"} \u2022 Payout Mod x${j ? j.multMod : \"\u2014\"}<br>${hint}`;\n  vib(10);\n};\n\ndocument.getElementById(\"btnBackSlots\").onclick = ()=> setStep(\"bet\");\n\nui.btnWinClose.onclick = ()=> ui.winOverlay.classList.remove(\"on\");\n\n\/* Boot *\/\nrender();\n<\/script>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>BEAT THE JESTERS COURT OF CHAOS SLOTS User: Guest Credits: 0 + Add Credits Reset Welcome. Register and select your demo bankroll. Enter the Court. Pick a Jester. Spin into chaos. 1. Username 2. Select Demo Bankroll Lock In &amp; Continue \u2192 Step 2: Choose Your Jester Payout mod only Your Jester changes payout volatility. [&#8230;]\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"page-blank-landingpage.php","meta":{"footnotes":""},"class_list":["post-493","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/grossenoix.com\/index.php\/wp-json\/wp\/v2\/pages\/493","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/grossenoix.com\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/grossenoix.com\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/grossenoix.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/grossenoix.com\/index.php\/wp-json\/wp\/v2\/comments?post=493"}],"version-history":[{"count":6,"href":"https:\/\/grossenoix.com\/index.php\/wp-json\/wp\/v2\/pages\/493\/revisions"}],"predecessor-version":[{"id":502,"href":"https:\/\/grossenoix.com\/index.php\/wp-json\/wp\/v2\/pages\/493\/revisions\/502"}],"wp:attachment":[{"href":"https:\/\/grossenoix.com\/index.php\/wp-json\/wp\/v2\/media?parent=493"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}