1<!DOCTYPE html> 2<html lang="en" data-game="breakout"> 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 â Ricochet</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 <link rel="stylesheet" href="style.css?v=1025436e"> 12 <!-- The cabinet's own artwork. app.js sets it as a CSS background from 13 CAB_ART, which is deferred â so without this the browser cannot even 14 start fetching the largest thing on the page until the script has run. 15 Named here rather than derived, because the preload scanner reads the 16 markup and nothing else. cabartpreloadtest.js checks this href against 17 app.js's entry for this game, so the two cannot drift apart. --> 18 <link rel="preload" as="image" href="cab-ricochet.webp" fetchpriority="high"> 19 20 <link rel="manifest" href="/manifest.webmanifest"> 21 <link rel="apple-touch-icon" href="/apple-touch-icon.png"> 22 <link rel="icon" type="image/png" sizes="192x192" href="/icon-192.png"> 23 <meta name="mobile-web-app-capable" content="yes"> 24 <meta name="apple-mobile-web-app-capable" content="yes"> 25 <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"> 26 <meta name="apple-mobile-web-app-title" content="Webcade"> 27
27<script defer src="/pwa.js?v=1025436e"></script>
27 28
28<script defer src="/push.js?v=1025436e"></script>
28 29
29<script defer src="/mwa.js?v=1025436e"></script>
29 30
30<script defer src="/install.js?v=1025436e"></script>
30 31
31<script defer src="/tabbar.js?v=1025436e"></script>
31 32
32<script defer src="/orient.js?v=1025436e"></script>
32 33 34
34<script src="/legacyui.js?v=1025436e"></script>
34 35
35<script defer src="/legacytext.js?v=1025436e"></script>
35 36
36<script defer src="/ask.js?v=1025436e"></script>
36 37 </head> 38<body> 39 <div id="stars"></div> 40 41 <header></header> 42 <!-- Telegram bridge first: nav.js and app.js both ask who the player is, 43 and inside a Mini App the answer is a signed Telegram id. In a normal 44 browser this defines a WebApp with no initData and changes nothing. --> 45
45<script defer src="https://telegram.org/js/telegram-web-app.js"></script>
45 46
46<script defer src="tg.js?v=1025436e"></script>
46 47
47<script defer src="ref.js?v=1025436e"></script>
47 48
48<script defer src="nav.js?v=1025436e"></script>
48 49 50 <main> 51 <section id="lobby"> 52 <!-- One layout for every cabinet on the site. The breadcrumb, the title 53 row, the frame and the two panels under the game are identical on all 54 eighteen pages; only the marquee text, the canvas and the game script 55 differ. cabpage.js fills the category, the how-to-play tips and the 56 progress figures from the registries and the live APIs, so none of it 57 is typed into a page. --> 58 <div class="cab-col"> 59 <!-- A way back, not a trail. The second crumb named the game's kind 60 ("maze muncher"), which the title one line below and the artwork 61 beside it both already say. One link out is what a page one level 62 deep actually needs. --> 63 <a class="cab-back" href="/arcade"><span aria-hidden="true">←</span> Back to arcade</a> 64 <div class="cab-head"> 65 <h1 class="cab-title">RICOCHET</h1> 66 <div class="cab-chips"> 67 <!-- What a play costs, said once, at the top. panels.js turns this 68 back into the coin line if the arcade is ever put on coins. --> 69 <span class="cab-tag" id="cab-mode">Free play</span> 70 </div> 71 </div> 72 <!-- What clearing a stage here is worth. The same sentence the library 73 header makes once, made again at the point of play â which is the 74 one other place it is genuinely worth saying. --> 75 <p class="cab-say">Every stage you clear is a point on today’s board.</p> 76 77 <div class="cabinet"> 78 <div class="cab-marquee"> 79 <span class="cab-marquee-text" id="marquee-text">RICOCHET</span> 80 </div> 81 <div class="crt"> 82 <canvas id="game" width="448" height="536"></canvas> 83 <div class="scanlines"></div> 84 <div id="overlay"> 85 <div id="overlay-inner"> 86 <p id="overlay-title">FREE PLAY</p> 87 <p id="overlay-sub" data-gate="CLEAR BOARD 1">EVERY STAGE YOU CLEAR IS A POINT ON TODAY’S BOARD</p> 88 <button id="play-btn" class="coin-btn" disabled> 89 <span class="coin-slot"></span>PLAY FREE 90 </button> 91 <p id="status"></p> 92 </div> 93 </div> 94 </div> 95 <div id="gate-bar" class="hidden"></div> 96 </div> 97 98 <!-- The controls, as a strip under the machine rather than a line of 99 small caps inside the overlay that disappears the moment a run 100 starts. cabpage.js splits the cabinet's own control hint on its 101 middots, so this is the same string app.js shows on the screen 102 and there is no second description to keep true. --> 103 <div class="cab-controls-bar" id="cab-controls-bar" hidden> 104 <span class="ccb-k">Controls</span> 105 <div class="ccb-list" id="cab-controls-list"></div> 106 </div> 107 108 <!-- Below the game: what to do, and how you are doing at it. Both are 109 filled by cabpage.js â the tips from the same table the pre-play 110 tutorial card reads, so a cabinet's advice exists in exactly one 111 place. --> 112 <section class="cab-below"> 113 <div class="panel"> 114 <h2>How to play</h2> 115 <div id="cab-howto"><p class="muted">—</p></div> 116 </div> 117 <div class="panel"> 118 <h2>Your progress</h2> 119 <div id="cab-progress"><p class="muted">—</p></div> 120 </div> 121 </section> 122 </div> 123 124 <aside id="sidebar"> 125 <!-- The three figures a player at a cabinet actually wants: what today 126 is worth, how they have done here, and where that puts them. Filled 127 by cabpage.js from /api/config and /api/me â the same endpoints the 128 leaderboard reads, so a cabinet cannot disagree with the board. --> 129 <div class="panel cab-side-stats"> 130 <div class="css-row"> 131 <span class="css-k">Top score</span>
132 <span class="css-v is-live" id="side-score">—</span> 133 </div> 134 <div class="css-row"> 135 <span class="css-k">Your best</span> 136 <span class="css-v" id="side-best">—</span> 137 </div> 138 <div class="css-row"> 139 <span class="css-k">Today’s rank</span> 140 <span class="css-v" id="side-rank">—</span> 141 </div> 142 </div> 143 <div class="panel"> 144 <h2>HIGH SCORES</h2> 145 <div id="hiscores"><p class="muted">No scores yet</p></div> 146 </div> 147 </aside> 148 </section> 149 </main> 150 151 <footer> 152 <div class="carpet"></div> 153 </footer> 154 155 <div id="dpad" class="hidden"> 156 <button data-dir="up" aria-label="up">▲</button> 157 <button data-dir="left" aria-label="left">◀</button> 158 <div class="dpad-center"></div> 159 <button data-dir="right" aria-label="right">▶</button> 160 <button data-dir="down" aria-label="down">▼</button> 161 </div> 162 <button id="fire-btn" class="hidden" aria-label="fire">FIRE</button> 163 164 <div id="prize-modal" class="hidden"> 165 <div id="prize-box"> 166 <p id="prize-label">TODAY’S BOARD</p> 167 <p id="prize-amount">?</p> 168 <p id="prize-detail"></p> 169 <a id="prize-room-btn" class="btn-ghost back-btn hidden" href="/prizeroom">Prize room</a> 170 <button id="prize-close" class="pixel-btn">PLAY AGAIN</button> 171 </div> 172 </div> 173 174
174<script defer src="/vendor/solana-web3-1.95.8.min.js?v=1025436e"></script>
174 175
175<script defer src="sfx.js?v=1025436e"></script>
175 176
176<script defer src="juice.js?v=1025436e"></script>
176 177
177<script defer src="konami.js?v=1025436e"></script>
177 178
178<script defer src="avatar.js?v=1025436e"></script>
178 179
179<script defer src="icons.js?v=1025436e"></script>
179 180
180<script defer src="panels.js?v=1025436e"></script>
180 181
181<script defer src="wallets.js?v=1025436e"></script>
181 182
182<script defer src="wallet.js?v=1025436e"></script>
182 183
183<script defer src="keys.js?v=1025436e"></script>
183 184
184<script defer src="rng.js?v=1025436e"></script>
184 185
185<script defer src="ricochet.js?v=1025436e"></script>
185 186
186<script defer src="capture.js?v=1025436e"></script>
186 187
187<script defer src="checkpoints.js?v=1025436e"></script>
187 188
188<script defer src="coins.js?v=1025436e"></script>
188 189
189<script defer src="initials.js?v=1025436e"></script>
189 190
190<script defer src="touch.js?v=1025436e"></script>
190 191
191<script defer src="playui.js?v=1025436e"></script>
191 192
192<script defer src="app.js?v=1025436e"></script>
192 193
193<script defer src="cabpage.js?v=1025436e"></script>
193 194
194<script defer src="attract.js?v=1025436e"></script>
194 195</body> 196</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.