LVL 1/4 Attempts
Play
Meet TankMan & learn how to play
TankMan β€” Tank Specialists foreman mascot
TANKMAN

TankMan's Tank Set Challenge

 

← extend/lower Β· β†’ retract/raise Β· ↑ ↓ cable  β€’  Mobile: on-screen pads
Tank Specialists of California Β· Since 1997 Β· CA Lic #745065 Β· (888) 606-8265
TankMan β€” Tank Specialists foreman mascot
TANKMAN

You Did It!

TOTAL SCORE: 0.0s

 

Request a Free Site Review
πŸ“ž Or call us toll-free: (888) 606-8265
Tank Specialists of California Β· Since 1997 Β· CA Lic #745065 Β· (888) 606-8265

High Score Leaderboard

Your score: 0.0s
  1. Loading…
πŸ† Top score each week wins Tank Specialists merch. Register to be eligible.
Tank Specialists of California Β· Since 1997 Β· CA Lic #745065 Β· (888) 606-8265
TankMan β€” Tank Specialists foreman mascot
TANKMAN

Level Set!

Clean set.
+0.0s

 

Win each set to advance Β· 3 attempts per level
Tank Specialists of California Β· Since 1997 Β· CA Lic #745065 Β· (888) 606-8265
TankMan β€” Tank Specialists foreman mascot
TANKMAN

Leave It to the Specialists

Setting a tank safe, per local codes and regulatory requirements, is our full-time job.

 

