1<!DOCTYPE html> 2<html lang="en"> 3 <head> 4 <!-- Generated by GameMaker:Studio http://www.yoyogames.com/gamemaker/studio --> 5 <meta http-equiv="X-UA-Compatible" content="IE=edge" /> 6 <meta http-equiv="pragma" content="no-cache"/> 7 <meta name="apple-mobile-web-app-capable" content="yes" /> 8 <meta name ="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" /> 9 <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" /> 10 <meta charset="utf-8"/> 11 12 <title>Created with GameMaker</title> 13 14 <style> 15 html { 16 height: 100%; 17 overflow: hidden; 18 } 19 body { 20 background: #000; 21 color: #cccccc; 22 margin: 0; 23 padding: 0; 24 border: 0; 25 height: 100%; 26 overflow: hidden; 27 display: flex; 28 flex-direction: row; 29 justify-content: center; 30 align-items: center; 31 } 32 33 /* ââ Side panels ââ */ 34 .side-panel { 35 flex: 1; 36 height: 100%; 37 display: flex; 38 flex-direction: column; 39 align-items: center; 40 justify-content: center; 41 padding: 20px; 42 box-sizing: border-box; 43 overflow: hidden; 44 } 45 46 /* Hide panels when there is not enough room */ 47 @media (max-width: 900px) { 48 .side-panel { display: none; } 49 } 50 51 /* ââ Left panel â Cat ââ */ 52 #panel-left { 53 position: relative; 54 } 55 56 .cloud-scene { 57 position: relative; 58 width: 220px; 59 height: 160px; 60 } 61 62 /* Animated cloud that drifts leftâright */ 63 .cloud-svg { 64 position: absolute; 65 bottom: 0; 66 left: 50%; 67 transform: translateX(-50%); 68 width: 200px; 69 animation: cloudDrift 4s ease-in-out infinite alternate; 70 } 71 72 @keyframes cloudDrift { 73 0% { transform: translateX(-60%); } 74 100% { transform: translateX(-40%); } 75 } 76 77 /* Cat sits on top of the cloud and follows it */ 78 .cat-img { 79 position: absolute; 80 bottom: 68px; /* sits on top of cloud */ 81 left: 50%; 82 transform: translateX(-50%); 83 width: 90px; 84 image-rendering: pixelated; 85 animation: cloudDrift 4s ease-in-out infinite alternate; 86 z-index: 2; 87 } 88 89 /* ââ Right panel â Directions ââ */ 90 #panel-right { 91 gap: 16px; 92 } 93 94 .directions-img { 95 width: min(160px, 80%); 96 image-rendering: pixelated; 97 } 98 99 .directions-text { 100 font-family: 'Courier New', monospace; 101 font-size: 15px; 102 color: #e8e8e8; 103 text-align: center; 104 line-height: 1.7; 105 max-width: 220px; 106 } 107 108 /* ââ Game canvas wrapper ââ */ 109 #gm4html5_div_id { 110 flex-shrink: 0; 111 display: flex; 112 justify-content: center; 113 align-items: center; 114 height: 100%; 115 } 116 117 canvas { 118 image-rendering: optimizeSpeed; 119 -webkit-interpolation-mode: nearest-neighbor; 120 -ms-touch-action: none; 121 margin: 0; 122 padding: 0; 123 border: 0; 124 transform-origin: center center; 125 } 126 127 :-webkit-full-screen #canvas { 128 width: 100%; 129 height: 100%; 130 } 131 132 div.gm4html5_div_class { 133 margin: 0; 134 padding: 0; 135 border: 0; 136 display: flex; 137 justify-content: center; 138 align-items: center; 139 } 140 141 /* START - Login Dialog Box */ 142 div.gm4html5_login { 143 padding: 20px; 144 position: absolute; 145 border: solid 2px #000000; 146 background-color: #404040; 147 color: #00ff00; 148 border-radius: 15px; 149 box-shadow: #101010 20px 20px 40px; 150 } 151 div.gm4html5_cancel_button { float: right; } 152 div.gm4html5_login_button { float: left; } 153 div.gm4html5_login_header { text-align: center; } 154 /* END - Login Dialog Box */ 155 156 :-webkit-full-screen { 157 width: 100%; 158 height: 100%; 159 } 160 161 /* ââ Mobile touch controls ââ */ 162 .touch-controls { 163 display: none; 164 position: fixed; 165 bottom: 0; 166 left: 0; 167 right: 0; 168 z-index: 1000; 169 pointer-events: none; 170 } 171 172 @media (hover: none) and (pointer: coarse) { 173 .touch-controls { display: flex; } 174 } 175 176 .touch-btn { 177 pointer-events: auto; 178 position: fixed; 179 bottom: 24px; 180 width: 80px; 181 height: 80px; 182 border-radius: 50%; 183 background: rgba(255, 255, 255, 0.18); 184 border: 2px solid rgba(255, 255, 255, 0.35); 185 display: flex; 186 align-items: center; 187 justify-content: center; 188 -webkit-tap-highlight-color: transparent; 189 user-select: none; 190 -webkit-user-select: none; 191 touch-action: manipulation; 192 } 193 194 .touch-btn:active { 195 background: rgba(255, 255, 255, 0.35); 196 } 197
198 .touch-btn-left { left: 24px; } 199 .touch-btn-right { right: 24px; } 200 201 .touch-btn svg { 202 width: 36px; 203 height: 36px; 204 fill: rgba(255, 255, 255, 0.7); 205 } 206 207 .touch-tap-zone { 208 pointer-events: auto; 209 position: fixed; 210 bottom: 24px; 211 left: 50%; 212 transform: translateX(-50%); 213 padding: 10px 28px; 214 border-radius: 24px; 215 background: rgba(255, 255, 255, 0.15); 216 border: 2px solid rgba(255, 255, 255, 0.3); 217 color: rgba(255, 255, 255, 0.6); 218 font-family: 'Courier New', monospace; 219 font-size: 14px; 220 -webkit-tap-highlight-color: transparent; 221 user-select: none; 222 -webkit-user-select: none; 223 touch-action: manipulation; 224 } 225 226 .touch-tap-zone:active { 227 background: rgba(255, 255, 255, 0.3); 228 } 229 230 #sound-toggle { 231 display: none; 232 position: fixed; 233 z-index: 1100; 234 box-sizing: border-box; 235 align-items: center; 236 justify-content: center; 237 padding: 0 4px; 238 border: 0; 239 border-radius: 2px; 240 background: #000; 241 color: #f4f4f4; 242 font-family: 'Courier New', monospace; 243 font-weight: 700; 244 line-height: 1; 245 white-space: nowrap; 246 cursor: pointer; 247 -webkit-tap-highlight-color: transparent; 248 touch-action: manipulation; 249 } 250 251 #sound-toggle:hover { 252 color: #fff; 253 } 254 255 #sound-toggle:focus-visible { 256 outline: 2px solid #fff; 257 outline-offset: 2px; 258 } 259 </style> 260 </head> 261 262 <body> 263 264 <!-- ââ Left panel: Cat on a cloud ââ --> 265 <div class="side-panel" id="panel-left"> 266 <div class="cloud-scene"> 267 <!-- Simple SVG cloud --> 268 <svg class="cloud-svg" viewBox="0 0 200 80" xmlns="http://www.w3.org/2000/svg"> 269 <ellipse cx="100" cy="55" rx="90" ry="25" fill="#b0c8e8"/> 270 <ellipse cx="70" cy="42" rx="45" ry="30" fill="#c8dff5"/> 271 <ellipse cx="120" cy="38" rx="40" ry="28" fill="#d8eaff"/> 272 <ellipse cx="100" cy="44" rx="60" ry="26" fill="#ddeeff"/> 273 </svg> 274 <img class="cat-img" src="assets/Cat.png" alt="Cat" /> 275 </div> 276 </div> 277 278 <!-- ââ Game canvas ââ --> 279 <div class="gm4html5_div_class" id="gm4html5_div_id"> 280 <canvas id="canvas" width="1080" height="1920"> 281 <p>Your browser doesn't support HTML5 canvas.</p> 282 </canvas> 283 </div> 284 285 <!-- ââ Right panel: Directions ââ --> 286 <div class="side-panel" id="panel-right"> 287 <img class="directions-img" src="assets/DIRECTIONS.png" alt="Directions" /> 288 <p class="directions-text"> 289 Use the space bar to begin, use the left and right arrows to scale the clouds and avoid oblivion. 290 </p> 291 </div> 292 293 <!-- ââ Mobile touch controls ââ --> 294 <div class="touch-controls" id="touch-controls"> 295 <button class="touch-btn touch-btn-left" id="btn-left" aria-label="Move left"> 296 <svg viewBox="0 0 24 24"><path d="M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"/></svg> 297 </button> 298 <button class="touch-tap-zone" id="btn-tap">TAP</button> 299 <button class="touch-btn touch-btn-right" id="btn-right" aria-label="Move right"> 300 <svg viewBox="0 0 24 24"><path d="M8.59 16.59L10 18l6-6-6-6-1.41 1.41L13.17 12z"/></svg> 301 </button> 302 </div> 303 304 <button id="sound-toggle" type="button" aria-label="Turn sound off">SOUND OFF</button> 305 306 <!-- Run the game code --> 307
307<script type="text/javascript" src="html5game/Esbie Fonte-Cloud Jumper_repaired.js?QNPAC=429714233"></script>
307 308
308<script>window.onload = GameMaker_Init;</script>
308 309
309<script> 310 function fitGameToScreen() { 311 var canvas = document.getElementById('canvas'); 312 if (!canvas) return; 313 var gameW = canvas.width || 1080; 314 var gameH = canvas.height || 1920; 315 var scaleX = window.innerWidth / gameW; 316 var scaleY = window.innerHeight / gameH; 317 var scale = Math.min(scaleX, scaleY); 318 canvas.style.transform = 'scale(' + scale + ')'; 319 } 320 window.addEventListener('resize', fitGameToScreen); 321 window.addEventListener('load', function() { setTimeout(fitGameToScreen, 200); }); 322 </script>
322 323
323<script> 324 (function() { 325 var soundEnabled = true; 326 var lastToggleTime = 0; 327 var soundButton = document.getElementById('sound-toggle'); 328 329 function applySoundState() { 330 if (typeof audio_master_gain === 'function') { 331 try { 332 audio_master_gain(soundEnabled ? 1 : 0); 333 } catch (error) {} 334 } 335 336 document.querySelectorAll('audio, video').forEach(function(media) { 337 media.muted = !soundEnabled; 338 }); 339 340 soundButton.textContent = soundEnabled ? 'SOUND OFF' : 'SOUND ON'; 341 soundButton.setAttribute('aria-label', soundEnabled ? 'Turn sound off' : 'Turn sound on'); 342 } 343 344 window.toggleGameSound = function() { 345 var now = performance.now(); 346 if (now - lastToggleTime < 250) return; 347 lastToggleTime = now; 348 soundEnabled = !soundEnabled; 349 applySoundState(); 350 }; 351 352 function currentRoomName() { 353 if (typeof room_get_name !== 'function' || typeof g_pBuiltIn === 'undefined') return ''; 354 try { 355 return room_get_name(g_pBuiltIn.room); 356 } catch (error) { 357 return ''; 358 } 359 } 360 361 function positionSoundButton() { 362 var canvas = document.getElementById('canvas'); 363 if (!canvas || currentRoomName() !== 'rm_game') { 364 soundButton.style.display = 'none'; 365 return; 366 } 367 368 var rect = canvas.getBoundingClientRect(); 369 var scaleX = rect.width / canvas.width; 370 var scaleY = rect.height / canvas.height; 371 var centerX = rect.left + (576 * scaleX); 372 var centerY = rect.top + (1846 * scaleY); 373 var width = Math.max(74, 114 * scaleX); 374 var height = Math.max(24, 28 * scaleY); 375 376 soundButton.style.display = 'flex'; 377 soundButton.style.left = (centerX - width / 2) + 'px'; 378 soundButton.style.top = (centerY - height / 2) + 'px'; 379 soundButton.style.width = width + 'px'; 380 soundButton.style.height = height + 'px'; 381 soundButton.style.fontSize = Math.max(9, Math.min(16, height * 0.52)) + 'px'; 382 } 383 384 soundButton.addEventListener('click', window.toggleGameSound); 385 window.addEventListener('resize', positionSoundButton); 386 window.addEventListener('load', function() { 387 applySoundState(); 388 positionSoundButton(); 389 setInterval(function() { 390 positionSoundButton(); 391 if (!soundEnabled) applySoundState(); 392 }, 200); 393 }); 394 })(); 395 </script>
395 396
396<script> 397 (function() { 398 function mockEvent(code) { 399 return { 400 which: code, keyCode: code, shiftKey: false, 401 repeat: false, char: '', key: '', 402 preventDefault: function() {}, 403 stopPropagation: function() {} 404 }; 405 } 406 407 function holdKey(code) { 408 if (typeof window.onkeydown === 'function') { 409 window.onkeydown(mockEvent(code)); 410 } 411 } 412 413 function releaseKey(code) { 414 if (typeof window.onkeyup === 'function') { 415 window.onkeyup(mockEvent(code)); 416 } 417 } 418 419 function setupBtn(id, code) { 420 var el = document.getElementById(id); 421 var interval = null; 422 423 function start(e) { 424 e.preventDefault(); 425 holdKey(code); 426 clearInterval(interval); 427 interval = setInterval(function() { holdKey(code); }, 50); 428 } 429 430 function stop(e) { 431 e.preventDefault(); 432 clearInterval(interval); 433 interval = null; 434 releaseKey(code); 435 } 436 437 el.addEventListener('touchstart', start, { passive: false }); 438 el.addEventListener('touchend', stop, { passive: false }); 439 el.addEventListener('touchcancel', stop, { passive: false }); 440 el.addEventListener('contextmenu', function(e) { e.preventDefault(); }); 441 } 442 443 function setupTap(id, code) { 444 var el = document.getElementById(id); 445 el.addEventListener('touchstart', function(e) { 446 e.preventDefault(); 447 holdKey(code); 448 releaseKey(code); 449 }, { passive: false }); 450 el.addEventListener('contextmenu', function(e) { e.preventDefault(); }); 451 } 452 453 window.addEventListener('load', function() { 454 setupBtn('btn-left', 37); 455 setupBtn('btn-right', 39); 456 setupTap('btn-tap', 32); 457 }); 458 })(); 459 </script>
459 460
460<script async src="/.netlify/scripts/ar" data-netlify-deploy-id="6a67c2e551d44f0008749796" data-netlify-site-id="fe4919bd-1422-4f16-88a8-f6e2c2907741" data-agent-runner-id="6a67c1b78af3e650334e9648"></script>
460 461</body> 462</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.