PageSourceSearch

https://esbiefonte-cloudjumper.netlify.app/

html esbiefonte-cloudjumper.netlify.app collected 2026-10-03 10:42:30 UTC 16,883 bytes, 462 lines download raw bytes

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.