<snapdata remixID="15128167"><project name="Ragebaiting Parkour" app="Snap! 11.0.8, https://snap.berkeley.edu" version="2"><notes></notes><thumbnail>data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAYAAAB1ovlvAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAoKADAAQAAAABAAAAeAAAAAAeaS0RAAADJklEQVR4Ae3XvUllARSF0fuGMbYFq7EGwcTANqzHSmzGVNDQccwMHNiwZSuzXub1cM5z+eHP6fXtdXgRGAn8Gt11lsC7gACFMBUQ4JTfcQFqYCogwCm/4wLUwFRAgFN+xwWogamAAKf8jgtQA1MBAU75HRegBqYCApzyOy5ADUwFBDjld1yAGpgKCHDK77gANTAVEOCU33EBamAqIMApv+MC1MBUQIBTfscFqIGpgACn/I4LUANTAQFO+R0XoAamAgKc8jsuQA1MBQQ45XdcgBqYCghwyu+4ADUwFRDglN9xAWpgKiDAKb/jAtTAVECAU37HBaiBqYAAp/yOC1ADUwEBTvkdF6AGpgICnPI7LkANTAUEOOV3XIAamAoIcMrvuAA1MBUQ4JTfcQFqYCogwCm/4wLUwFRAgFN+xwWoganA7+n1b3z8/v7+eHp6Oi4vL4+Li4tv/E5/9ls7vb69fvaX8DXv/vn5+bi9vT1eXl6Ox8fH4/r6+jidTu/Pzs7Ovubof7hVgP/4pj88PBx3d3fH+fn5h6m/Ud7c3Lw/u7q6+vA5H2QC/gbMvEyXBfwE/ATUr+BPYMqPBfgJqH9CPoEpPxZgGdS6TMDfgJmX6bKAAMug1mUCAsy8TJcFBFgGtS4TEGDmZbosIMAyqHWZgAAzL9NlAQGWQa3LBASYeZkuCwiwDGpdJiDAzMt0WUCAZVDrMgEBZl6mywICLINalwkIMPMyXRYQYBnUukxAgJmX6bKAAMug1mUCAsy8TJcFBFgGtS4TEGDmZbosIMAyqHWZgAAzL9NlAQGWQa3LBASYeZkuCwiwDGpdJiDAzMt0WUCAZVDrMgEBZl6mywICLINalwkIMPMyXRYQYBnUukxAgJmX6bKAAMug1mUCAsy8TJcFBFgGtS4TEGDmZbosIMAyqHWZgAAzL9NlAQGWQa3LBASYeZkuCwiwDGpdJiDAzMt0WUCAZVDrMgEBZl6mywICLINalwkIMPMyXRYQYBnUukxAgJmX6bKAAMug1mUCAsy8TJcFBFgGtS4TEGDmZbosIMAyqHWZgAAzL9NlAQGWQa3LBP4AtIpF1RL41EAAAAAASUVORK5CYII=</thumbnail><scenes select="1"><scene name="Ragebaiting Parkour"><notes></notes><hidden></hidden><headers></headers><code></code><blocks><block-definition s="Open HTML %&apos;text&apos; tab name %&apos;c&apos;" type="command" category="other"><header></header><code></code><translations></translations><inputs><input type="%code">HTML</input><input type="%s">Tab Name</input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>b</l><l>c</l></list><l>var myWindow;&#xD;&#xD; myWindow = window.open("", "myWindow", "width=200,height=100");&#xD;  myWindow.document.write("&lt;title&gt;" + c + "&lt;/title&gt;" + b + "");</l></block><list><block var="text"/><block var="c"/></list></block></script></block-definition></blocks><primitives></primitives><stage name="Stage" width="480" height="360" costume="0" color="255,255,255,1" tempo="60" threadsafe="false" penlog="false" volume="100" pan="0" lines="round" ternary="false" hyperops="true" codify="false" inheritance="true" sublistIDs="false" id="20"><pentrails>data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeAAAAFoCAYAAACPNyggAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAB4KADAAQAAAABAAABaAAAAAAHwbojAAAL30lEQVR4Ae3QMQEAAADCoPVPbQwfiEBhwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGPgMDI3+AAEeFvcCAAAAAElFTkSuQmCC</pentrails><costumes><list struct="atomic" id="21"></list></costumes><sounds><list struct="atomic" id="22"></list></sounds><variables></variables><blocks></blocks><scripts></scripts><sprites select="1"><sprite name="Sprite" idx="1" x="0" y="0" heading="90" scale="1" volume="100" pan="0" rotation="1" draggable="true" costume="0" color="80,80,80,1" pen="tip" id="27"><costumes><list struct="atomic" id="28"></list></costumes><sounds><list struct="atomic" id="29"></list></sounds><blocks></blocks><variables></variables><scripts><script x="26.80000000000001" y="41.599999999999994"><block s="receiveGo"></block><custom-block s="Open HTML %code tab name %s"><l>&lt;!DOCTYPE html&gt;&#xD;&lt;html&gt;&#xD;&lt;head&gt;&#xD;    &lt;title&gt;50 LEVELS OF DESPAIR - ULTIMATE ADMIN&lt;/title&gt;&#xD;    &lt;style&gt;&#xD;        body { margin: 0; overflow: hidden; background: #050505; font-family: &apos;Courier New&apos;, monospace; color: #e5b95f; }&#xD;        canvas { display: block; background: linear-gradient(#050505, #1a0505); }&#xD;        #ui { position: absolute; top: 10px; left: 10px; pointer-events: none; background: rgba(0,0,0,0.8); padding: 10px; border: 2px solid #333; z-index: 20; }&#xD;        #settingsBtn { position: absolute; bottom: 20px; left: 20px; padding: 10px; background: #333; border: 1px solid #e5b95f; color: #e5b95f; cursor: pointer; z-index: 300; }&#xD;        #adminPanel { position: absolute; top: 10px; right: 10px; background: rgba(20, 0, 0, 0.9); border: 2px solid #ff4444; padding: 10px; color: #ff4444; display: none; z-index: 100; font-size: 11px; width: 200px; box-shadow: 0 0 15px #ff0000; }&#xD;        .admin-stat { display: flex; justify-content: space-between; margin-bottom: 2px; }&#xD;        #settingsMenu { position: absolute; bottom: 70px; left: 20px; background: rgba(0,0,0,0.98); border: 2px solid #e5b95f; padding: 20px; display: none; z-index: 300; width: 240px; box-shadow: 0 0 30px #000; text-align: center; }&#xD;        #pixelContainer { display: grid; grid-template-columns: repeat(10, 22px); gap: 1px; background: #222; border: 2px solid #e5b95f; margin: 15px auto; width: fit-content; user-select: none; touch-action: none; }&#xD;        .px { width: 22px; height: 22px; background: #111; pointer-events: auto; }&#xD;        .px.grid-on { border: 0.1px solid rgba(255,255,255,0.05); box-sizing: border-box; }&#xD;        .controls { display: grid; grid-template-columns: 1fr 1fr; gap: 5px; margin-bottom: 10px; }&#xD;        button { cursor: pointer; font-family: inherit; padding: 6px; background: #222; color: #e5b95f; border: 1px solid #e5b95f; font-size: 11px; }&#xD;        button.active { background: #e5b95f; color: #000; font-weight: bold; }&#xD;        input[type="color"] { width: 100%; height: 30px; border: none; background: none; cursor: pointer; grid-column: span 2; }&#xD;        #deathMessage { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); font-size: 80px; font-weight: 900; color: #ff0000; text-shadow: 0 0 20px black; display: none; z-index: 500; pointer-events: none; letter-spacing: 5px; text-align: center; }&#xD;        #winScreen { position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.9); display: none; flex-direction: column; align-items: center; justify-content: center; z-index: 1000; text-align: center; }&#xD;    &lt;/style&gt;&#xD;&lt;/head&gt;&#xD;&lt;body&gt;&#xD;    &lt;div id="ui"&gt;LEVEL: &lt;span id="lvl"&gt;1&lt;/span&gt;/50&lt;br&gt;DEATHS: &lt;span id="deaths"&gt;0&lt;/span&gt;&lt;/div&gt;&#xD;    &lt;div id="deathMessage"&gt;DO BETTER&lt;/div&gt;&#xD;    &lt;div id="winScreen"&gt;&#xD;        &lt;h1 style="font-size: 60px; color: #e5b95f;"&gt;YOU DEFEATED DESPAIR&lt;/h1&gt;&#xD;        &lt;p style="font-size: 24px;"&gt;TOTAL DEATHS: &lt;span id="finalDeaths"&gt;0&lt;/span&gt;&lt;/p&gt;&#xD;        &lt;button onclick="location.reload()" style="padding: 15px 30px; font-size: 20px; background: #e5b95f; color: #000; border: none; cursor: pointer; font-weight: bold;"&gt;PLAY AGAIN?&lt;/button&gt;&#xD;    &lt;/div&gt;&#xD;&#xD;    &lt;div id="adminPanel"&gt;&#xD;        &lt;strong&gt;[ADMIN CONSOLE]&lt;/strong&gt;&lt;hr&gt;&#xD;        &lt;div class="admin-stat"&gt;LEVEL TP (G): &lt;span id="stat-lvltp"&gt;READY&lt;/span&gt;&lt;/div&gt;&#xD;        &lt;div class="admin-stat"&gt;MAP TP (J): &lt;span id="stat-clicktp"&gt;OFF&lt;/span&gt;&lt;/div&gt;&#xD;        &lt;div class="admin-stat"&gt;FLYING (F): &lt;span id="stat-fly"&gt;OFF&lt;/span&gt;&lt;/div&gt;&#xD;        &lt;div class="admin-stat"&gt;GHOST (H): &lt;span id="stat-ghost"&gt;OFF&lt;/span&gt;&lt;/div&gt;&#xD;        &lt;div class="admin-stat"&gt;SPEED (U): &lt;span id="stat-fast"&gt;OFF&lt;/span&gt;&lt;/div&gt;&#xD;        &lt;div class="admin-stat"&gt;JUMPS (K): &lt;span id="stat-maxjumps"&gt;2&lt;/span&gt;&lt;/div&gt;&#xD;        &lt;div class="admin-stat"&gt;FREEZE (R): &lt;span id="stat-freeze"&gt;OFF&lt;/span&gt;&lt;/div&gt;&#xD;        &lt;div class="admin-stat"&gt;REVEAL (Y): &lt;span id="stat-reveal"&gt;OFF&lt;/span&gt;&lt;/div&gt;&#xD;        &lt;div style="font-size: 9px; color: #888; margin-top: 5px;"&gt;MAP: CLICK TO MARK, ENTER TO WARP&lt;/div&gt;&#xD;    &lt;/div&gt;&#xD;&#xD;    &lt;button id="settingsBtn" onclick="toggleSettings()"&gt;SETTINGS / DESIGN SKIN&lt;/button&gt;&#xD;    &lt;div id="settingsMenu"&gt;&#xD;        &lt;strong&gt;PIXEL ART PRO&lt;/strong&gt;&#xD;        &lt;div id="pixelContainer"&gt;&lt;/div&gt;&#xD;        &lt;div class="controls"&gt;&#xD;            &lt;input type="color" id="brushColor" value="#e5b95f"&gt;&#xD;            &lt;button id="drawBtn" class="active" onclick="setTool(&apos;draw&apos;)"&gt;PENCIL&lt;/button&gt;&#xD;            &lt;button id="eraseBtn" onclick="setTool(&apos;erase&apos;)"&gt;ERASER&lt;/button&gt;&#xD;            &lt;button id="fillBtn" onclick="setTool(&apos;fill&apos;)"&gt;BUCKET&lt;/button&gt;&#xD;            &lt;button id="mirrorBtn" onclick="toggleMirror()"&gt;MIRROR: OFF&lt;/button&gt;&#xD;            &lt;button onclick="clearGrid()" style="grid-column: span 2;"&gt;CLEAR CANVAS&lt;/button&gt;&#xD;        &lt;/div&gt;&#xD;        &lt;button onclick="applyDrawing()" style="width:100%; font-weight:bold; background:#e5b95f; color:#000;"&gt;APPLY TO PLAYER&lt;/button&gt;&#xD;        &lt;button onclick="toggleSettings()" style="width:100%; margin-top:5px; border-color:#555;"&gt;CLOSE&lt;/button&gt;&#xD;    &lt;/div&gt;&#xD;    &#xD;    &lt;canvas id="gameCanvas"&gt;&lt;/canvas&gt;&#xD;&#xD;&lt;script&gt;&#xD;const canvas = document.getElementById(&apos;gameCanvas&apos;);&#xD;const ctx = canvas.getContext(&apos;2d&apos;);&#xD;canvas.width = window.innerWidth; canvas.height = window.innerHeight;&#xD;&#xD;let currentLevel = 1, deaths = 0, keys = {}, platforms = [], cameraX = 0, shake = 0;&#xD;const gravity = 0.58, jumpPower = -13, lavaLevel = canvas.height - 40;&#xD;let isAdmin = false, isFlying = false, isGhost = false, isFast = false, isFrozen = false, isRevealing = false, isMapMode = false, gameActive = true;&#xD;let maxJumps = 2, previewX = 0, previewY = 0, ghostActive = false;&#xD;&#xD;const gridW = 10, gridH = 14;&#xD;let drawingData = Array(gridW * gridH).fill(null);&#xD;let mirrorMode = false, currentTool = &apos;draw&apos;, isUserPainting = false;&#xD;&#xD;function initGrid() {&#xD;    const container = document.getElementById(&apos;pixelContainer&apos;); container.innerHTML = &apos;&apos;;&#xD;    for (let i = 0; i &lt; gridW * gridH; i++) {&#xD;        const p = document.createElement(&apos;div&apos;); p.className = &apos;px grid-on&apos;; p.id = &apos;px-&apos; + i;&#xD;        p.addEventListener(&apos;pointerdown&apos;, (e) =&gt; { isUserPainting = true; p.releasePointerCapture(e.pointerId); handlePixelInput(i); });&#xD;        p.addEventListener(&apos;pointerenter&apos;, () =&gt; { if (isUserPainting &amp;&amp; currentTool !== &apos;fill&apos;) handlePixelInput(i); });&#xD;        container.appendChild(p);&#xD;    }&#xD;}&#xD;window.addEventListener(&apos;pointerup&apos;, () =&gt; isUserPainting = false);&#xD;&#xD;canvas.addEventListener(&apos;mousedown&apos;, (e) =&gt; {&#xD;    if (isAdmin &amp;&amp; isMapMode) {&#xD;        const totalWidth = platforms[platforms.length-1].x + 500;&#xD;        const scale = canvas.width / totalWidth;&#xD;        const vOffset = (canvas.height / scale / 2) - 300;&#xD;        previewX = e.clientX / scale;&#xD;        previewY = (e.clientY / scale) - vOffset;&#xD;        ghostActive = true;&#xD;    }&#xD;});&#xD;&#xD;function setTool(t) {&#xD;    currentTool = t;&#xD;    document.getElementById(&apos;drawBtn&apos;).classList.toggle(&apos;active&apos;, t === &apos;draw&apos;);&#xD;    document.getElementById(&apos;eraseBtn&apos;).classList.toggle(&apos;active&apos;, t === &apos;erase&apos;);&#xD;    document.getElementById(&apos;fillBtn&apos;).classList.toggle(&apos;active&apos;, t === &apos;fill&apos;);&#xD;}&#xD;&#xD;function handlePixelInput(index) { if (currentTool === &apos;fill&apos;) floodFill(index % gridW, Math.floor(index / gridW)); else drawAt(index); }&#xD;function drawAt(index) {&#xD;    const color = currentTool === &apos;draw&apos; ? document.getElementById(&apos;brushColor&apos;).value : null;&#xD;    const x = index % gridW, y = Math.floor(index / gridW);&#xD;    updatePixel(x, y, color); if (mirrorMode) updatePixel((gridW - 1) - x, y, color);&#xD;}&#xD;function updatePixel(x, y, color) {&#xD;    if (x &lt; 0 || x &gt;= gridW || y &lt; 0 || y &gt;= gridH) return;&#xD;    const idx = y * gridW + x; drawingData[idx] = color;&#xD;    const el = document.getElementById(&apos;px-&apos; + idx); if (el) el.style.backgroundColor = color || &apos;#111&apos;;&#xD;}&#xD;function floodFill(startX, startY) {&#xD;    const targetColor = drawingData[startY * gridW + startX]; const fillColor = document.getElementById(&apos;brushColor&apos;).value;&#xD;    if (targetColor === fillColor) return;&#xD;    function fill(x, y) {&#xD;        if (x &lt; 0 || x &gt;= gridW || y &lt; 0 || y &gt;= gridH || drawingData[y * gridW + x] !== targetColor) return;&#xD;        updatePixel(x, y, fillColor); if (mirrorMode) updatePixel((gridW - 1) - x, y, fillColor);&#xD;        fill(x + 1, y); fill(x - 1, y); fill(x, y + 1); fill(x, y - 1);&#xD;    }&#xD;    fill(startX, startY);&#xD;}&#xD;function toggleMirror() { mirrorMode = !mirrorMode; const btn = document.getElementById(&apos;mirrorBtn&apos;); btn.innerText = "MIRROR: " + (mirrorMode ? "ON" : "OFF"); btn.classList.toggle(&apos;active&apos;, mirrorMode); }&#xD;function clearGrid() { drawingData.fill(null); document.querySelectorAll(&apos;.px&apos;).forEach(p =&gt; p.style.backgroundColor = &apos;#111&apos;); }&#xD;&#xD;let player = { x: 50, y: 400, w: 25, h: 35, vx: 0, vy: 0, grounded: false, jumpsLeft: 2, lastSafeX: 50, lastSafeY: 400, skin: &apos;classic&apos;, coyoteTime: 0 };&#xD;&#xD;function applyDrawing() { player.skin = &apos;custom&apos;; toggleSettings(); }&#xD;function toggleSettings() { let menu = document.getElementById(&apos;settingsMenu&apos;); menu.style.display = (menu.style.display === &apos;block&apos;) ? &apos;none&apos; : &apos;block&apos;; }&#xD;function sRandom(seed) { var x = Math.sin(seed) * 10000; return x - Math.floor(x); }&#xD;&#xD;function generateLevel(lvl) {&#xD;    platforms = []; player.x = 50; player.y = 400; player.vx = player.vy = 0; cameraX = 0; ghostActive = false;&#xD;    platforms.push({x: -100, y: 500, w: 400, h: 100, type: &apos;start&apos;, visible: true});&#xD;    let baseNum = 8, lengthIncr = lvl &gt;= 4 ? (lvl - 3) * 2 : 0;&#xD;    let num = baseNum + lengthIncr, redRemaining = lvl &gt;= 4 ? (lvl - 3) : 0;&#xD;    let lastX = 350, lastY = 500, lastWasRed = false;&#xD;    for (let i = 0; i &lt; num; i++) {&#xD;        let seed = lvl * 100 + i;&#xD;        let type = &apos;normal&apos;;&#xD;        if (redRemaining &gt; 0 &amp;&amp; !lastWasRed &amp;&amp; sRandom(seed + 5) &gt; 0.45) { type = &apos;danger&apos;; redRemaining--; lastWasRed = true; }&#xD;        else { let rand = sRandom(seed); if (rand &gt; 0.94) type = &apos;fake&apos;; else if (rand &gt; 0.88) type = &apos;troll&apos;; else if (lvl &gt; 5 &amp;&amp; rand &lt; 0.08) type = &apos;ghost&apos;; lastWasRed = false; }&#xD;        let nX = lastX + 160 + (sRandom(seed) * 220), nY = Math.max(180, Math.min(canvas.height - 280, lastY + (sRandom(seed+1)*180-90)));&#xD;        platforms.push({ x: nX, y: nY, w: Math.max(45, 90 - (lvl * 0.3)), h: 18, type, visible: true });&#xD;        lastX = nX; lastY = nY;&#xD;    }&#xD;    platforms.push({ x: lastX + 220, y: lastY - 40, w: 60, h: 60, type: &apos;goal&apos;, visible: true });&#xD;}&#xD;&#xD;function triggerWin() { gameActive = false; document.getElementById(&apos;finalDeaths&apos;).innerText = deaths; document.getElementById(&apos;winScreen&apos;).style.display = &apos;flex&apos;; shake = 100; }&#xD;&#xD;function reset() {&#xD;    if (isFlying || isMapMode || !gameActive) return; &#xD;    if (isGhost) { player.x = player.lastSafeX; player.y = player.lastSafeY; player.vx = player.vy = 0; return; }&#xD;    deaths++; document.getElementById(&apos;deaths&apos;).innerText = deaths; shake = 25;&#xD;    let msg = document.getElementById(&apos;deathMessage&apos;); msg.style.display = &apos;block&apos;;&#xD;    setTimeout(() =&gt; { msg.style.display = &apos;none&apos;; }, 800);&#xD;    player.x = 50; player.y = 400; player.vx = 0; player.vy = 0; player.jumpsLeft = maxJumps;&#xD;    platforms.forEach(p =&gt; { if(p.type === &apos;troll&apos; || p.type === &apos;fake&apos;) p.visible = true; });&#xD;}&#xD;&#xD;window.addEventListener(&apos;keydown&apos;, e =&gt; {&#xD;    if (e.key === &apos;t&apos; || e.key === &apos;T&apos;) { if (prompt("ADMIN PASSWORD:") === "h3nh3n1214") { isAdmin = !isAdmin; document.getElementById(&apos;adminPanel&apos;).style.display = isAdmin ? &apos;block&apos; : &apos;none&apos;; } }&#xD;    if (isAdmin &amp;&amp; gameActive) {&#xD;        if (e.code === &apos;KeyF&apos;) isFlying = !isFlying;&#xD;        if (e.code === &apos;KeyH&apos;) isGhost = !isGhost;&#xD;        if (e.code === &apos;KeyJ&apos;) { isMapMode = !isMapMode; if (!isMapMode) ghostActive = false; }&#xD;        if (e.code === &apos;Enter&apos; &amp;&amp; isMapMode &amp;&amp; ghostActive) { player.x = previewX; player.y = previewY; isMapMode = false; ghostActive = false; }&#xD;        if (e.code === &apos;KeyG&apos;) { &#xD;            let t = prompt("TELEPORT TO LEVEL (1-50):");&#xD;            if (t &gt;= 1 &amp;&amp; t &lt;= 50) { currentLevel = parseInt(t); document.getElementById(&apos;lvl&apos;).innerText = t; generateLevel(currentLevel); }&#xD;        }&#xD;        if (e.code === &apos;KeyK&apos;) { let val = prompt("Enter Max Jumps:", maxJumps); if (!isNaN(val)) maxJumps = parseInt(val); }&#xD;        if (e.code === &apos;KeyU&apos;) isFast = !isFast;&#xD;        if (e.code === &apos;KeyR&apos;) isFrozen = !isFrozen;&#xD;        if (e.code === &apos;KeyY&apos;) isRevealing = !isRevealing;&#xD;        updateAdminUI();&#xD;    }&#xD;    keys[e.code] = true;&#xD;    if (!isFlying &amp;&amp; !isMapMode &amp;&amp; gameActive &amp;&amp; (e.code === &apos;Space&apos; || e.code === &apos;ArrowUp&apos; || e.code === &apos;KeyW&apos;)) {&#xD;        if (player.grounded || player.coyoteTime &gt; 0) { player.vy = jumpPower; player.grounded = false; player.coyoteTime = 0; player.jumpsLeft = maxJumps - 1; }&#xD;        else if (player.jumpsLeft &gt; 0) { player.vy = jumpPower * 0.9; player.jumpsLeft--; }&#xD;    }&#xD;});&#xD;window.addEventListener(&apos;keyup&apos;, e =&gt; keys[e.code] = false);&#xD;&#xD;function updateAdminUI() {&#xD;    if(!isAdmin) return;&#xD;    document.getElementById(&apos;stat-fly&apos;).innerText = isFlying ? "ON" : "OFF";&#xD;    document.getElementById(&apos;stat-ghost&apos;).innerText = isGhost ? "ON" : "OFF";&#xD;    document.getElementById(&apos;stat-clicktp&apos;).innerText = isMapMode ? "ZOOMED" : "OFF";&#xD;    document.getElementById(&apos;stat-maxjumps&apos;).innerText = maxJumps;&#xD;    document.getElementById(&apos;stat-fast&apos;).innerText = isFast ? "ON" : "OFF";&#xD;    document.getElementById(&apos;stat-freeze&apos;).innerText = isFrozen ? "ON" : "OFF";&#xD;    document.getElementById(&apos;stat-reveal&apos;).innerText = isRevealing ? "ON" : "OFF";&#xD;}&#xD;&#xD;function update() {&#xD;    if (isFrozen || isMapMode || !gameActive) return;&#xD;    let speed = isFast ? 14 : 7;&#xD;    if (isFlying) { if (keys[&apos;KeyW&apos;] || keys[&apos;ArrowUp&apos;] || keys[&apos;Space&apos;]) player.y -= speed; if (keys[&apos;KeyS&apos;] || keys[&apos;ArrowDown&apos;]) player.y += speed; player.vy = 0; } else { player.vy += gravity; }&#xD;    if (keys[&apos;KeyA&apos;] || keys[&apos;ArrowLeft&apos;]) player.vx = -speed; else if (keys[&apos;KeyD&apos;] || keys[&apos;ArrowRight&apos;]) player.vx = speed; else player.vx *= 0.85;&#xD;    player.x += player.vx; player.y += player.vy;&#xD;    cameraX += ((player.x - canvas.width / 4) - cameraX) * 0.1;&#xD;    if (player.grounded) player.coyoteTime = 10; else if (player.coyoteTime &gt; 0) player.coyoteTime--;&#xD;    player.grounded = false;&#xD;    platforms.forEach(p =&gt; {&#xD;        if (!p.visible) return;&#xD;        if (player.x &lt; p.x + p.w &amp;&amp; player.x + player.w &gt; p.x &amp;&amp; player.y &lt; p.y + p.h &amp;&amp; player.y + player.h &gt; p.y) {&#xD;            if (p.type === &apos;danger&apos;) { reset(); return; }&#xD;            if (player.vy &gt;= 0 &amp;&amp; player.y + player.h &lt; p.y + 20) {&#xD;                if (p.type === &apos;goal&apos;) { if (currentLevel === 50) triggerWin(); else { currentLevel++; document.getElementById(&apos;lvl&apos;).innerText = currentLevel; generateLevel(currentLevel); } return; }&#xD;                if (p.type === &apos;fake&apos;) { p.visible = false; return; }&#xD;                if (p.type === &apos;troll&apos;) { p.x += (player.vx * 1.5); }&#xD;                player.y = p.y - player.h; player.vy = 0; player.grounded = true; player.jumpsLeft = maxJumps;&#xD;                player.lastSafeX = p.x + 10; player.lastSafeY = p.y - player.h;&#xD;            }&#xD;        }&#xD;    });&#xD;    if (player.y &gt; canvas.height || player.y &gt; lavaLevel) reset();&#xD;    if (shake &gt; 0) shake *= 0.9;&#xD;}&#xD;&#xD;function draw() {&#xD;    ctx.setTransform(1, 0, 0, 1, 0, 0); ctx.clearRect(0, 0, canvas.width, canvas.height);&#xD;    let totalWidth = platforms[platforms.length-1].x + 500;&#xD;    let scale = canvas.width / totalWidth;&#xD;    let vOffset = (canvas.height / scale / 2) - 300;&#xD;&#xD;    if (isMapMode) {&#xD;        ctx.scale(scale, scale); ctx.translate(0, vOffset);&#xD;    } else {&#xD;        if (shake &gt; 1) { ctx.translate(Math.random() * shake - shake/2, Math.random() * shake - shake/2); }&#xD;        ctx.translate(-cameraX, 0);&#xD;    }&#xD;&#xD;    ctx.fillStyle = &apos;#ff2200&apos;; ctx.fillRect(isMapMode ? 0 : cameraX, lavaLevel, isMapMode ? 100000 : canvas.width, 100);&#xD;    platforms.forEach(p =&gt; {&#xD;        if (!p.visible) return;&#xD;        ctx.fillStyle = p.type === &apos;goal&apos; ? &apos;#e5b95f&apos; : (p.type === &apos;danger&apos; ? &apos;#ff0000&apos; : (p.type === &apos;ghost&apos; ? &apos;rgba(255,255,255,0.15)&apos; : &apos;#333&apos;));&#xD;        ctx.fillRect(p.x, p.y, p.w, p.h);&#xD;        if (isRevealing &amp;&amp; (p.type === &apos;fake&apos; || p.type === &apos;troll&apos;)) { ctx.strokeStyle = &apos;#00ffff&apos;; ctx.lineWidth = 3; } &#xD;        else { ctx.strokeStyle = p.type === &apos;danger&apos; ? &apos;#ff4444&apos; : &apos;#e5b95f&apos;; ctx.lineWidth = 1; }&#xD;        ctx.strokeRect(p.x, p.y, p.w, p.h);&#xD;    });&#xD;&#xD;    if (ghostActive) {&#xD;        ctx.fillStyle = &apos;rgba(0, 255, 255, 0.5)&apos;;&#xD;        ctx.fillRect(previewX, previewY, player.w, player.h);&#xD;        ctx.strokeStyle = &apos;#fff&apos;;&#xD;        ctx.lineWidth = 2 / (isMapMode ? scale : 1);&#xD;        ctx.strokeRect(previewX, previewY, player.w, player.h);&#xD;    }&#xD;&#xD;    if (player.skin === &apos;custom&apos;) {&#xD;        let pxW = player.w / gridW, pxH = player.h / gridH;&#xD;        drawingData.forEach((color, i) =&gt; { if (color) { ctx.fillStyle = color; ctx.fillRect(player.x + (i % gridW) * pxW, player.y + Math.floor(i / gridW) * pxH, pxW + 0.5, pxH + 0.5); } });&#xD;    } else { ctx.fillStyle = &apos;#e5b95f&apos;; ctx.fillRect(player.x, player.y, player.w, player.h); }&#xD;    requestAnimationFrame(() =&gt; { update(); draw(); });&#xD;}&#xD;initGrid(); generateLevel(1); draw();&#xD;&lt;/script&gt;&#xD;&lt;/body&gt;&#xD;&lt;/html&gt;&#xD;</l><l>Ragebaiting Parkour</l></custom-block></script></scripts></sprite></sprites></stage><variables></variables></scene></scenes></project><media name="Ragebaiting Parkour" app="Snap! 11.0.8, https://snap.berkeley.edu" version="2"></media></snapdata>