Request a Free Site Review
πŸ“ž Or call us toll-free: (888) 606-8265
Tank Specialists of California Β· Since 1997 Β· CA Lic #745065 Β· (888) 606-8265
// in the ), OR by editing the fallback string on the next line. // If left as-is with no backend reachable, the game safely falls back to a per-device board. const LB_API = (typeof window!=='undefined' && window.TANKMAN_LB_API) ? window.TANKMAN_LB_API : ('__PORT_8000__'.startsWith('__') ? 'http://localhost:8000' : '__PORT_8000__'); // In a standalone / offline build there is no backend, so use a local // (this-browser-only) leaderboard stored in localStorage. let LB_LOCAL = !!window.__STANDALONE; let lbRange = 'week'; let lbLastId = null; // row id of the score this player just submitted (to highlight) function esc(s){ return String(s==null?'':s).replace(/[&<>"']/g, c=>({'&':'&','<':'<','>':'>','"':'"',"'":'''}[c])); } /* ---- local (offline) leaderboard store ---- */ const LB_KEY = 'tankman_leaderboard_v1'; function lbLocalAll(){ try{ return JSON.parse(localStorage.getItem(LB_KEY)||'[]'); }catch(e){ return []; } } function lbLocalSave(rows){ try{ localStorage.setItem(LB_KEY, JSON.stringify(rows)); }catch(e){} } // Most recent Sunday 00:00 America/Los_Angeles, as an epoch-ms cutoff. function weekStartPacificMs(){ const now = new Date(); // Current time expressed in Pacific wall-clock parts const parts = new Intl.DateTimeFormat('en-US', { timeZone:'America/Los_Angeles', weekday:'short', year:'numeric', month:'2-digit', day:'2-digit', hour:'2-digit', minute:'2-digit', second:'2-digit', hour12:false }).formatToParts(now).reduce((o,p)=>{o[p.type]=p.value;return o;},{}); const dayMap = {Sun:0,Mon:1,Tue:2,Wed:3,Thu:4,Fri:5,Sat:6}; const dow = dayMap[parts.weekday]; // Seconds elapsed since Pacific midnight today const secToday = (+parts.hour)*3600 + (+parts.minute)*60 + (+parts.second); // ms since the most recent Sunday 00:00 Pacific const elapsed = (dow*86400 + secToday) * 1000; return now.getTime() - elapsed; } function lbLocalTop(range){ let rows = lbLocalAll(); if(range === 'week'){ const wk = weekStartPacificMs(); // most recent Sunday 00:00 Pacific rows = rows.filter(r => (r.ts||0) >= wk); } // best score per username const best = {}; for(const r of rows){ if(!best[r.username] || r.score > best[r.username].score) best[r.username] = r; } return Object.values(best).sort((a,b)=> b.score - a.score).slice(0,20); } function lbLocalInsert(rec){ const rows = lbLocalAll(); rec.id = 'l' + Date.now() + '_' + Math.floor(Math.random()*1e4); rec.ts = Date.now(); rows.push(rec); lbLocalSave(rows); return rec.id; } function lbRender(rows){ const list = document.getElementById('lbList'); if(!rows.length){ list.innerHTML = '
  • No scores yet \u2014 be the first!
  • '; return; } list.innerHTML = rows.map((r,i)=>{ const top = i<3 ? ' top'+(i+1) : ''; const me = (lbLastId && r.id===lbLastId) ? ' me' : ''; return '
  • '+(i+1)+''+ ''+esc(r.username)+''+ ''+Number(r.score).toFixed(1)+'s
  • '; }).join(''); } async function lbLoad(){ const list = document.getElementById('lbList'); if(LB_LOCAL){ lbRender(lbLocalTop(lbRange)); return; } list.innerHTML = '
  • Loading\u2026
  • '; try{ const res = await fetch(LB_API + '/api/leaderboard?range=' + lbRange + '&limit=20'); const rows = await res.json(); lbRender(rows); }catch(e){ // backend unreachable β€” fall back to local mode for the rest of the session LB_LOCAL = true; lbRender(lbLocalTop(lbRange)); } } function openLeaderboard(){ TankmanCaption.stop(); const score = window.__finalScore != null ? window.__finalScore : (window.__game ? +window.__game.score.toFixed(1) : 0); window.__finalScore = score; document.getElementById('lbYourScore').textContent = 'Your score: ' + score.toFixed(1) + 's'; document.getElementById('lbFormWrap').style.display = ''; document.getElementById('lbThanks').style.display = 'none'; document.getElementById('lbMsg').textContent = ''; lbLastId = null; show('leaderboardScreen'); lbLoad(); } window.openLeaderboard = openLeaderboard; document.getElementById('winSeeBoard').addEventListener('click', openLeaderboard); // tabs document.querySelectorAll('.lb-tab').forEach(t=>{ t.addEventListener('click', ()=>{ document.querySelectorAll('.lb-tab').forEach(x=>x.classList.remove('active')); t.classList.add('active'); lbRange = t.getAttribute('data-range'); lbLoad(); }); }); async function lbSubmit(anon){ const msg = document.getElementById('lbMsg'); const score = window.__finalScore != null ? window.__finalScore : 0; let username = (document.getElementById('lbUsername').value||'').trim(); const email = (document.getElementById('lbEmail').value||'').trim(); const phone = (document.getElementById('lbPhone').value||'').trim(); const consent = document.getElementById('lbConsent').checked; if(anon){ username = 'Anonymous'; } else { if(!username){ msg.className='lb-msg err'; msg.textContent='Enter a username, or tap \u201cPost as Anonymous\u201d.'; return; } if(email && !/^[^@\s]+@[^@\s]+\.[^@\s]+$/.test(email)){ msg.className='lb-msg err'; msg.textContent='That email doesn\u2019t look right.'; return; } } msg.className='lb-msg'; msg.textContent='Submitting\u2026'; const showThanks = ()=>{ document.getElementById('lbFormWrap').style.display='none'; const thanks = document.getElementById('lbThanks'); const localNote = LB_LOCAL ? ' (This is a local test board saved on this device.)' : ''; document.getElementById('lbThanksP').textContent = ((!anon && consent) ? 'You\u2019re entered in this week\u2019s merch giveaway. Top score of the week wins \u2014 good luck!' : 'Your score is on the board. Register with the giveaway box next time to be eligible for weekly merch.') + localNote; thanks.style.display=''; lbLoad(); }; if(LB_LOCAL){ lbLastId = lbLocalInsert({ username, email: anon?'':email, phone: anon?'':phone, consent: anon?false:consent, score }); showThanks(); return; } try{ const res = await fetch(LB_API + '/api/leaderboard', { method:'POST', headers:{'Content-Type':'application/json'}, body: JSON.stringify({ username, email: anon?'':email, phone: anon?'':phone, consent: anon?false:consent, score }) }); if(!res.ok){ throw new Error('bad status'); } const data = await res.json(); lbLastId = data.id || null; showThanks(); }catch(e){ // backend unreachable β€” save locally instead of failing LB_LOCAL = true; lbLastId = lbLocalInsert({ username, email: anon?'':email, phone: anon?'':phone, consent: anon?false:consent, score }); showThanks(); } } document.getElementById('lbSubmit').addEventListener('click', ()=> lbSubmit(false)); document.getElementById('lbAnon').addEventListener('click', ()=> lbSubmit(true)); document.getElementById('lbPlayAgain').addEventListener('click', ()=>{ restartToIntro(); });