PageSourceSearch

https://webcade.fun/arcade

html webcade.fun collected 2026-10-08 08:26:37 UTC 37,181 bytes, 590 lines download raw bytes

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 &mdash; 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>&mdash;</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">&#9658; FIGHT</span>
159            <span class="cab-card-gate">1v1 fighter &middot; 6 characters &middot; 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 &mdash; a neon city street at speed"
246                   width="640" height="440" loading="lazy" decoding="async">
247            </div>
248            <span class="pixel-btn play-link">&#9658; RACE</span>
249            <span class="cab-card-gate" data-nogate>1v1 arcade racer &middot; 3 laps &middot; 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 &middot; 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">&#9658; 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">&#9658; 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 &mdash; a character falling between glowing platforms"
358                   width="1000" height="688" loading="lazy" decoding="async">
359            </div>
360            <span class="pixel-btn play-link">&#9658; PLAY</span>
361            <span class="cab-card-gate" data-nogate>endless climber &middot; 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 &mdash; 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">&#9658; PLAY</span>
377            <span class="cab-card-gate" data-nogate>endless temple run &middot; 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 &mdash; 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">&#9658; PLAY</span>
397            <span class="cab-card-gate" data-nogate>endless ski run &middot; 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 &mdash; 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">&#9658; 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 &mdash; a harbour at dusk"
430                   width="1198" height="661" loading="lazy" decoding="async">
431            </div>
432            <span class="pixel-btn play-link">&#9658; PLAY</span>
433            <span class="cab-card-gate" data-nogate>Daily fishing tournament &middot; 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">&#9658; 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">&#9658; 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">&#9658; 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">&#9658; 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">&#9658; 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">&#9658; 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">&#9658; 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">&#9658; 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">&#9658; 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">&#9658; 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">&#9658; 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">&#9658; 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">&#9658; 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">&#9658; 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">&#9658; 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">&#9658; 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.