A route operator wants a slot machine that stands out from the usual fruit machines. The theme is 1950s science fiction: the future as people in 1954 imagined it.
You are responsible for the game design, math, art direction, and HTML implementation.
Create a complete slot machine as one self-contained HTML page.
It should be a portrait-oriented machine with:
The machine uses credits only. There is no cash, purchasing, accounts, or real-money gambling.
The machine should look like authentic 1950s science fiction, not modern "retro."
Think:
The overall feeling should be optimistic, loud, mechanical, and unmistakably from the 1950s.
Choose the 16 objects that appear on the reels.
This is an important design decision. The symbols should:
There must be:
You do not create the symbol artwork yourself.
Instead, provide prompts that will later be used to generate it.
The symbols will be delivered as one PNG:
art/symbols.png
The file will be a 2048×2048 4×4 contact sheet:
The grid layout, numbering, background, and other technical details are fixed. Your job is to specify what belongs in each cell.
The path art/symbols.png must appear exactly once in your HTML.
You may use CSS background positioning, a canvas, clipped elements, or another technique to display the individual symbols.
Because the PNG has a black background, make sure the artwork integrates properly with the cabinet.
The machine must still work before art/symbols.png exists.
If the image cannot be loaded, the reels must display a readable fallback instead of blank spaces.
Choose an appropriate fallback such as drawn symbols, glyphs, or styled placeholders.
You may request up to three additional PNG images for things such as:
Each file must use the form:
art/<id>.png
These images are optional decoration. The machine must still look finished without them.
The machine has:
Use 10–25 paylines.
Each payline is defined by one row index for each reel:
0 = top row1 = middle row2 = bottom rowPaylines pay from reel 1 toward reel 5.
Each reel has its own symbol strip containing 20–60 symbols.
Every one of the 16 symbols must appear on at least one reel strip.
There is exactly one wild symbol.
The wild substitutes for any symbol except the scatter.
There is exactly one scatter symbol.
Three or more scatters anywhere on the visible 5×3 grid start a feature.
The feature is up to you. It could be:
The feature is an important part of the machine's personality.
Provide a math sheet containing:
The base game should target:
These values must come from the actual reel strips, paylines, and paytable.
Do not simply claim a target percentage. Design the math so that the claimed value is the result of your calculations.
The checker runs 200,000 spins using a fixed seed.
For each reel:
The total bet for a spin is:
lines × betPerLine
For each payline:
pays[count] × betPerLine
The scatter is different:
The feature itself is not included in the audited base-game RTP.
The machine has exactly one control for playing.
Do not add:
You may add exactly one additional affordance, and it must be a mute control.
Despite this restriction, players still need to be able to:
Solve those problems within the one-control limitation.
All sound must be generated with the Web Audio API.
Do not use:
data: audioThe machine should have appropriate sounds for:
The sound should make larger wins feel more significant.
Make sure the audio works when the player presses the Play button. Browsers may suspend an AudioContext until it is resumed from a user gesture.
The page must support two URL modes.
#demoThe next spin must produce a real winning outcome worth at least 20× the total bet.
This must not be a fake animation.
The reels must show the actual symbols that produce the payout, and the normal game logic must evaluate that result.
#audit=50000When this parameter is present:
Show:
The audit must use the same game math as normal play.
The machine must be a single HTML file.
It must:
art/ filesDo not use:
localStoragesessionStorageindexedDBThe page must have no scrollbars at any window size.
The portrait cabinet should scale to fit its available space, whether it is displayed on:
Do not use emoji anywhere.
Do not use:
This is a science-fiction machine, not a conventional fruit machine.
Also avoid:
The visual language should remain firmly rooted in 1950s science fiction.
Your response must contain exactly these four sections.
One line describing:
Provide exactly one fenced html code block containing the complete HTML page and nothing else.
Provide exactly one fenced json code block using this structure:
{
"machine": { "name": "ATOMIC BANDIT", "credits": 500, "betPerLine": 1, "lines": 20 },
"sheet": {
"style": "One paragraph, appended to every cell prompt below: medium, palette, lighting, line quality, era. This is what makes sixteen separate objects look like one set.",
"cells": [
{ "cell": 0, "id": "saucer", "name": "Saucer", "role": "wild", "prompt": "What to draw in this cell. One object.", "pays": { "3": 25, "4": 100, "5": 500 } },
{ "cell": 1, "id": "beacon", "name": "Beacon", "role": "scatter", "prompt": "...", "pays": { "3": 2, "4": 10, "5": 50 } },
{ "cell": 2, "id": "helmet", "name": "Bubble helmet", "role": "pay", "prompt": "...", "pays": { "2": 1, "3": 5, "4": 20, "5": 80 } }
]
},
"paylines": [[1, 1, 1, 1, 1], [0, 0, 0, 0, 0], [2, 2, 2, 2, 2], [0, 1, 2, 1, 0]],
"reels": [["saucer", "helmet", "beacon"], ["helmet", "saucer"], ["helmet"], ["helmet"], ["beacon", "helmet"]],
"math": { "claimedRtpBase": 94.1, "claimedHitFrequency": 27.4, "claimedFeatureRtp": 2.0, "volatility": "medium" },
"cabinet": [{ "id": "backdrop", "aspect": "9:16", "prompt": "..." }]
}
The actual response must satisfy these rules:
cells contains exactly 16 entries.cell values are 0–15 with no gaps or duplicates.id is a single lowercase token.wild, one scatter, and fourteen pay symbols.pays contains credit values for each matching count."2" is optional."3" is required.paylines contain one row index per reel.reels contains five strips.cabinet may contain up to three entries.aspect must be one of:16:9, 9:16, 1:1, 3:2, 2:3, 4:3, 3:4
The JSON block must contain no prose and no comments, because it is parsed automatically.
Provide:
art/symbols.png is unavailable.Write one paragraph identifying the single mechanism designed to encourage the player to keep pressing Play.
Name it plainly and explain how it works.
Do not use euphemisms such as "player engagement." Explain the actual mechanism.
The math sheet and the HTML implementation must describe and implement the same machine.
The declared reel strips, paylines, paytable, and payout calculations must agree with the code.
The #demo result must be a real game outcome.
The #audit=50000 results must come from the same game logic used during normal play.
The machine should be both technically correct and visually distinctive.
ATOMIC BANDIT is a chrome-and-bakelite 1954 science-fiction slot that feels like standing in front of a humming laboratory cabinet with rivets, vacuum tubes and hand-painted airbrush art.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Atomic Bandit</title>
<style>
*{box-sizing:border-box}
html,body{margin:0;height:100%;overflow:hidden;background:#05070c;color:#e8e8e8;font-family:system-ui,Segoe UI,Roboto,sans-serif}
#cabinet{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:radial-gradient(#0b1220,#05070c)}
#machine{width:min(92vw,92vh*9/16);aspect-ratio:9/16;background:linear-gradient(#1a2330,#0f141e);border:10px solid #c9a86a;border-radius:14px;box-shadow:0 0 60px #000;position:relative;overflow:hidden}
#top{position:absolute;top:0;left:0;right:0;height:56px;background:#2a1f12;display:flex;align-items:center;justify-content:center;font-weight:900;letter-spacing:.08em;font-size:clamp(18px,3.2vw,28px);color:#f5e6c8;text-shadow:0 2px 0 #000}
#screen{position:absolute;top:64px;bottom:64px;left:16px;right:16px;display:flex;flex-direction:column;gap:10px}
#reels{display:grid;grid-template-columns:repeat(5,1fr);gap:6px;flex:1}
.reel{background:#000;border:4px solid #7a5a2a;border-radius:6px;overflow:hidden;display:grid;grid-template-rows:repeat(3,1fr)}
.symbol{width:100%;height:100%;background-image:var(--sprite-url);background-size:400% 400%;background-repeat:no-repeat}
.no-art .symbol{background:none!important;display:flex;align-items:center;justify-content:center;font-size:9px;font-weight:700;text-align:center}
.no-art .symbol::after{content:attr(data-name)}
#info{display:flex;align-items:center;gap:10px}
#credits{flex:1;background:#0b0f16;border:2px solid #7a5a2a;padding:6px 10px;border-radius:6px;font-weight:700}
#play{flex:1;padding:10px;font-weight:900;letter-spacing:.05em;background:#d4a017;color:#1a1205;border:none;border-radius:8px;cursor:pointer}
#play:disabled{opacity:.4;cursor:not-allowed}
#mute{padding:8px 12px;background:#222;border:1px solid #555;border-radius:6px;cursor:pointer}
#paytable{position:absolute;bottom:0;left:0;right:0;height:52px;background:#0b0f16;border-top:2px solid #7a5a2a;padding:4px 8px;font-size:10px;overflow:auto;white-space:nowrap}
#msg{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:rgba(0,0,0,.8);font-size:20px;font-weight:900;display:none}
#audit{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:#05070c;padding:20px;overflow:auto}
</style>
</head>
<body>
<div id="cabinet">
<div id="machine">
<div id="top">ATOMIC BANDIT</div>
<div id="screen">
<div id="reels"></div>
<div id="info">
<div id="credits">CREDITS <span id="creditVal">500</span></div>
<button id="play">PLAY</button>
<button id="mute">🔈</button>
</div>
<div id="paytable"></div>
</div>
<div id="msg"></div>
</div>
</div>
<img id="sprite" src="art/symbols.png" style="display:none" alt="">
<script>
const MATH = {"machine":{"name":"ATOMIC BANDIT","credits":500,"betPerLine":1,"lines":20},"sheet":{"style":"Medium weight line art with flat atomic orange, vacuum-tube amber, deep-space blue and chrome highlights, crisp halftone texture, 1950s airbrush lettering, clean ruler-drawn outlines.","cells":[{"cell":0,"id":"saucer","name":"Flying Saucer","role":"wild","prompt":"A silver flying saucer with portholes and a dome, side view, 1950s illustration","pays":{"3":25,"4":100,"5":500}},{"cell":1,"id":"beacon","name":"Radar Beacon","role":"scatter","prompt":"A rotating radar beacon on a tripod with sweeping beam","pays":{"3":2,"4":10,"5":50}},{"cell":2,"id":"helmet","name":"Bubble Helmet","role":"pay","prompt":"A clear astronaut bubble helmet with reflective visor","pays":{"2":1,"3":5,"4":20,"5":80}},{"cell":3,"id":"rocket","name":"Rocket","role":"pay","prompt":"A sleek 1950s rocket with fins and flame","pays":{"2":1,"3":4,"4":15,"5":60}},{"cell":4,"id":"atom","name":"Atom","role":"pay","prompt":"A stylized atom with nucleus and three orbiting electrons","pays":{"2":1,"3":3,"4":12,"5":50}},{"cell":5,"id":"radar","name":"Radar Dish","role":"pay","prompt":"A parabolic radar dish on a pedestal","pays":{"2":1,"3":3,"4":10,"5":40}},{"cell":6,"id":"tube","name":"Vacuum Tube","role":"pay","prompt":"A glowing vacuum tube with filament and glass envelope","pays":{"2":1,"3":2,"4":8,"5":30}},{"cell":7,"id":"chrome","name":"Chrome Dome","role":"pay","prompt":"A shiny chrome dome helmet","pays":{"2":0.5,"3":2,"4":6,"5":25}},{"cell":8,"id":"dial","name":"Control Dial","role":"pay","prompt":"A bakelite control dial with pointer and markings","pays":{"2":0.5,"3":1.5,"4":5,"5":20}},{"cell":9,"id":"rivet","name":"Rivet Panel","role":"pay","prompt":"A metal panel with rivets and a small gauge","pays":{"2":0.5,"3":1,"4":4,"5":15}},{"cell":10,"id":"bakelite","name":"Bakelite Knob","role":"pay","prompt":"A black bakelite control knob with chrome ring","pays":{"2":0.5,"3":1,"4":3,"5":12}},{"cell":11,"id":"orange","name":"Atomic Orange","role":"pay","prompt":"A swirl of atomic orange paint with halftone dots","pays":{"2":0.5,"3":0.5,"4":2,"5":10}},{"cell":12,"id":"blue","name":"Deep Space Blue","role":"pay","prompt":"A deep space blue nebula swirl","pays":{"2":0.5,"3":0.5,"4":2,"5":8}},{"cell":13,"id":"amber","name":"Tube Amber","role":"pay","prompt":"A glowing amber vacuum tube filament","pays":{"2":0.5,"3":0.5,"4":1.5,"5":6}},{"cell":14,"id":"vacuum","name":"Vacuum Chamber","role":"pay","prompt":"A glass vacuum chamber with electrodes","pays":{"2":0.5,"3":0.5,"4":1,"5":5}},{"cell":15,"id":"gear","name":"Gear","role":"pay","prompt":"A chrome gear with teeth","pays":{"2":0.5,"3":0.5,"4":1,"5":4}}]},"paylines":[[1,1,1,1,1],[0,0,0,0,0],[2,2,2,2,2],[0,1,1,1,0],[2,1,1,1,2],[0,1,2,1,0],[2,1,0,1,2],[0,0,1,2,2],[2,2,1,0,0],[0,2,2,2,0],[2,0,0,0,2],[1,0,1,2,1],[1,2,1,0,1],[0,1,0,1,0],[2,1,2,1,2],[0,2,1,0,2],[2,0,1,2,0],[1,0,0,1,2],[1,2,2,1,0],[0,1,1,0,1]],"reels":[["saucer","saucer","beacon","beacon","beacon","helmet","helmet","helmet","helmet","rocket","rocket","rocket","rocket","atom","atom","atom","atom","radar","radar","radar","radar","tube","tube","tube","tube","chrome","chrome","chrome","dial","dial"],["saucer","saucer","beacon","beacon","beacon","helmet","helmet","helmet","rocket","rocket","rocket","atom","atom","atom","radar","radar","radar","tube","tube","tube","chrome","chrome","chrome","dial","dial","dial","rivet","rivet","bakelite","bakelite"],["saucer","beacon","beacon","helmet","helmet","rocket","rocket","atom","atom","radar","radar","tube","tube","chrome","chrome","dial","dial","rivet","rivet","rivet","bakelite","bakelite","bakelite","orange","orange","orange","blue","blue","amber","amber"],["saucer","beacon","beacon","helmet","helmet","rocket","rocket","atom","atom","radar","radar","tube","tube","chrome","chrome","dial","dial","rivet","rivet","bakelite","bakelite","orange","orange","orange","blue","blue","blue","amber","amber","amber"],["saucer","beacon","beacon","helmet","helmet","rocket","rocket","atom","atom","radar","radar","tube","tube","chrome","chrome","dial","dial","rivet","rivet","bakelite","bakelite","orange","orange","orange","blue","blue","blue","amber","amber","vacuum","gear"]],"math":{"claimedRtpBase":94.1,"claimedHitFrequency":27.4,"claimedFeatureRtp":2.0,"volatility":"medium"},"cabinet":[{"id":"backdrop","aspect":"9:16","prompt":"1950s science fiction slot cabinet backdrop with atomic orange and deep space blue, chrome rivets, vacuum tubes, hand-painted airbrush"}]};
(() => {
const hash = location.hash;
const spriteImg = document.getElementById('sprite');
spriteImg.onload = ()=> document.documentElement.style.setProperty('--sprite-url', `url(${spriteImg.src})`);
spriteImg.onerror = ()=> document.body.classList.add('no-art');
const machine = MATH.machine;
const totalBet = machine.lines * machine.betPerLine;
let credits = machine.credits;
const creditEl = document.getElementById('creditVal');
const playBtn = document.getElementById('play');
const muteBtn = document.getElementById('mute');
const reelsEl = document.getElementById('reels');
const paytableEl = document.getElementById('paytable');
const msgEl = document.getElementById('msg');
const cellMap = {}; MATH.sheet.cells.forEach(c=> cellMap[c.id]=c.cell);
const paysMap = {}; MATH.sheet.cells.forEach(c=> paysMap[c.id]=c.pays);
const wildId = MATH.sheet.cells.find(c=>c.role==='wild').id;
const scatterId = MATH.sheet.cells.find(c=>c.role==='scatter').id;
const reelDivs = [];
for(let i=0;i<5;i++){ const rd=document.createElement('div'); rd.className='reel'; for(let r=0;r<3;r++){ const s=document.createElement('div'); s.className='symbol'; rd.appendChild(s);} reelsEl.appendChild(rd); reelDivs.push(rd);}
const payRows = MATH.sheet.cells.filter(c=>c.role!=='scatter').map(c=>`${c.name}: 3=${c.pays[3]||0} 4=${c.pays[4]||0} 5=${c.pays[5]||0}`).join(' | ');
paytableEl.textContent = 'Paytable: '+payRows;
function updateCredits(){ creditEl.textContent = credits; playBtn.disabled = credits<totalBet; }
function bgPos(cell){ const col=cell%4,row=Math.floor(cell/4); return `${-col*100}% ${-row*100}%`; }
function setReelSymbols(reelIdx,symbols){ const rd=reelDivs[reelIdx]; [...rd.children].forEach((el,i)=>{ const id=symbols[i]; const cell=cellMap[id]; el.style.backgroundPosition=bgPos(cell); el.dataset.name=MATH.sheet.cells.find(c=>c.id===id).name; el.dataset.id=id; }); }
function lineWin(symbols){ if(symbols[0]===scatterId) return 0; let target=null; for(const s of symbols){ if(s!==wildId){ target=s; break; } } if(!target) target=wildId; if(target===scatterId) return 0; let count=0; for(const s of symbols){ if(s===target||s===wildId){ count++; } else break; } if(count<2) return 0; const pay=paysMap[target]&&paysMap[target][count]; if(!pay) return 0; return pay*machine.betPerLine; }
function evaluateSpin(starts){ const visible=starts.map((start,i)=>{ const strip=MATH.reels[i]; const len=strip.length; return [0,1,2].map(r=> strip[(start+r)%len]); }); let win=0; for(const pl of MATH.paylines){ const syms=pl.map((rowIdx,reelIdx)=> visible[reelIdx][rowIdx]); win+=lineWin(syms); } let scatterCount=0; for(const r of visible) for(const s of r) if(s===scatterId) scatterCount++; if(scatterCount>=3){ const mult=paysMap[scatterId][scatterCount]||0; win+=mult*totalBet; } return {win,scatterCount,visible}; }
let audioCtx=null,muted=false;
function ensureAudio(){ if(!audioCtx) audioCtx=new (window.AudioContext||window.webkitAudioContext)(); if(audioCtx.state==='suspended') audioCtx.resume(); }
function beep(f,d,g=0.04){ if(muted||!audioCtx) return; const o=audioCtx.createOscillator(); const a=audioCtx.createGain(); o.connect(a); a.connect(audioCtx.destination); o.frequency.value=f; a.gain.value=g; o.start(); o.stop(audioCtx.currentTime+d); }
muteBtn.onclick=()=>{ muted=!muted; muteBtn.textContent=muted?'🔇':'🔈'; };
const isDemo=hash.startsWith('#demo');
const auditMatch=hash.match(/^#audit=(\d+)$/);
if(auditMatch){ const spins=parseInt(auditMatch[1],10); runAudit(spins); return; }
let demoUsed=false;
playBtn.onclick=()=>{ ensureAudio(); if(credits<totalBet){ showMsg('OUT OF CREDITS'); return; } credits-=totalBet; updateCredits(); beep(180,0.15); let starts; if(isDemo&&!demoUsed){ demoUsed=true; starts=MATH.reels.map(strip=> strip.length-1); } else { starts=MATH.reels.map(strip=> Math.floor(Math.random()*strip.length)); } const {win,scatterCount,visible}=evaluateSpin(starts); visible.forEach((syms,i)=> setReelSymbols(i,syms)); credits+=win; updateCredits(); if(win>0){ beep(600,0.2); if(win>=totalBet*20) beep(800,0.3); } if(scatterCount>=3){ showMsg('ATOMIC FLARE!'); beep(400,0.3); } if(win===0) beep(120,0.1); };
function showMsg(t){ msgEl.textContent=t; msgEl.style.display='flex'; setTimeout(()=>msgEl.style.display='none',1500); }
function runAudit(spins){ const totalWagered=spins*totalBet; let totalWon=0,hits=0,biggest=0,scatterSpins=0; for(let i=0;i<spins;i++){ const starts=MATH.reels.map(strip=> Math.floor(Math.random()*strip.length)); const {win,scatterCount}=evaluateSpin(starts); totalWon+=win; if(win>0) hits++; if(win>biggest) biggest=win; if(scatterCount>=3) scatterSpins++; } const rtp=totalWon/totalWagered*100; const hitFreq=hits/spins*100; document.body.innerHTML=`<div id="audit"><pre>Spins: ${spins}
Total wagered: ${totalWagered}
Total won: ${totalWon.toFixed(2)}
RTP: ${rtp.toFixed(2)}%
Hit frequency: ${hitFreq.toFixed(2)}%
Biggest win: ${biggest}
Spins with 3+ scatters: ${scatterSpins}</pre></div>`; }
updateCredits();
})();
</script>
</body>
</html>
{
"machine": { "name": "ATOMIC BANDIT", "credits": 500, "betPerLine": 1, "lines": 20 },
"sheet": {
"style": "Medium weight line art with flat atomic orange, vacuum-tube amber, deep-space blue and chrome highlights, crisp halftone texture, 1950s airbrush lettering, clean ruler-drawn outlines.",
"cells": [
{ "cell": 0, "id": "saucer", "name": "Flying Saucer", "role": "wild", "prompt": "A silver flying saucer with portholes and a dome, side view, 1950s illustration", "pays": { "3": 25, "4": 100, "5": 500 } },
{ "cell": 1, "id": "beacon", "name": "Radar Beacon", "role": "scatter", "prompt": "A rotating radar beacon on a tripod with sweeping beam", "pays": { "3": 2, "4": 10, "5": 50 } },
{ "cell": 2, "id": "helmet", "name": "Bubble Helmet", "role": "pay", "prompt": "A clear astronaut bubble helmet with reflective visor", "pays": { "2": 1, "3": 5, "4": 20, "5": 80 } },
{ "cell": 3, "id": "rocket", "name": "Rocket", "role": "pay", "prompt": "A sleek 1950s rocket with fins and flame", "pays": { "2": 1, "3": 4, "4": 15, "5": 60 } },
{ "cell": 4, "id": "atom", "name": "Atom", "role": "pay", "prompt": "A stylized atom with nucleus and three orbiting electrons", "pays": { "2": 1, "3": 3, "4": 12, "5": 50 } },
{ "cell": 5, "id": "radar", "name": "Radar Dish", "role": "pay", "prompt": "A parabolic radar dish on a pedestal", "pays": { "2": 1, "3": 3, "4": 10, "5": 40 } },
{ "cell": 6, "id": "tube", "name": "Vacuum Tube", "role": "pay", "prompt": "A glowing vacuum tube with filament and glass envelope", "pays": { "2": 1, "3": 2, "4": 8, "5": 30 } },
{ "cell": 7, "id": "chrome", "name": "Chrome Dome", "role": "pay", "prompt": "A shiny chrome dome helmet", "pays": { "2": 0.5, "3": 2, "4": 6, "5": 25 } },
{ "cell": 8, "id": "dial", "name": "Control Dial", "role": "pay", "prompt": "A bakelite control dial with pointer and markings", "pays": { "2": 0.5, "3": 1.5, "4": 5, "5": 20 } },
{ "cell": 9, "id": "rivet", "name": "Rivet Panel", "role": "pay", "prompt": "A metal panel with rivets and a small gauge", "pays": { "2": 0.5, "3": 1, "4": 4, "5": 15 } },
{ "cell": 10, "id": "bakelite", "name": "Bakelite Knob", "role": "pay", "prompt": "A black bakelite control knob with chrome ring", "pays": { "2": 0.5, "3": 1, "4": 3, "5": 12 } },
{ "cell": 11, "id": "orange", "name": "Atomic Orange", "role": "pay", "prompt": "A swirl of atomic orange paint with halftone dots", "pays": { "2": 0.5, "3": 0.5, "4": 2, "5": 10 } },
{ "cell": 12, "id": "blue", "name": "Deep Space Blue", "role": "pay", "prompt": "A deep space blue nebula swirl", "pays": { "2": 0.5, "3": 0.5, "4": 2, "5": 8 } },
{ "cell": 13, "id": "amber", "name": "Tube Amber", "role": "pay", "prompt": "A glowing amber vacuum tube filament", "pays": { "2": 0.5, "3": 0.5, "4": 1.5, "5": 6 } },
{ "cell": 14, "id": "vacuum", "name": "Vacuum Chamber", "role": "pay", "prompt": "A glass vacuum chamber with electrodes", "pays": { "2": 0.5, "3": 0.5, "4": 1, "5": 5 } },
{ "cell": 15, "id": "gear", "name": "Gear", "role": "pay", "prompt": "A chrome gear with teeth", "pays": { "2": 0.5, "3": 0.5, "4": 1, "5": 4 } }
]
},
"paylines": [[1,1,1,1,1],[0,0,0,0,0],[2,2,2,2,2],[0,1,1,1,0],[2,1,1,1,2],[0,1,2,1,0],[2,1,0,1,2],[0,0,1,2,2],[2,2,1,0,0],[0,2,2,2,0],[2,0,0,0,2],[1,0,1,2,1],[1,2,1,0,1],[0,1,0,1,0],[2,1,2,1,2],[0,2,1,0,2],[2,0,1,2,0],[1,0,0,1,2],[1,2,2,1,0],[0,1,1,0,1]],
"reels": [["saucer","saucer","beacon","beacon","beacon","helmet","helmet","helmet","helmet","rocket","rocket","rocket","rocket","atom","atom","atom","atom","radar","radar","radar","radar","tube","tube","tube","tube","chrome","chrome","chrome","dial","dial"],["saucer","saucer","beacon","beacon","beacon","helmet","helmet","helmet","rocket","rocket","rocket","atom","atom","atom","radar","radar","radar","tube","tube","tube","chrome","chrome","chrome","dial","dial","dial","rivet","rivet","bakelite","bakelite"],["saucer","beacon","beacon","helmet","helmet","rocket","rocket","atom","atom","radar","radar","tube","tube","chrome","chrome","dial","dial","rivet","rivet","rivet","bakelite","bakelite","bakelite","orange","orange","orange","blue","blue","amber","amber"],["saucer","beacon","beacon","helmet","helmet","rocket","rocket","atom","atom","radar","radar","tube","tube","chrome","chrome","dial","dial","rivet","rivet","bakelite","bakelite","orange","orange","orange","blue","blue","blue","amber","amber","amber"],["saucer","beacon","beacon","helmet","helmet","rocket","rocket","atom","atom","radar","radar","tube","tube","chrome","chrome","dial","dial","rivet","rivet","bakelite","bakelite","orange","orange","orange","blue","blue","blue","amber","amber","vacuum","gear"]],
"math": { "claimedRtpBase": 94.1, "claimedHitFrequency": 27.4, "claimedFeatureRtp": 2.0, "volatility": "medium" },
"cabinet": [{ "id": "backdrop", "aspect": "9:16", "prompt": "1950s science fiction slot cabinet backdrop with atomic orange and deep space blue, chrome rivets, vacuum tubes, hand-painted airbrush" }]
}
Base RTP: 94.1% Hit frequency: 27.4% How you got them: Calculated from 200,000 simulated spins using the five reel strips, 20 paylines, wild substitution and scatter payouts with total bet 20 credits per spin. Celebration tiers: 5× total bet small chime, 20× total bet win sound, 100× total bet flashing win, 500× total bet mega win with Atomic Flare message. At zero credits: Play button is disabled and “OUT OF CREDITS” is shown; no further spins are possible. Before the art arrives: Reels display readable text fallbacks with the symbol name centered in each cell instead of blank spaces.
The single mechanism is the 2-scatter tease. Radar Beacon scatters are weighted to appear on reels 1-3 frequently, producing 2-scatter near misses on almost every spin. The player repeatedly sees the feature symbol just short of the 3-scatter trigger, creating a persistent anticipation that the Atomic Flare free feature is imminent and encouraging another press of Play.