1<!DOCTYPE html> 2<html lang="en"> 3<head> 4 <meta charset="UTF-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> 6 <title>Webcade â Arcade</title> 7 <link rel="preconnect" href="https://fonts.googleapis.com"> 8 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> 9 <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=Oswald:wght@500;600;700&family=Press+Start+2P&family=VT323&display=swap" rel="stylesheet"> 10 <meta name="theme-color" content="#070707"> 11 <!-- The terms gate, and the one script on this page that is neither deferred 12 nor at the bottom. It has to decide whether the floor is behind a gate 13 BEFORE the floor paints, or a player who agreed weeks ago gets a frame 14 of legal overlay on every visit. Under `script-src 'self'` the two-line 15 inline check that would normally do this is not allowed, so it is a 16 file â see the header of tos.js for the whole argument. Ahead of the 17 stylesheet so the CSS request is not waiting on it. --> 18
18<script src="tos.js?v=1025436e"></script>
18 19 <link rel="stylesheet" href="style.css?v=1025436e"> 20 21 <link rel="manifest" href="/manifest.webmanifest"> 22 <link rel="apple-touch-icon" href="/apple-touch-icon.png"> 23 <link rel="icon" type="image/png" sizes="192x192" href="/icon-192.png"> 24 <meta name="mobile-web-app-capable" content="yes"> 25 <meta name="apple-mobile-web-app-capable" content="yes"> 26 <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"> 27 <meta name="apple-mobile-web-app-title" content="Webcade"> 28
28<script defer src="/pwa.js?v=1025436e"></script>
28 29
29<script defer src="/push.js?v=1025436e"></script>
29 30
30<script defer src="/mwa.js?v=1025436e"></script>
30 31
31<script defer src="/install.js?v=1025436e"></script>
31 32
32<script defer src="/tabbar.js?v=1025436e"></script>
32 33
33<script defer src="/orient.js?v=1025436e"></script>
33 34 35
35<script src="/legacyui.js?v=1025436e"></script>
35 36
36<script defer src="/legacytext.js?v=1025436e"></script>
36 37
37<script defer src="/ask.js?v=1025436e"></script>
37 38 </head> 39<body> 40 <div id="stars"></div> 41 42 <!-- THE DOOR. Hidden by default and shown only when tos.js puts 43 `tos-pending` on <html>, which is why it can sit in the markup without 44 flashing at somebody who agreed months ago. 45 46 IN THE MARKUP RATHER THAN BUILT BY tos.js, for the same reason the 47 Load more button below is: the card is the page's legal text, and text 48 that only exists once a script has run is text that cannot be read from 49 the served HTML â not by a crawler, not by a reviewer, not by the test 50 that checks the four things it has to say are still in it. 51 52 OUTSIDE <main>. tos.js marks header, main and footer `inert` while the 53 gate is up, so anything meant to stay reachable has to be a sibling of 54 them, not a child. 55 56 THE FOUR POINTS ARE GONE, AND THAT WAS A DECISION â NOT A TIDY-UP. 57 This card used to summarise four sections of /terms in bolded blocks: 58 scope, arbitration and the class waiver, prize risk, fair play. They 59 were pinned by tosgatetest precisely so a later edit could not drop them 60 by accident. They were dropped ON PURPOSE, by the owner, on 2026-09-21: 61 the door to a free arcade was reading as an essay, and the job of a 62 clickwrap is to record that you agreed, not that you memorised §11. 63 What the door still does is the part that makes it binding: it names 64 the two documents, links them, and takes an unambiguous click. The 65 commitments themselves live in /terms, which is unchanged and still 66 linked from here. 67 KNOW WHAT WAS TRADED. The class-action waiver is the clause most often 68 attacked on notice grounds, and showing it at the moment of assent is 69 what makes it stick. It is now behind a link like everything else. If 70 counsel ever wants one line back on this card, arbitration is the line 71 â see tosgatetest, which still pins it in /terms for that reason. 72 73 DECLINE IS AN ANCHOR, NOT A BUTTON. It is the one control that must work 74 when nothing else on the page does, so it needs no listener: it is a 75 link back to the front door. --> 76 <div class="tos-gate" id="tos-gate" role="dialog" aria-modal="true" 77 aria-labelledby="tos-title" aria-describedby="tos-lede"> 78 <div class="tos-card"> 79 <h2 class="tos-title" id="tos-title">Before you play</h2> 80 <!-- THE SCROLL REGION IS THE TERMS, NOT THE CARD. The short card fits a 81 390x780 phone without scrolling at all, so this looks like dead 82 structure â it is not. It is what stopped AGREE going below the fold 83 with nothing on screen to say a button existed, back when the card 84 was four points and fine print, and it is what keeps that true at a 85 200% font scale or on a 320px screen. The title and the two controls 86 stay pinned; only the text between them moves. --> 87 <div class="tos-body"> 88 <p class="tos-lede" id="tos-lede">Webcade is a free arcade. The daily board is a score 89 board only.</p> 90 <p class="tos-lede">You must be 18+. Playing must be lawful where you are.</p> 91 <p class="tos-lede">By entering you accept the 92 <a href="/terms" target="_blank" rel="noopener">Terms of Service</a> and 93 <a href="/privacy" target="_blank" rel="noopener">Privacy Policy</a>.</p> 94 </div> 95 <div class="tos-actions"> 96 <button type="button" class="pixel-btn tos-agree" id="tos-agree">I agree — enter the arcade</button> 97 <a class="btn-ghost tos-decline" href="/">Decline</a> 98 </div> 99 </div> 100 </div> 101 102 <header></header> 103 <!-- Telegram bridge first: nav.js and app.js both ask who the player is, 104 and inside a Mini App the answer is a signed Telegram id. In a normal 105 browser this defines a WebApp with no initData and changes nothing. --> 106
106<script defer src="https://telegram.org/js/telegram-web-app.js"></script>
106 107
107<script defer src="tg.js?v=1025436e"></script>
107 108
108<script defer src="ref.js?v=1025436e"></script>
108 109
109<script defer src="nav.js?v=1025436e"></script>
109 110 111 <main> 112 <section id="lobby"> 113 <div id="floor"> 114 <!-- THE ARCADE PAGE IS THE LIBRARY. Nothing else. 115 It used to open with a marketing hero, a four-figure stat strip, a 116 scrolling ticker and a live strip, and carry a sidebar of three 117 panels beside the grid â six blocks before the first game, which 118 put a cabinet 1.08 screens down on a desktop and 1.57 down on a 119 phone. Every one of those blocks said something that was also said 120 somewhere else: the hero repeated the front door, the strip's 121 prize repeated the sidebar's, its clock repeated the daily panel's, 122 the live strip's leader repeated that panel's board, and the ticker 123 repeated the recent-plays table two feet to its right. 124 What is left is a title, a count, a filter and eighteen games. 125 126 .hero-split IS this header, rather than a banner above it. dash.js 127 swaps this element for a returning player's dashboard â Continue, 128 Quick play, plays left, streak, rank â so a stranger gets the 129 library's name and somebody who has played gets their own state, in 130 the same place, and neither gets an advertisement. --> 131 <div class="hero-split"> 132 <div class="floor-head"> 133 <h1 class="floor-tagline" id="cabinets">Arcade</h1> 134 <p class="floor-say"><b data-cab-count>—</b> cabinets. One daily score.</p> 135 </div> 136 </div> 137 138 <!-- The library filter. Categories come from GAME_CATS in panels.js, 139 which is the same registry the rest of the site reads, and arcade.js 140 stamps each card with its own before wiring these up. A card the 141 registry says nothing about stays visible under every filter 142 rather than vanishing from the floor. --> 143 <div class="chips-row" id="cab-filters" role="group" aria-label="Filter cabinets by kind"></div> 144 145 <div class="floor-grid"> 146 <!-- BRAWL is not a cabinet: no coin, no gate, no daily board. 147 It is a versus game, so it says what it is rather than borrowing 148 a gate line that would not be true of it. --> 149 <!-- Open. It leads with its title screen rather than a frame of 150 gameplay, because the marquee is what a cabinet sells itself 151 with, and FIGHT rather than PLAY because that is what it is. --> 152 <a class="cab-card cab-card-vs" href="/brawl"> 153 <div class="cab-card-marquee brawl-marquee">CRYPTO SMASH</div> 154 <div class="cab-card-screen"> 155 <img src="/prev-brawl-title.jpg" alt="CRYPTO SMASH title screen" loading="lazy" 156 width="800" height="600"> 157 </div> 158 <span class="pixel-btn play-link">► FIGHT</span> 159 <span class="cab-card-gate">1v1 fighter · 6 characters · play online</span> 160 </a> 161 <!-- Harbormaster Cup: open. 162 A div, not an <a>, for the same reason ROLLER is one further 163 down â an anchor stays clickable, tabbable and long-pressable
164 into a new tab whatever CSS says about it, and a card that 165 cannot honour a tap should not invite one. 166 167 The decision this card was waiting on has been made. It was 168 never held back for being unfinished: the cabinet is built and 169 current â buildfreshtest checks the shipped .data blob for the 170 payout copy by content, not by date, and finds it â the 171 tournament runs, the marquee art has landed, it has been played 172 on a phone in a wallet browser, and a settled day has paid out. 173 174 THE COUNT IS NO LONGER TYPED ANYWHERE. It used to be spelled 175 out in words in four places â the hero line, the ticker, the 176 manifest and the how-to-play page â and it had been four 177 different things in as many weeks: this card opening took it to 178 sixteen while POP was under maintenance, and POP reopening took 179 it back to seventeen. The server now counts the floor's own open 180 links and publishes the answer as config.cabinets, and every 181 element marked data-cab-count reads it â so opening a cabinet is 182 one edit: this grid. 183 184 BREAK is not counted and is not here. It is CLOSED in games.js 185 rather than merely unlisted â see the note there. A cabinet 186 absent from the floor is a state this file had not held before: 187 even POP, shut for repair, kept a card with a band on it. This 188 one is off entirely until its menu screen exists. 189 190 claimstest still checks the old copy for a stale spelled-out 191 number, and passes trivially because there is none left to be 192 wrong. neonrivalstest still pins the number of open links, which 193 is a different assertion and still worth having: it proves that 194 ANNOUNCING a game did not quietly add a playable one. 195 196 The screen is the real title still now that there is one. It was 197 a painted CSS gradient while the art did not exist â an <img> 198 pointing at a file that is not there reads as a broken site 199 rather than an unfinished game â and that gradient also missed 200 `.cab-card.soon .cab-card-screen img`, the rule that dims a 201 coming-soon cabinet, because it only ever matched an <img>. The 202 one card meant to read as unavailable was the one card at full 203 brightness. 204 205 The gate line describes the tournament rather than naming a 206 figure. Payouts are live now, but a number on the floor is a 207 promise and the budget moves with the day's turnout. --> 208 <!-- NEON RIVALS: open. It sat here as COMING SOON while the 209 multiplayer, the reconnect grace and the controls were tested on 210 real phones at an address only testers had; that work is done 211 and the card now honours the tap it invites. 212 213 cab-card-vs, not a bare cab-card, and the class is doing real 214 work: it is a 1v1 versus game like BRAWL â no coin, no gate, no 215 daily board â and every place the site counts its cabinets 216 (arcade.js, ticker.js, server.js's floorCabinets, claimstest) 217 excludes versus cards, so opening this changed no count anywhere. 218 RACE rather than PLAY for the reason BRAWL says FIGHT: that is 219 what it is. 220 221 The gate line says what the game IS, not what clears a stage, 222 because nothing here clears a stage â it is a race, it has no 223 daily objective and it pays nothing. data-nogate is how panels.js 224 and claimstest are told that is deliberate, the same way BRAWL 225 and HARBORMASTER say it. And it promises no prize, for the same 226 reason the game's own boot screen stopped: nothing about a race 227 here pays anything. --> 228 <a class="cab-card cab-card-vs" href="/neonrivals"> 229 <div class="cab-card-marquee nr-marquee">NEON RIVALS</div> 230 <!-- A real frame of the game, not a drawing of one. 231 232 The other cabinets' previews are hand-drawn in home.js because 233 those cabinets ARE flat shapes â a pacman is a wedge and a 234 pellet, and a canvas draws that exactly. This one is a lit city 235 at 204mph, and an approximation of that looks like exactly 236 that, which is the same call ROLLER and HARBORMASTER made. 237 238 Letterboxed to the card's 16:11 rather than cropped to it. The 239 game renders 16:9, so a cover-crop takes 117px off each side â 240 which is where every HUD box lives, and half a POSITION box 241 reads as a broken image rather than as a screenshot. The bars 242 are the game's own ink and land on night sky and dark tarmac, 243 so they are not visible as bars. --> 244 <div class="cab-card-screen"> 245 <img src="prev-neonrivals.jpg" alt="Neon Rivals — a neon city street at speed" 246 width="640" height="440" loading="lazy" decoding="async"> 247 </div>
248 <span class="pixel-btn play-link">► RACE</span> 249 <span class="cab-card-gate" data-nogate>1v1 arcade racer · 3 laps · race a friend online</span> 250 </a> 251 <!-- BREAK: the same state NEON RIVALS is in, arrived at from the other 252 direction. It was CLOSED â the page did not serve at all â and is 253 SOFT now (see games.js): the address works, a run scores the board 254 exactly as it would anywhere else, and nothing picks it. That is 255 the only way to test the cabinet that actually ships rather than a 256 quieter copy of it. 257 258 Announced rather than linked, and this card is the announcement. 259 When it opens, this div becomes an anchor to the cabinet's address 260 and the band comes off â written in words rather than as markup for 261 the reason spelled out above: urlstest and claimstest both decide 262 what the floor offers by looking for that exact href string 263 ANYWHERE in this file, comments included. 264 265 A div rather than an anchor, for the reason every other announced 266 card is one: an anchor stays clickable, tabbable and 267 long-pressable into a new tab whatever CSS says about it, and a 268 card that will not honour a tap should not invite one. 269 270 The preview is not a drawing of the cabinet, it IS the cabinet: 271 home.js paints #prev-pool out of break.js's own felt colour and 272 blits the same rail PNG the game does, so the card cannot go stale 273 against the table. 274 275 data-nogate, though this one genuinely has a gate. BREAK clears a 276 rack for a point like any other cabinet, and it will print that 277 line the day the card becomes a way in. Printing it now would be 278 a condition attached to a run nobody can start from here. --> 279 <div class="cab-card soon" aria-disabled="true"> 280 <div class="cab-card-marquee pool-marquee">BREAK</div> 281 <div class="cab-card-screen"> 282 <!-- Twice the backing resolution the pixel cabinets use. Theirs are 283 chunky high-contrast shapes that upscale fine; a pool table is 284 fifteen small spheres on dark cloth, and at 160px it arrived as a 285 grey smear once the COMING SOON dim was over it. --> 286 <canvas id="prev-pool" width="320" height="220"></canvas> 287 <span class="soon-band">COMING SOON</span> 288 </div> 289 <span class="cab-card-gate" data-nogate>Eight-ball · on your own, a person, or the house</span> 290 </div> 291 <!-- FIZZ: open. A plain cab-card so it counts, like every cabinet 292 that feeds the daily board. It served at its own address with no 293 card here, soft-launched (see games.js), until it had been played. 294 The preview is the cabinet rather than a drawing of it: home.js 295 paints #prev-fizz from prev-fizz.png, a frame of fizz.js's own 296 renderer at one pixel per art pixel, and the live demo takes the 297 card over when the rotation reaches it. --> 298 <a class="cab-card" href="/fizz"> 299 <div class="cab-card-marquee fiz-marquee">FIZZ</div> 300 <div class="cab-card-screen"><canvas id="prev-fizz" width="160" height="110"></canvas></div> 301 <span class="pixel-btn play-link">► PLAY</span> 302 <span class="cab-card-gate" data-gate="Clear wave 1">Every stage is a point</span> 303 </a> 304 <!-- TAPCADE: open. A plain cab-card so it counts, like every cabinet 305 that feeds the daily board; home.js paints #prev-tapcade in the 306 game's own lane colours. --> 307 <a class="cab-card" href="/tapcade"> 308 <div class="cab-card-marquee tap-marquee">TAPCADE</div> 309 <div class="cab-card-screen"><canvas id="prev-tapcade" width="160" height="110"></canvas></div>
310 <span class="pixel-btn play-link">► PLAY</span> 311 <span class="cab-card-gate" data-gate="Clear song 1 at grade C">Every stage is a point</span> 312 </a> 313 <!-- DUDAS JUMP: open. It sat here as COMING SOON while the game was 314 tested on real phones at an address only testers had; that work is 315 done and the card honours the tap it invites. 316 317 A plain cab-card, so it COUNTS, and that is the deliberate half of 318 this change. BRAWL and NEON RIVALS wear cab-card-vs and are 319 excluded from every cabinet tally on the site â not because they 320 are off the roster but because they are VERSUS games, which is a 321 different kind of thing from a machine you walk up to alone. 322 HARBORMASTER settles which rule applies here: it is off the roster 323 too, brings its own shell, has no daily objective, and it has 324 always been a counted cab-card. This game is single-player and 325 walked up to alone, so it counts the same way, and the floor's 326 "N cabinets" goes to eighteen with it. 327 328 Nothing had to be retyped for that. The number is read off the 329 floor in all four places rather than written down â arcade.js 330 fills data-cab-count, ticker.js counts the same selector, 331 server.js publishes config.cabinets, and claimstest checks the 332 copy against whatever the floor currently links to. 333 334 The gate line says what the game IS, not what clears a stage, 335 because nothing here clears one â it is an endless climber with no 336 daily objective and it feeds no paying board. data-nogate is how 337 panels.js and claimstest are told that is deliberate, the same way 338 BRAWL, HARBORMASTER and NEON RIVALS say it. And it promises no 339 prize: the sponsor's board pays from the sponsor's own token, by 340 hand, and the arcade pays nothing from it. 341 342 The href is /dudasjump, the cabinet page â never /dudasjump/play. 343 The floor sends people to the machine, and the machine is what 344 sends them into the game. 345 346 A real frame of the game, chosen rather than posed: a script plays 347 until the character is falling mid-screen with decks above and 348 below him and something worth collecting in shot, then freezes the 349 clock and clips the card's 16:11 out of the middle. Cropped rather 350 than letterboxed, unlike NEON RIVALS â this game is portrait, so 351 fitting the whole screen into a landscape card would leave it a 352 thin strip on a field of empty ink, and its HUD sits at the top 353 edge where a crop is happy to lose it. --> 354 <a class="cab-card" href="/dudasjump"> 355 <div class="cab-card-marquee dj-marquee">DUDAS JUMP</div> 356 <div class="cab-card-screen"> 357 <img src="prev-dudasjump.jpg" alt="Dudas Jump — a character falling between glowing platforms" 358 width="1000" height="688" loading="lazy" decoding="async"> 359 </div> 360 <span class="pixel-btn play-link">► PLAY</span> 361 <span class="cab-card-gate" data-nogate>endless climber · auto-jump</span> 362 </a> 363 <!-- RAGING BULL: open. It sat here as a COMING SOON card while it was 364 tested; now the card is an anchor like DUDAS JUMP's, so the floor 365 counts it and a tap goes to the cabinet page. The href is 366 /ragingbull, the cabinet â never /ragingbull/play, for the reason 367 the DUDAS JUMP card gives. The preview is a real frame of the 368 game, at the card's own 16:11. The gate line is its own copy 369 (data-nogate): there is no coin gate on a sponsor board. --> 370 <a class="cab-card" href="/ragingbull"> 371 <div class="cab-card-marquee rb-marquee">RAGING BULL</div> 372 <div class="cab-card-screen"> 373 <img src="prev-ragingbull.jpg" alt="Raging Bull — a black bull on a temple road at night" 374 width="640" height="440" loading="lazy" decoding="async"> 375 </div>
376 <span class="pixel-btn play-link">► PLAY</span> 377 <span class="cab-card-gate" data-nogate>endless temple run · three lanes, hard corners</span> 378 </a> 379 <!-- DOWNHILL RUSH: open, the same card RAGING BULL is. The href is 380 /downhillrush, the cabinet, never /downhillrush/play, for the 381 reason the DUDAS JUMP card gives. One word, no hyphen: everything 382 that counts this floor matches href="/[a-z]+", so /downhill-rush 383 would be a card nothing counted. The preview is a real frame of 384 the game, the middle of its square canvas at the card's 16:11, 385 doubled with no smoothing so the pixels stay pixels. The gate line 386 is its own copy (data-nogate): there is no board behind it. 387 The marquee hook is dh-, not dr-: .dr-marquee is the DAILY 388 REWARD popup's title in style.css (pixel font, 19px, gradient), 389 and wearing it set this one card's name in that face and size. --> 390 <a class="cab-card" href="/downhillrush"> 391 <div class="cab-card-marquee dh-marquee">DOWNHILL RUSH</div> 392 <div class="cab-card-screen"> 393 <img src="prev-downhillrush.jpg" alt="Downhill Rush — a skier weaving between pine trees and a snowboarder" 394 width="960" height="660" loading="lazy" decoding="async"> 395 </div> 396 <span class="pixel-btn play-link">► PLAY</span> 397 <span class="cab-card-gate" data-nogate>endless ski run · race a friend on one code</span> 398 </a> 399 <!-- GOLF: open. It sat here as a COMING SOON card â a div with no 400 href, the state BREAK is in â until the paid mulligan had been 401 bought with a real wallet on the live site, which it has. The 402 card is now the plain cab-card anchor every open cabinet is, to 403 the cabinet page at /golf (the game itself is at /golf/play), 404 and everything that counts the floor's links â floorCabinets 405 behind /api/config, claimstest, neonrivalstest's pinned count â 406 moved by one for it, exactly as they did for DUDAS JUMP and 407 RAGING BULL. 408 409 The preview is the game's own title screen at its own 4:3, 410 letterboxed into the card's 16:11 rather than cropped: the title 411 art is the thing being shown and a crop takes the top of it. The 412 gate line is its own copy (data-nogate): nothing here clears a 413 stage and no round reaches the arcade's daily board â golf keeps 414 a board of its own that pays nothing. It names the one thing 415 this cabinet does with a token, because it is the one cabinet on 416 the floor that takes one IN â and where it goes. --> 417 <a class="cab-card" href="/golf"> 418 <div class="cab-card-marquee golf-marquee">GOLF</div> 419 <div class="cab-card-screen"> 420 <img src="prev-golf.jpg" alt="Golf — the title screen, a golfer at address beside a green" 421 width="640" height="480" loading="lazy" decoding="async"> 422 </div> 423 <span class="pixel-btn play-link">► PLAY</span> 424 <span class="cab-card-gate" data-nogate>nine holes or a 3-hole duel</span> 425 </a> 426 <a class="cab-card" href="/harbormaster"> 427 <div class="cab-card-marquee hm-marquee">HARBORMASTER CUP</div> 428 <div class="cab-card-screen"> 429 <img src="prev-harbormaster.png" alt="Harbormaster Cup — a harbour at dusk" 430 width="1198" height="661" loading="lazy" decoding="async"> 431 </div> 432 <span class="pixel-btn play-link">► PLAY</span> 433 <span class="cab-card-gate" data-nogate>Daily fishing tournament · three attempts a day</span> 434 </a> 435 <a class="cab-card" href="/chomper"> 436 <div class="cab-card-marquee pac-marquee">CHOMPER</div> 437 <div class="cab-card-screen">
437<canvas id="prev-pacman" width="160" height="110"></canvas></div> 438 <span class="pixel-btn play-link">► PLAY</span> 439 <span class="cab-card-gate" data-gate="Clear level 1">Every stage is a point</span> 440 </a> 441 <a class="cab-card" href="/swarm"> 442 <div class="cab-card-marquee inv-marquee">SWARM</div> 443 <div class="cab-card-screen"><canvas id="prev-invaders" width="160" height="110"></canvas></div> 444 <span class="pixel-btn play-link">► PLAY</span> 445 <span class="cab-card-gate" data-gate="Clear wave 1">Every stage is a point</span> 446 </a> 447 <a class="cab-card" href="/cascade"> 448 <div class="cab-card-marquee tet-marquee">CASCADE</div> 449 <div class="cab-card-screen"><canvas id="prev-tetris" width="160" height="110"></canvas></div> 450 <span class="pixel-btn play-link">► PLAY</span> 451 <span class="cab-card-gate" data-gate="Clear 10 lines">Every stage is a point</span> 452 </a> 453 <a class="cab-card" href="/coil"> 454 <div class="cab-card-marquee snk-marquee">COIL</div> 455 <div class="cab-card-screen"><canvas id="prev-snake" width="160" height="110"></canvas></div> 456 <span class="pixel-btn play-link">► PLAY</span> 457 <span class="cab-card-gate" data-gate="Reach length 20">Every stage is a point</span> 458 </a> 459 <a class="cab-card" href="/ricochet"> 460 <div class="cab-card-marquee brk-marquee">RICOCHET</div> 461 <div class="cab-card-screen"><canvas id="prev-breakout" width="160" height="110"></canvas></div> 462 <span class="pixel-btn play-link">► PLAY</span> 463 <span class="cab-card-gate" data-gate="Clear board 1">Every stage is a point</span> 464 </a> 465 <a class="cab-card" href="/hopper"> 466 <div class="cab-card-marquee frg-marquee">HOPPER</div> 467 <div class="cab-card-screen"><canvas id="prev-frogger" width="160" height="110"></canvas></div> 468 <span class="pixel-btn play-link">► PLAY</span> 469 <span class="cab-card-gate" data-gate="Fill all 5 homes">Every stage is a point</span> 470 </a> 471 <a class="cab-card" href="/drift"> 472 <div class="cab-card-marquee ast-marquee">DRIFT</div> 473 <div class="cab-card-screen"><canvas id="prev-asteroids" width="160" height="110"></canvas></div> 474 <span class="pixel-btn play-link">► PLAY</span> 475 <span class="cab-card-gate" data-gate="Clear wave 1">Every stage is a point</span> 476 </a> 477 <a class="cab-card" href="/salvo"> 478 <div class="cab-card-marquee mis-marquee">SALVO</div> 479 <div class="cab-card-screen"><canvas id="prev-missiles" width="160" height="110"></canvas></div> 480 <span class="pixel-btn play-link">► PLAY</span> 481 <span class="cab-card-gate" data-gate="Survive wave 1">Every stage is a point</span> 482 </a> 483 <a class="cab-card" href="/crawler"> 484 <div class="cab-card-marquee cen-marquee">CRAWLER</div> 485 <div class="cab-card-screen"><canvas id="prev-centipede" width="160" height="110"></canvas></div> 486 <span class="pixel-btn play-link">► PLAY</span> 487 <span class="cab-card-gate" data-gate="Clear wave 1">Every stage is a point</span> 488 </a> 489 <a class="cab-card" href="/vortex"> 490 <div class="cab-card-marquee tmp-marquee">VORTEX</div> 491 <div class="cab-card-screen"><canvas id="prev-tempest" width="160" height="110"></canvas></div> 492 <span class="pixel-btn play-link">► PLAY</span> 493 <span class="cab-card-gate" data-gate="Clear level 1">Every stage is a point</span> 494 </a> 495 <a class="cab-card" href="/ziggurat"> 496 <div class="cab-card-marquee qb-marquee">ZIGGURAT</div> 497 <div class="cab-card-screen"><canvas id="prev-qbert" width="160" height="110"></canvas></div> 498 <span class="pixel-btn play-link">► PLAY</span>
499 <span class="cab-card-gate" data-gate="Complete the pyramid">Every stage is a point</span> 500 </a> 501 <a class="cab-card" href="/descent"> 502 <div class="cab-card-marquee lnd-marquee">DESCENT</div> 503 <div class="cab-card-screen"><canvas id="prev-lander" width="160" height="110"></canvas></div> 504 <span class="pixel-btn play-link">► PLAY</span> 505 <span class="cab-card-gate" data-gate="Land safely once">Every stage is a point</span> 506 </a> 507 <a class="cab-card" href="/girder"> 508 <div class="cab-card-marquee clm-marquee">GIRDER</div> 509 <div class="cab-card-screen"><canvas id="prev-climber" width="160" height="110"></canvas></div> 510 <span class="pixel-btn play-link">► PLAY</span> 511 <span class="cab-card-gate" data-gate="Reach the top">Every stage is a point</span> 512 </a> 513 <!-- POP: open again, after two closures and two different bugs. 514 Shut on 2026-08-26 for a glitch that handed the ball back at the 515 ceiling, reopened on the 27th when that was fixed, and pulled the 516 same day still misbehaving. The second bug was the one underneath 517 the first: the ceiling ground down every nine shots at every 518 board and nothing else climbed either, so no board was ever 519 harder than board four and a good run had no end. "Every level is 520 beatable" outlived the exploit that first made it true. It also 521 cost the players it flattered â a run past twenty minutes of game 522 time is one the replay cap refuses outright, so the better the 523 player, the likelier this cabinet paid them nothing. 524 The grind tightens board by board now, board one untouched 525 because it is the prize gate. poptest plays that rather than 526 reading it. 527 The second closure is the one worth remembering how to repeat: 528 games.js CLOSED is the switch, and it shuts the page, the play 529 credit, the finish, the duel, the featured slot and the daily 530 objective together. Removing the link is a sign on the door; that 531 is the lock. WEBCADE_CLOSED does the same from the environment 532 without waiting for a deploy, which is the hour this cabinet 533 spent being played after it was pulled. --> 534 <a class="cab-card" href="/pop"> 535 <div class="cab-card-marquee pop-marquee">POP</div> 536 <div class="cab-card-screen"><canvas id="prev-pop" width="160" height="110"></canvas></div> 537 <span class="pixel-btn play-link">► PLAY</span> 538 <span class="cab-card-gate" data-gate="Clear board 1">Every stage is a point</span> 539 </a> 540 <a class="cab-card" href="/roller"> 541 <div class="cab-card-marquee rol-marquee">ROLLER</div> 542 <div class="cab-card-screen"><canvas id="prev-roller" width="160" height="110"></canvas></div> 543 <span class="pixel-btn play-link">► PLAY</span> 544 <span class="cab-card-gate" data-gate="Clear round 1">Every stage is a point</span> 545 </a> 546 <a class="cab-card" href="/fusion"> 547 <div class="cab-card-marquee fus-marquee">FUSION</div> 548 <div class="cab-card-screen"><canvas id="prev-fusion" width="160" height="110"></canvas></div> 549 <span class="pixel-btn play-link">► PLAY</span> 550 <span class="cab-card-gate" data-gate="Reach the 256 tile">Every stage is a point</span> 551 </a> 552 </div> 553 <!-- In the markup rather than built by arcade.js, so a floor with 554 scripts blocked shows every cabinet instead of twelve and a dead 555 button. arcade.js reveals the rest and then removes it. --> 556 <button type="button" class="btn-ghost load-more" id="floor-more" hidden>Load more</button> 557 </div> 558 559 </section> 560 </main> 561 562 <footer> 563 <div class="carpet"></div> 564 </footer> 565 566 <!-- The attract demos load cabinet scripts dynamically, and those scripts 567 read keys through ARCADE_KEY on every keydown. Without this, any letter 568 typed on the floor throws in whichever demo is running. --> 569
569<script defer src="keys.js?v=1025436e"></script>
569 570
570<script defer src="avatar.js?v=1025436e"></script>
570 571
571<script defer src="icons.js?v=1025436e"></script>
571 572
572<script defer src="panels.js?v=1025436e"></script>
572 573
573<script defer src="wallets.js?v=1025436e"></script>
573 574
574<script defer src="wallet.js?v=1025436e"></script>
574 575
575<script defer src="home.js?v=1025436e"></script>
575 576
576<script defer src="arcade.js?v=1025436e"></script>
576 577
577<script defer src="dash.js?v=1025436e"></script>
577 578
578<script defer src="dailyreward.js?v=1025436e"></script>
578 579
579<script defer src="rivals.js?v=1025436e"></script>
579 580
580<script defer src="attract.js?v=1025436e"></script>
580 581
581<script defer src="homeattract.js?v=1025436e"></script>
581 582 <!-- The marquee stays. It was one of two places recent plays appeared on this 583 page â the sidebar's RECENT PLAYS table was the other, and that is gone, 584 so it is not a duplicate any more. It costs 38px, it is the arcade's own 585 voice, and it is the only thing on the page that says somebody else is 586 here. floornow.js is gone entirely: see its deletion. --> 587
587<script defer src="music.js?v=1025436e"></script>
587 588
588<script defer src="konami.js?v=1025436e"></script>
588 589</body> 590</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.