{"id":15,"date":"2026-08-17T22:53:54","date_gmt":"2026-08-17T20:53:54","guid":{"rendered":"http:\/\/ixito.eu\/?page_id=15"},"modified":"2026-08-18T22:47:15","modified_gmt":"2026-08-18T20:47:15","slug":"one-armed-bo-ndit","status":"publish","type":"page","link":"https:\/\/ixito.eu\/index.php\/one-armed-bo-ndit\/","title":{"rendered":"One Armed Bo-ndit"},"content":{"rendered":"\n<!--\n====================================================================\n  EINARMIGER BANDIT \u2013 Gewinnspiel-Widget f\u00fcr WordPress (iframe-Version)\n====================================================================\n\nWAS IST DAS?\nEin kleines Spiel (\"einarmiger Bandit\" \/ Spielautomat), das du per\n\"Benutzerdefiniertes HTML\"-Block (Custom HTML Block) in eine\nWordPress-Seite oder einen Beitrag einf\u00fcgen kannst.\n\nWIE EINBAUEN?\n1. In WordPress einen neuen Block \"Benutzerdefiniertes HTML\" (Custom\n   HTML) einf\u00fcgen.\n2. Den GESAMTEN Inhalt dieser Datei hineinkopieren.\n3. Ver\u00f6ffentlichen\/Aktualisieren. Fertig \u2013 das Widget ist einsatzbereit.\n\nWARUM STECKT ALLES IN EINEM <iframe>?\nAuf ixito.eu (und generell bei vielen WordPress-Seiten mit Performance-\noder Caching-Plugins, z. B. WP Rocket, Autoptimize, LiteSpeed Cache,\nPerfmatters, NitroPack, Jetpack Boost) werden <script>- und <style>-\nInhalte der Seite gerne automatisch \"kombiniert\" oder \"minifiziert\".\n\u00c4ltere\/einfachere Minifizierer verstehen dabei mehrzeilige JavaScript-\nTemplate-Strings (Backtick-Strings) nicht richtig und zerschneiden sie\nversehentlich \u2013 dann landen CSS-Farbwerte\/Selektoren wie \"#3b0f1a\" oder\n\"#eb-root\" au\u00dferhalb eines String-Kontexts im JavaScript, und der\nBrowser wirft einen Syntaxfehler wie \"'#' not followed by identifier\".\n\nEin <iframe srcdoc=\"...\"> umgeht dieses Problem vollst\u00e4ndig: F\u00fcr die\nHaupt-Seite ist das nur ein ganz normales HTML-Attribut (ein simpler\nText-String), kein <script>- oder <style>-Tag \u2013 Kombinier-\/Minifizierer\nder Hauptseite fassen es also gar nicht erst an. Innerhalb des Iframes\nl\u00e4uft das Widget als eigenst\u00e4ndiges, komplett unabh\u00e4ngiges Dokument mit\neigenem <style> und <script>, gesch\u00fctzt vor der Optimierung der\nrestlichen Seite.\n\nWIE PASSE ICH DIE GEWINNE AN?\nWeiter unten in der langen srcdoc=\"...\" Zeile findest du (per Suche,\nz. B. Strg+F im Text-Editor) den Text \"=== KONFIGURATION ===\". Dort\nliegt die Liste PRIZES mit Name, Emoji\/Icon und \"weight\" (Gewichtung:\nh\u00f6here Zahl = wird h\u00e4ufiger gezogen, wenn ein Gewinn ansteht). Die\nGewichtungen bilden \u2013 bei t\u00e4glichem Spielen \u2013 ungef\u00e4hr den gew\u00fcnschten\nRhythmus ab (z. B. Massage ~alle 3 Tage, Saunagang ~alle 4 Wochen,\nEuropapark als seltener Hauptgewinn). Achtung: Weil alles in einer\nAttribut-Zeile steht, sind Anf\u00fchrungszeichen dort als &quot; kodiert \u2013\ndas ist normal und kein Fehler, einfach vorsichtig mitten im Text\nbearbeiten und nichts an der Kodierung drumherum ver\u00e4ndern.\n\nWIE FUNKTIONIERT DIE GEWINN-LOGIK?\n- Ein Besucher darf beliebig oft am Hebel ziehen.\n- Die Gewinnchance pro Zug steigt LINEAR mit der Spielzeit: sie startet\n  bei einer kleinen Sockelchance (Standard: 3%) direkt beim ersten Zug\n  und w\u00e4chst gleichm\u00e4ssig, bis sie nach 10 Minuten Spielzeit (seit dem\n  ersten Zug des Tages) bei 100% liegt \u2013 ab dann gewinnt der n\u00e4chste\n  Zug garantiert.\n- Pro Kalendertag (00:00\u201324:00 Uhr, lokale Zeit des Browsers) ist genau\n  EIN Gewinn m\u00f6glich. Danach ist der Automat f\u00fcr den Rest des Tages\n  \"leer\", ganz egal wie oft noch gezogen wird.\n- Die Zuordnung \"wer hat wann gewonnen\" wird lokal im Browser des\n  jeweiligen Besuchers gespeichert. Das ist KEIN serverseitiges System.\n\nSOUND\nKleine Soundeffekte (Hebel, Walzen-Stopp, Gewinn\/Niete) werden direkt\nim Code erzeugt (Web Audio API) \u2013 keine externen Audiodateien n\u00f6tig.\nOben rechts im Automaten gibt es einen \ud83d\udd0a\/\ud83d\udd07-Schalter.\n\nH\u00d6HE DES IFRAMES\nDas Widget meldet seine H\u00f6he automatisch an die Elternseite (per\npostMessage), damit der Iframe genau passend mitw\u00e4chst \u2013 daf\u00fcr sorgt\ndas kleine <script> ganz unten in dieser Datei, direkt nach dem\n<iframe>-Tag. Bitte nicht entfernen.\n====================================================================\n-->\n<iframe id=\"eb-frame\" title=\"Einarmiger Bandit\" srcdoc=\"&lt;!DOCTYPE html&gt;\n&lt;html lang=&quot;de&quot;&gt;\n&lt;head&gt;\n&lt;meta charset=&quot;UTF-8&quot;&gt;\n&lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1&quot;&gt;\n&lt;style&gt;\n#eb-root.eb-root {\n    --eb-burgundy: #3b0f1a;\n    --eb-burgundy-dark: #22080e;\n    --eb-brass: #c9a24b;\n    --eb-brass-light: #e8c977;\n    --eb-ivory: #f3e9d2;\n    --eb-bulb: #ffc94d;\n    --eb-emerald: #17392a;\n    --eb-shadow: #120608;\n\n    --eb-font-display: 'EB-Anton', 'Arial Narrow', sans-serif;\n    --eb-font-body: 'EB-Baskerville', Georgia, serif;\n\n    max-width: 480px;\n    margin: 2rem auto;\n    padding: 0;\n    font-family: var(--eb-font-body);\n    color: var(--eb-ivory);\n    box-sizing: border-box;\n  }\n  #eb-root.eb-root, #eb-root.eb-root * { box-sizing: border-box; }\n\n  @font-face {\n    font-family: 'EB-Anton';\n    src: local('Anton');\n  }\n  @font-face {\n    font-family: 'EB-Baskerville';\n    src: local('Libre Baskerville'), local('Georgia');\n  }\n  @import url('https:\/\/fonts.googleapis.com\/css2?family=Anton&amp;family=Libre+Baskerville:ital,wght@0,400;0,700;1,400&amp;display=swap');\n  #eb-root.eb-root { --eb-font-display: 'Anton', 'Arial Narrow', sans-serif; --eb-font-body: 'Libre Baskerville', Georgia, serif; }\n\n  .eb-marquee {\n    background: linear-gradient(180deg, var(--eb-burgundy) 0%, var(--eb-burgundy-dark) 100%);\n    border: 3px solid var(--eb-brass);\n    border-bottom: none;\n    border-radius: 14px 14px 0 0;\n    padding: 0.9rem 1rem;\n    display: flex;\n    align-items: center;\n    gap: 0.6rem;\n    position: relative;\n  }\n  .eb-title {\n    font-family: var(--eb-font-display);\n    font-weight: 400;\n    letter-spacing: 0.06em;\n    font-size: clamp(1.4rem, 5.5vw, 2rem);\n    text-align: center;\n    color: var(--eb-brass-light);\n    text-shadow: 0 0 10px rgba(232,201,119,0.45), 0 2px 0 var(--eb-shadow);\n    margin: 0;\n    flex: 1;\n    text-transform: uppercase;\n  }\n  .eb-bulbs {\n    height: 10px;\n    flex: 0 0 34px;\n    background-image: radial-gradient(circle, var(--eb-bulb) 0 3px, transparent 3.5px);\n    background-size: 12px 12px;\n    background-repeat: repeat-x;\n    background-position: center;\n    animation: eb-chase 900ms steps(2) infinite;\n    opacity: 0.9;\n  }\n  @keyframes eb-chase {\n    0% { background-position: 0 center; }\n    100% { background-position: 12px center; }\n  }\n\n  .eb-mute {\n    flex: 0 0 auto;\n    background: rgba(0,0,0,0.25);\n    border: 1px solid var(--eb-brass);\n    border-radius: 50%;\n    width: 28px;\n    height: 28px;\n    font-size: 0.9rem;\n    line-height: 1;\n    cursor: pointer;\n    color: var(--eb-ivory);\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    position: absolute;\n    right: 0.7rem;\n    top: 0.7rem;\n  }\n  .eb-mute:hover { background: rgba(0,0,0,0.4); }\n\n  .eb-cabinet {\n    background: radial-gradient(120% 100% at 50% 0%, #4a1420 0%, var(--eb-burgundy-dark) 70%);\n    border: 3px solid var(--eb-brass);\n    border-top: none;\n    border-radius: 0 0 14px 14px;\n    padding: 1.1rem 1rem 1.4rem;\n    display: flex;\n    gap: 0.8rem;\n    align-items: stretch;\n    box-shadow: 0 14px 30px rgba(0,0,0,0.45), inset 0 0 40px rgba(0,0,0,0.35);\n  }\n  .eb-cabinet-inner { flex: 1; min-width: 0; }\n\n  .eb-reels {\n    display: flex;\n    gap: 0.5rem;\n    background: var(--eb-emerald);\n    border: 3px solid var(--eb-brass);\n    border-radius: 10px;\n    padding: 0.6rem;\n  }\n  .eb-reel-window {\n    flex: 1;\n    height: 78px;\n    background: linear-gradient(180deg, #0c1f16, #1c3d2b 40%, #0c1f16);\n    border-radius: 6px;\n    overflow: hidden;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    box-shadow: inset 0 6px 10px rgba(0,0,0,0.5);\n  }\n  .eb-reel {\n    font-size: 2.6rem;\n    line-height: 1;\n    transition: transform 80ms linear;\n  }\n  .eb-reel.eb-spinning { animation: eb-blur 90ms linear infinite; }\n  @keyframes eb-blur { 0% { filter: blur(0); } 50% { filter: blur(2px); } 100% { filter: blur(0); } }\n\n  .eb-plate {\n    margin-top: 0.8rem;\n    background: var(--eb-ivory);\n    color: var(--eb-burgundy-dark);\n    border-radius: 8px;\n    padding: 0.6rem 0.8rem;\n    text-align: center;\n    box-shadow: inset 0 0 0 2px var(--eb-brass);\n  }\n  .eb-status {\n    margin: 0;\n    font-size: 0.92rem;\n    line-height: 1.35;\n    min-height: 2.4em;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n  }\n\n  .eb-lever {\n    flex: 0 0 46px;\n    background: linear-gradient(180deg, #2a2a2a, #111);\n    border: 2px solid var(--eb-brass);\n    border-radius: 23px;\n    position: relative;\n    cursor: pointer;\n    padding: 0;\n    display: flex;\n    justify-content: center;\n    align-items: flex-start;\n    overflow: hidden;\n  }\n  .eb-lever:disabled { cursor: not-allowed; opacity: 0.6; }\n  .eb-lever-rail {\n    width: 6px;\n    height: 100%;\n    background: linear-gradient(180deg, var(--eb-brass-light), var(--eb-brass) 60%, #7a5f27);\n    border-radius: 4px;\n    position: absolute;\n    top: 0;\n  }\n  .eb-lever-knob {\n    width: 34px;\n    height: 34px;\n    border-radius: 50%;\n    background: radial-gradient(circle at 35% 30%, #ff5b5b, #a40f1f 65%, #5c0910);\n    border: 2px solid var(--eb-brass-light);\n    box-shadow: 0 3px 6px rgba(0,0,0,0.5);\n    position: relative;\n    top: 6px;\n    transition: top 220ms cubic-bezier(.36,1.9,.4,1);\n  }\n  .eb-lever.eb-pulled .eb-lever-knob { top: calc(100% - 40px); }\n\n  .eb-fineprint {\n    text-align: center;\n    font-size: 0.72rem;\n    opacity: 0.65;\n    margin: 0.6rem 0 0;\n    font-family: var(--eb-font-body);\n  }\n\n  .eb-ticket-overlay {\n    position: fixed;\n    inset: 0;\n    background: rgba(10,4,5,0.72);\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    z-index: 9999;\n    padding: 1rem;\n  }\n  \/* WICHTIG: sorgt daf\u00fcr, dass das [hidden]-Attribut das Overlay wirklich\n     versteckt (sonst gewinnt die display:flex-Regel oben). *\/\n  .eb-ticket-overlay[hidden] {\n    display: none !important;\n  }\n  .eb-ticket {\n    background: var(--eb-ivory);\n    color: var(--eb-burgundy-dark);\n    border: 3px solid var(--eb-brass);\n    border-radius: 12px;\n    padding: 1.6rem 1.4rem;\n    max-width: 320px;\n    width: 100%;\n    text-align: center;\n    box-shadow: 0 20px 50px rgba(0,0,0,0.5);\n    animation: eb-pop 260ms ease-out;\n  }\n  @keyframes eb-pop {\n    0% { transform: scale(0.85); opacity: 0; }\n    100% { transform: scale(1); opacity: 1; }\n  }\n  .eb-ticket-eyebrow {\n    font-family: var(--eb-font-display);\n    letter-spacing: 0.12em;\n    text-transform: uppercase;\n    color: #a40f1f;\n    margin: 0 0 0.3rem;\n    font-size: 0.95rem;\n  }\n  .eb-ticket-emoji { font-size: 2.6rem; margin: 0.2rem 0; }\n  .eb-ticket-name { font-weight: 700; font-size: 1.15rem; margin: 0 0 1rem; }\n  .eb-ticket-close {\n    font-family: var(--eb-font-body);\n    background: var(--eb-burgundy);\n    color: var(--eb-ivory);\n    border: none;\n    border-radius: 6px;\n    padding: 0.55rem 1.1rem;\n    cursor: pointer;\n    font-size: 0.95rem;\n  }\n  .eb-ticket-close:hover { background: var(--eb-burgundy-dark); }\n\n  @media (max-width: 360px) {\n    .eb-title { letter-spacing: 0.03em; }\n    .eb-reel-window { height: 64px; }\n    .eb-reel { font-size: 2.1rem; }\n  }\nbody { margin: 0; padding: 0; background: transparent; }\n.eb-root { margin: 0 auto; }\n&lt;\/style&gt;\n&lt;\/head&gt;\n&lt;body&gt;\n&lt;div id=&quot;eb-root&quot; class=&quot;eb-root&quot;&gt;\n  &lt;div class=&quot;eb-marquee&quot;&gt;\n    &lt;div class=&quot;eb-bulbs&quot; aria-hidden=&quot;true&quot;&gt;&lt;\/div&gt;\n    &lt;h2 class=&quot;eb-title&quot;&gt;Einarmiger Bondit&lt;\/h2&gt;\n    &lt;div class=&quot;eb-bulbs&quot; aria-hidden=&quot;true&quot;&gt;&lt;\/div&gt;\n    &lt;button id=&quot;eb-mute&quot; class=&quot;eb-mute&quot; aria-label=&quot;Ton ausschalten&quot; title=&quot;Ton ein\/aus&quot;&gt;\ud83d\udd0a&lt;\/button&gt;\n  &lt;\/div&gt;\n\n  &lt;div class=&quot;eb-cabinet&quot;&gt;\n    &lt;div class=&quot;eb-cabinet-inner&quot;&gt;\n      &lt;div class=&quot;eb-reels&quot; id=&quot;eb-reels&quot;&gt;\n        &lt;div class=&quot;eb-reel-window&quot;&gt;&lt;div class=&quot;eb-reel&quot; id=&quot;eb-reel-0&quot;&gt;&lt;span&gt;\ud83c\udf52&lt;\/span&gt;&lt;\/div&gt;&lt;\/div&gt;\n        &lt;div class=&quot;eb-reel-window&quot;&gt;&lt;div class=&quot;eb-reel&quot; id=&quot;eb-reel-1&quot;&gt;&lt;span&gt;\ud83c\udf4b&lt;\/span&gt;&lt;\/div&gt;&lt;\/div&gt;\n        &lt;div class=&quot;eb-reel-window&quot;&gt;&lt;div class=&quot;eb-reel&quot; id=&quot;eb-reel-2&quot;&gt;&lt;span&gt;\u2b50&lt;\/span&gt;&lt;\/div&gt;&lt;\/div&gt;\n      &lt;\/div&gt;\n\n      &lt;div class=&quot;eb-plate&quot;&gt;\n        &lt;p id=&quot;eb-status&quot; class=&quot;eb-status&quot;&gt;Ziehe den Hebel und versuch dein Gl\u00fcck.&lt;\/p&gt;\n      &lt;\/div&gt;\n    &lt;\/div&gt;\n\n    &lt;button id=&quot;eb-lever&quot; class=&quot;eb-lever&quot; aria-label=&quot;Hebel ziehen, um zu spielen&quot;&gt;\n      &lt;span class=&quot;eb-lever-rail&quot;&gt;&lt;\/span&gt;\n      &lt;span class=&quot;eb-lever-knob&quot;&gt;&lt;\/span&gt;\n    &lt;\/button&gt;\n  &lt;\/div&gt;\n\n  &lt;p class=&quot;eb-fineprint&quot;&gt;Maximal ein Gewinn pro Tag (00:00\u201324:00 Uhr).&lt;\/p&gt;\n\n  &lt;div id=&quot;eb-ticket&quot; class=&quot;eb-ticket-overlay&quot; hidden&gt;\n    &lt;div class=&quot;eb-ticket&quot;&gt;\n      &lt;p class=&quot;eb-ticket-eyebrow&quot;&gt;Treffer!&lt;\/p&gt;\n      &lt;p class=&quot;eb-ticket-emoji&quot; id=&quot;eb-ticket-emoji&quot;&gt;\ud83c\udf89&lt;\/p&gt;\n      &lt;p class=&quot;eb-ticket-name&quot; id=&quot;eb-ticket-name&quot;&gt;Gewinn&lt;\/p&gt;\n      &lt;button id=&quot;eb-ticket-close&quot; class=&quot;eb-ticket-close&quot;&gt;Super, danke!&lt;\/button&gt;\n    &lt;\/div&gt;\n  &lt;\/div&gt;\n&lt;\/div&gt;\n&lt;script&gt;\n(function () {\n  &quot;use strict&quot;;\n  &quot;use strict&quot;;\n\n  \/* ================== KONFIGURATION \u2013 HIER ANPASSEN ================== *\/\n\n  \/\/ Deine Gewinne. &quot;weight&quot; = relative Wahrscheinlichkeit (h\u00f6here Zahl =\n  \/\/ wird h\u00e4ufiger gezogen, wenn ein Gewinn ansteht).\n  \/\/\n  \/\/ Faustregel f\u00fcr die Gewichtung: weight \u2248 100 \/ Zielintervall_in_Tagen.\n  \/\/ Wenn z. B. etwas im Schnitt alle 7 Tage vorkommen soll, ergibt das\n  \/\/ weight \u2248 100\/7 \u2248 14. So bilden die Zahlen unten die gew\u00fcnschten\n  \/\/ Rhythmen ab (Saunagang alle 4 Wochen, Massage alle 3 Tage, usw.) \u2013\n  \/\/ das gilt allerdings nur, WENN tats\u00e4chlich an jedem Tag ein Gewinn\n  \/\/ f\u00e4llt (siehe Gewinnchance weiter unten). Bei selteneren Spielrunden\n  \/\/ strecken sich alle Intervalle entsprechend.\n  var PRIZES = [\n    { name: &quot;Saunagang&quot;, emoji: &quot;\u2668\ufe0f&quot;, weight: 4 },              \/\/ ~alle 28 Tage\n    { name: &quot;Massage&quot;, emoji: &quot;\ud83d\udc86&quot;, weight: 33 },                \/\/ ~alle 3 Tage\n    { name: &quot;Matcha Latte oder Kaffee trinken&quot;, emoji: &quot;\ud83c\udf75&quot;, weight: 33 }, \/\/ ~alle 3 Tage\n    { name: &quot;Kinky Session&quot;, emoji: &quot;\ud83d\udd25&quot;, weight: 14 },          \/\/ ~alle 7 Tage\n    { name: &quot;Europapark&quot;, emoji: &quot;\ud83c\udfa2&quot;, weight: 1 },              \/\/ Hauptgewinn, super selten\n    { name: &quot;Acid Day&quot;, emoji: &quot;\ud83c\udf08&quot;, weight: 4 },                \/\/ ~alle 28 Tage\n    { name: &quot;Ein Kuss&quot;, emoji: &quot;\ud83d\udc8b&quot;, weight: 100 },              \/\/ sehr h\u00e4ufig\n    { name: &quot;Eine Umarmung&quot;, emoji: &quot;\ud83e\udd17&quot;, weight: 100 },         \/\/ sehr h\u00e4ufig\n    { name: &quot;Gemeinsamer Spaziergang&quot;, emoji: &quot;\ud83d\udeb6\u200d\u2640\ufe0f&quot;, weight: 67 }, \/\/ sehr h\u00e4ufig\n    { name: &quot;Vorlesen&quot;, emoji: &quot;\ud83d\udcd6&quot;, weight: 67 },               \/\/ sehr h\u00e4ufig\n    { name: &quot;Kino oder Theater&quot;, emoji: &quot;\ud83c\udfad&quot;, weight: 14 },      \/\/ ~alle 7 Tage\n    { name: &quot;Kunstmuseum&quot;, emoji: &quot;\ud83d\uddbc\ufe0f&quot;, weight: 7 },             \/\/ ~alle 2 Wochen\n    { name: &quot;Filmabend&quot;, emoji: &quot;\ud83c\udf7f&quot;, weight: 25 }               \/\/ h\u00e4ufiger, ~alle 4 Tage\n  ];\n\n  \/\/ ---- Gewinnwahrscheinlichkeit: linear, mit kleinem Sockel ----\n  \/\/ Startet bei WIN_CHANCE_START (Sockelchance, sobald man zu spielen\n  \/\/ beginnt) und steigt linear (also gleichm\u00e4ssig, nicht progressiv) bis\n  \/\/ auf 100% nach MINUTES_UNTIL_GUARANTEED_WIN Minuten Spielzeit.\n  var WIN_CHANCE_START = 0.03;           \/\/ 3% Sockelchance ab dem 1. Zug\n  var MINUTES_UNTIL_GUARANTEED_WIN = 10; \/\/ ab hier: garantierter Gewinn\n\n  \/\/ Wie viele Gewinne darf ein Besucher pro Kalendertag maximal bekommen?\n  var MAX_WINS_PER_DAY = 1;\n\n  \/* ============ AB HIER NUR \u00c4NDERN, WENN DU DICH AUSKENNST ============ *\/\n\n  var STORAGE_KEY = &quot;eb_bandit_state_v1&quot;;\n  var REEL_SYMBOLS = [&quot;\ud83c\udf52&quot;, &quot;\ud83c\udf4b&quot;, &quot;\ud83d\udd14&quot;, &quot;\u2b50&quot;, &quot;\ud83c\udf40&quot;, &quot;7\ufe0f\u20e3&quot;];\n  var WIN_SYMBOL = &quot;\ud83c\udf40&quot;;\n\n  var root = document.getElementById(&quot;eb-root&quot;);\n  var lever = document.getElementById(&quot;eb-lever&quot;);\n  var statusEl = document.getElementById(&quot;eb-status&quot;);\n  var reelEls = [\n    document.getElementById(&quot;eb-reel-0&quot;),\n    document.getElementById(&quot;eb-reel-1&quot;),\n    document.getElementById(&quot;eb-reel-2&quot;)\n  ];\n  var ticketOverlay = document.getElementById(&quot;eb-ticket&quot;);\n  var ticketEmoji = document.getElementById(&quot;eb-ticket-emoji&quot;);\n  var ticketName = document.getElementById(&quot;eb-ticket-name&quot;);\n  var ticketClose = document.getElementById(&quot;eb-ticket-close&quot;);\n  var muteBtn = document.getElementById(&quot;eb-mute&quot;);\n\n  var spinning = false;\n\n  \/* ---------------------- Sound-Effekte (ohne Audiodateien) ---------------------- *\/\n  var SOUND_PREF_KEY = &quot;eb_bandit_sound_v1&quot;;\n  var soundOn = true;\n  try {\n    var storedPref = localStorage.getItem(SOUND_PREF_KEY);\n    if (storedPref !== null) soundOn = storedPref === &quot;on&quot;;\n  } catch (e) { \/* ignorieren, Standard bleibt an *\/ }\n\n  var audioCtx = null;\n  function getAudioCtx() {\n    var AC = window.AudioContext || window.webkitAudioContext;\n    if (!AC) return null;\n    if (!audioCtx) audioCtx = new AC();\n    if (audioCtx.state === &quot;suspended&quot;) audioCtx.resume();\n    return audioCtx;\n  }\n\n  function playTone(freq, duration, type, volume, delay) {\n    if (!soundOn) return;\n    var ctx = getAudioCtx();\n    if (!ctx) return;\n    var startTime = ctx.currentTime + (delay || 0);\n    var osc = ctx.createOscillator();\n    var gain = ctx.createGain();\n    osc.type = type || &quot;sine&quot;;\n    osc.frequency.setValueAtTime(freq, startTime);\n    gain.gain.setValueAtTime(volume || 0.15, startTime);\n    gain.gain.exponentialRampToValueAtTime(0.001, startTime + duration);\n    osc.connect(gain);\n    gain.connect(ctx.destination);\n    osc.start(startTime);\n    osc.stop(startTime + duration + 0.02);\n  }\n\n  function playLeverSound() { playTone(140, 0.18, &quot;square&quot;, 0.18); }\n  function playReelStopSound() { playTone(700, 0.07, &quot;square&quot;, 0.1); }\n  function playWinSound() {\n    [523.25, 659.25, 783.99, 1046.5].forEach(function (freq, i) {\n      playTone(freq, 0.28, &quot;sine&quot;, 0.2, i * 0.12);\n    });\n  }\n  function playLoseSound() { playTone(160, 0.35, &quot;sawtooth&quot;, 0.09); }\n\n  function updateMuteButton() {\n    muteBtn.textContent = soundOn ? &quot;\ud83d\udd0a&quot; : &quot;\ud83d\udd07&quot;;\n    muteBtn.setAttribute(&quot;aria-label&quot;, soundOn ? &quot;Ton ausschalten&quot; : &quot;Ton einschalten&quot;);\n  }\n  updateMuteButton();\n\n  muteBtn.addEventListener(&quot;click&quot;, function () {\n    soundOn = !soundOn;\n    updateMuteButton();\n    try { localStorage.setItem(SOUND_PREF_KEY, soundOn ? &quot;on&quot; : &quot;off&quot;); } catch (e) { \/* ignore *\/ }\n    if (soundOn) playReelStopSound(); \/\/ kurzes Feedback beim Einschalten\n  });\n  \/* -------------------------------------------------------------------------------- *\/\n\n  function todayString() {\n    return new Date().toDateString();\n  }\n\n  function loadState() {\n    var raw;\n    try {\n      raw = localStorage.getItem(STORAGE_KEY);\n    } catch (e) {\n      raw = null;\n    }\n    var state = raw ? JSON.parse(raw) : null;\n    var today = todayString();\n    if (!state || state.date !== today) {\n      state = { date: today, firstSpinAt: null, winsToday: 0 };\n    }\n    return state;\n  }\n\n  function saveState(state) {\n    try {\n      localStorage.setItem(STORAGE_KEY, JSON.stringify(state));\n    } catch (e) {\n      \/* Speicher evtl. nicht verf\u00fcgbar (z. B. privater Modus) \u2013 Spiel\n         funktioniert dann weiterhin, aber ohne Tageslimit-Merkfunktion. *\/\n    }\n  }\n\n  function winChanceAt(elapsedMs) {\n    var elapsedMin = elapsedMs \/ 60000;\n    if (elapsedMin &gt;= MINUTES_UNTIL_GUARANTEED_WIN) return 1;\n    var t = elapsedMin \/ MINUTES_UNTIL_GUARANTEED_WIN;\n    return WIN_CHANCE_START + (1 - WIN_CHANCE_START) * t;\n  }\n\n  \/* ---------------------------------------------------------------------\n     &quot;Toter Blinddarm&quot; \ud83e\udeb1 \u2013 alte, PROGRESSIVE Variante der Gewinnkurve\n     (schneller Anstieg am Anfang, dann flacher). Wird aktuell NICHT\n     verwendet (siehe winChanceAt() oben, die ist jetzt rein linear).\n     Bleibt hier nur als Ersatzteil\/Referenz liegen, falls sie sp\u00e4ter\n     mal wieder gebraucht wird.\n\n  var WIN_CHANCE_CURVE = [\n    { minutes: 0, chance: 0.20 },\n    { minutes: 1, chance: 0.60 },\n    { minutes: 10, chance: 1.00 }\n  ];\n\n  function winChanceAt_PROGRESSIV(elapsedMs) {\n    var elapsedMin = elapsedMs \/ 60000;\n    var curve = WIN_CHANCE_CURVE;\n    if (elapsedMin &lt;= curve[0].minutes) return curve[0].chance;\n    if (elapsedMin &gt;= curve[curve.length - 1].minutes) {\n      return curve[curve.length - 1].chance;\n    }\n    for (var i = 0; i &lt; curve.length - 1; i++) {\n      var a = curve[i], b = curve[i + 1];\n      if (elapsedMin &gt;= a.minutes &amp;&amp; elapsedMin &lt;= b.minutes) {\n        var t = (elapsedMin - a.minutes) \/ (b.minutes - a.minutes);\n        return a.chance + (b.chance - a.chance) * t;\n      }\n    }\n    return curve[curve.length - 1].chance;\n  }\n  --------------------------------------------------------------------- *\/\n\n  function weightedPrize() {\n    var total = PRIZES.reduce(function (sum, p) { return sum + p.weight; }, 0);\n    var r = Math.random() * total;\n    for (var i = 0; i &lt; PRIZES.length; i++) {\n      r -= PRIZES[i].weight;\n      if (r &lt;= 0) return PRIZES[i];\n    }\n    return PRIZES[PRIZES.length - 1];\n  }\n\n  function randomSymbol() {\n    return REEL_SYMBOLS[Math.floor(Math.random() * REEL_SYMBOLS.length)];\n  }\n\n  function randomLosingSet() {\n    \/\/ Drei Symbole, die garantiert NICHT alle gleich sind.\n    var a = randomSymbol(), b = randomSymbol(), c = randomSymbol();\n    if (a === b &amp;&amp; b === c) {\n      c = REEL_SYMBOLS[(REEL_SYMBOLS.indexOf(c) + 1) % REEL_SYMBOLS.length];\n    }\n    return [a, b, c];\n  }\n\n  function formatCountdown(ms) {\n    var totalSec = Math.max(0, Math.ceil(ms \/ 1000));\n    var m = Math.floor(totalSec \/ 60);\n    var s = totalSec % 60;\n    return m + &quot;:&quot; + (s &lt; 10 ? &quot;0&quot; : &quot;&quot;) + s;\n  }\n\n  function refreshStatus() {\n    var state = loadState();\n    if (state.winsToday &gt;= MAX_WINS_PER_DAY) {\n      statusEl.textContent = &quot;F\u00fcr heute ist der Automat leer \\u2013 schau morgen wieder vorbei f\u00fcr fette Gewinne!&quot;;\n      return;\n    }\n    if (!state.firstSpinAt) {\n      var startChance = Math.round(winChanceAt(0) * 100);\n      statusEl.textContent = &quot;Ziehe den Hebel \\u2013 aktuelle Gewinnchance: &quot; + startChance + &quot;%.&quot;;\n      return;\n    }\n    var elapsed = Date.now() - state.firstSpinAt;\n    var chance = winChanceAt(elapsed);\n    if (chance &gt;= 1) {\n      statusEl.textContent = &quot;Dein Gl\u00fcckstag \\u2013 der n\u00e4chste Zug gewinnt garantiert!&quot;;\n    } else {\n      statusEl.textContent = &quot;Aktuelle Gewinnchance: &quot; + Math.round(chance * 100) + &quot;%.&quot;;\n    }\n  }\n\n  function setReelSymbol(i, symbol) {\n    var span = reelEls[i].querySelector(&quot;span&quot;);\n    if (span) {\n      span.textContent = symbol;\n    } else {\n      reelEls[i].textContent = symbol;\n    }\n  }\n\n  function spin() {\n    if (spinning) return;\n    spinning = true;\n    lever.disabled = true;\n    lever.classList.add(&quot;eb-pulled&quot;);\n    playLeverSound();\n\n    var state = loadState();\n    if (!state.firstSpinAt) {\n      state.firstSpinAt = Date.now();\n      saveState(state);\n    }\n\n    var elapsed = Date.now() - state.firstSpinAt;\n    var chance = winChanceAt(elapsed);\n    var eligibleForWin = state.winsToday &lt; MAX_WINS_PER_DAY;\n\n    var willWin = eligibleForWin &amp;&amp; Math.random() &lt; chance;\n    var prize = willWin ? weightedPrize() : null;\n    var finalSymbols = willWin ? [WIN_SYMBOL, WIN_SYMBOL, WIN_SYMBOL] : randomLosingSet();\n\n    reelEls.forEach(function (el) { el.classList.add(&quot;eb-spinning&quot;); });\n\n    var spinTimers = [];\n    reelEls.forEach(function (el, i) {\n      spinTimers[i] = setInterval(function () {\n        setReelSymbol(i, randomSymbol());\n      }, 60);\n    });\n\n    var stopDelays = [700, 1100, 1500];\n    reelEls.forEach(function (el, i) {\n      setTimeout(function () {\n        clearInterval(spinTimers[i]);\n        el.classList.remove(&quot;eb-spinning&quot;);\n        setReelSymbol(i, finalSymbols[i]);\n        playReelStopSound();\n\n        if (i === reelEls.length - 1) {\n          lever.classList.remove(&quot;eb-pulled&quot;);\n          lever.disabled = false;\n          spinning = false;\n\n          if (willWin) {\n            var freshState = loadState();\n            freshState.winsToday += 1;\n            saveState(freshState);\n            playWinSound();\n            showTicket(prize);\n          } else {\n            playLoseSound();\n          }\n          refreshStatus();\n        }\n      }, stopDelays[i]);\n    });\n  }\n\n  function showTicket(prize) {\n    ticketEmoji.textContent = prize.emoji;\n    ticketName.textContent = prize.name;\n    ticketOverlay.hidden = false;\n  }\n\n  function hideTicket() {\n    ticketOverlay.hidden = true;\n  }\n\n  lever.addEventListener(&quot;click&quot;, spin);\n  ticketClose.addEventListener(&quot;click&quot;, hideTicket);\n  ticketOverlay.addEventListener(&quot;click&quot;, function (e) {\n    if (e.target === ticketOverlay) hideTicket();\n  });\n\n  refreshStatus();\n  setInterval(refreshStatus, 1000);\n\n  \/* Meldet die Widget-H\u00f6he an die Elternseite, damit der Iframe passend\n     mitw\u00e4chst (siehe Resize-Listener im \u00e4u\u00dferen &lt;script&gt; weiter unten). *\/\n  function reportHeight() {\n    try {\n      var h = document.body.scrollHeight;\n      window.parent.postMessage({ ebBanditHeight: h }, &quot;*&quot;);\n    } catch (e) { \/* ignore *\/ }\n  }\n  window.addEventListener(&quot;load&quot;, reportHeight);\n  window.addEventListener(&quot;resize&quot;, reportHeight);\n  setTimeout(reportHeight, 300);\n  setTimeout(reportHeight, 1200); \/\/ nochmal nach Web-Font-Ladezeit\n\n})();\n&lt;\/script&gt;\n&lt;\/body&gt;\n&lt;\/html&gt;\" sandbox=\"allow-scripts allow-same-origin\" style=\"display:block;width:100%;max-width:520px;margin:2rem auto;border:0;height:600px;\" scrolling=\"no\"><\/iframe>\n<script>\n(function () {\n  window.addEventListener(\"message\", function (event) {\n    if (event && event.data && typeof event.data.ebBanditHeight === \"number\") {\n      var frame = document.getElementById(\"eb-frame\");\n      if (frame) frame.style.height = event.data.ebBanditHeight + \"px\";\n    }\n  });\n})();\n<\/script>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-15","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/ixito.eu\/index.php\/wp-json\/wp\/v2\/pages\/15","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ixito.eu\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/ixito.eu\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/ixito.eu\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ixito.eu\/index.php\/wp-json\/wp\/v2\/comments?post=15"}],"version-history":[{"count":6,"href":"https:\/\/ixito.eu\/index.php\/wp-json\/wp\/v2\/pages\/15\/revisions"}],"predecessor-version":[{"id":30,"href":"https:\/\/ixito.eu\/index.php\/wp-json\/wp\/v2\/pages\/15\/revisions\/30"}],"wp:attachment":[{"href":"https:\/\/ixito.eu\/index.php\/wp-json\/wp\/v2\/media?parent=15"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}