function applyNewJs() { document.body.addEventListener("keydown", (function(e) { 32 !== e.keyCode && 38 !== e.keyCode && 40 !== e.keyCode || e.target !== document.body || e.preventDefault() }), !1), document.getElementById("paused") && document.getElementById("paused").remove(), document.getElementById("mobile-controls") && document.getElementById("mobile-controls").remove(); var e = createElement("div", { id: "paused" }), t = createElement("span"); t.innerText = "CLICK TO UNPAUSE", e.appendChild(t), body.appendChild(e); var n = createElement("div", { id: "mobile-controls" }), x = createElement("div", { id: "move-left", className: "move" }), r = createElement("div", { id: "move-top", className: "move" }), i = createElement("div", { id: "move-right", className: "move" }), a = createElement("div", { id: "move-bottom", className: "move" }), o = createElement("div", { id: "move-fire", className: "move" }), l = createElement("span"), s = createElement("span"), d = createElement("span"), u = createElement("span"), p = createElement("span"); x.appendChild(l), r.appendChild(s), i.appendChild(d), a.appendChild(u), o.appendChild(p), n.appendChild(x), n.appendChild(r), n.appendChild(i), n.appendChild(a), n.appendChild(o), body.appendChild(n); var c = document.getElementById("move-right"), m = document.getElementById("move-left"), h = document.getElementById("move-top"), f = document.getElementById("move-bottom"), g = document.getElementById("move-fire"); c.addEventListener("touchstart", (function(e) { var t = new KeyboardEvent("keydown", { bubbles: !0, cancelable: !0, keyCode: 68 }); document.body.dispatchEvent(t) })), c.addEventListener("touchend", (function(e) { var t = new KeyboardEvent("keyup", { bubbles: !0, cancelable: !0, keyCode: 68 }); document.body.dispatchEvent(t) })), m.addEventListener("touchstart", (function(e) { var t = new KeyboardEvent("keydown", { bubbles: !0, cancelable: !0, keyCode: 65 }); document.body.dispatchEvent(t) })), m.addEventListener("touchend", (function(e) { var t = new KeyboardEvent("keyup", { bubbles: !0, cancelable: !0, keyCode: 65 }); document.body.dispatchEvent(t) })), h.addEventListener("touchstart", (function(e) { var t = new KeyboardEvent("keydown", { bubbles: !0, cancelable: !0, keyCode: 87 }); document.body.dispatchEvent(t) })), h.addEventListener("touchend", (function(e) { var t = new KeyboardEvent("keyup", { bubbles: !0, cancelable: !0, keyCode: 87 }); document.body.dispatchEvent(t) })), f.addEventListener("touchstart", (function(e) { var t = new KeyboardEvent("keydown", { bubbles: !0, cancelable: !0, keyCode: 83 }); document.body.dispatchEvent(t) })), f.addEventListener("touchend", (function(e) { var t = new KeyboardEvent("keyup", { bubbles: !0, cancelable: !0, keyCode: 83 }); document.body.dispatchEvent(t) })), g.addEventListener("touchstart", (function(e) { var t = new KeyboardEvent("keydown", { bubbles: !0, cancelable: !0, keyCode: 17 }); document.body.dispatchEvent(t) })), g.addEventListener("touchend", (function(e) { var t = new KeyboardEvent("keyup", { bubbles: !0, cancelable: !0, keyCode: 17 }); document.body.dispatchEvent(t) })), document.getElementById("data_display").style = "width:100%;font-size:13px" } function resetData() { var e; (e = document.getElementById("data_display")) && body.removeChild(e), window.data || (window.data = new Data) } function Data() { this.playerpower = 1, this.traveled = this.traveledold = 0, this.scorelevs = [100, 200, 400, 500, 800, 1e3, 2e3, 4e3, 5e3, 8e3], this.score = new DataObject(0, 6, "SCORE"), this.time = new DataObject(350, 3, "TIME"), this.world = new DataObject(0, 0, "WORLD"), this.coins = new DataObject(0, 0, "COINS"), this.lives = new DataObject(3, 1, "LIVES"), this.time.dir = -1, this.scoreold = 0 } function DataObject(e, t, n) { this.amount = e, this.length = t, this.name = n, this.element = createElement("td", { className: "indisplay" }) } function setDataDisplay() { var e = createElement("table", { id: "data_display", className: "display", style: { width: gamescreen.right + 14 + "px" } }), t = ["score", "coins", "world", "time", "lives"]; for (var n in body.appendChild(e), data.display = e, t) e.appendChild(data[t[n]].element), updateDataElement(data[t[n]]); body.appendChild(data.display), is_mobile && applyNewJs() } function clearDataDisplay() { body.removeChild(data_display) } function toggleLuigi() { window.luigi = !window.luigi, localStorage.luigi = window.luigi, window.player.title = window.luigi ? "Luigi" : "Mario", setThingSprite(window.player) } function startDataTime() { TimeHandler.addEventInterval(updateDataTime, 25, 1 / 0, data.time) } function updateDataTime(e) { 1 != e.dir && (100 == e.amount ? playCurrentThemeHurry() : e.amount <= 0 && killPlayer(player, !0)), notime || (map.time = e.amount += e.dir, updateDataElement(e)) } function updateDataElement(e) { var t = e.name + "
" + ("Infinity" == e.amount ? "Inf" : e.amount); e.element.innerHTML = t, e.element.style.width = "" } function score(e, t, n) { if (!(t <= 0)) { if (1 == arguments.length) return score(player, e); if (localStorage.highscore = max(localStorage.highscore, data.score.amount += t), n) { var x = addText(t, e.left, e.top); x.yvel = -unitsized4, TimeHandler.addEvent(killScore, 49, x) } for (; data.score > 1e4;) gainLife(), data.score.amount = data.score.amount % 1e4; updateDataElement(data.score) } } function killScore(e) { body.contains(e) && body.removeChild(e), killNormal(e), deleteThing(e, texts, texts.indexOf(e)) } function findScore(e) { return e < data.scorelevs.length ? data.scorelevs[e] : (gainLife(), -1) } function gainLife(e, t) { data.lives.amount += "number" == typeof e ? e : 1, t || AudioPlayer.play("Gain Life"), updateDataElement(data.lives) } function setLives(e) { data.lives.amount = Number(e), updateDataElement(data.lives) } function storePlayerStats() { data.playerpower = player.power } function clearPlayerStats() { data.playerpower = player.power = 1 } function loadEditor(e) { editorClose(), e || (window.canedit = !0, setMap(["Special", "Blank"]), window.canedit = !1), setEditorLibrary(), setEditorHTML(), setEditorControls(), setEditorTriggers(), setEditorLocalRetrieval(), classAdd(body, "editor"), classAdd(editor.sidebar, "expanded"), TimeHandler.addEvent(classRemove, 35, editor.sidebar, "expanded"), map.shifting = !1, window.editing = !0 } function setEditorLibrary() { window.editor = { xloc: 0, yloc: 0, playing: !1, canplace: !0, offset: { x: unitsizet2 }, settings: { night: !1, setting: "Overworld", alt: !1 }, defaults: { width: 8, height: 8, widthoff: 0, heightoff: 0, minimum: 1, followerUpdate: editorFollowerUpdateStandard, prefunc: pushPreThing, outerok: !0 }, placed: [], characters: { Goomba: {}, Koopa: { height: 12, arguments: { smart: Boolean, movement: ["moveSimple", "moveJumping", "moveFloating"] }, followerUpdate: function(e, t) { var n = "True" == t.smart, x = t.movement, r = "moveJumping" == x; return "moveFloating" == x && (r = [8, 72]), [n, r] }, onadds: { nocollide: !1 } }, Beetle: { width: 8.5, height: 8.5 }, HammerBro: { height: 12 }, CheepCheep: { arguments: { smart: Boolean }, attributes: { nofall: !0 } }, Lakitu: { height: 12 }, Podoboo: { width: 7 }, Blooper: { height: 12, onadds: { nofall: !0 } }, Bowser: { width: 16, height: 16 } }, solids: { Floor: { arguments: { width: 8 }, mydefaults: { width: 8 }, prefunc_custom: function(e, t, n, x) { var r = "Floor, " + e.xloc + ", " + e.yloc; return x[1] && (r += ", " + x[1]), r } }, Brick: { arguments: { contents: ["false", "Coins", "Star"] }, followerUpdate: function(e, t) { var n = []; t.contents; return n.push(window[t.contents]), n }, prefunc_custom: function(e, t, n, x) { var r = "Brick, "; return r += e.xloc + ", " + e.yloc, t.contents && (r += ", " + t.contents[0].name), r } }, Block: { arguments: { contents: ["Coin", "Mushroom", "Star", "1Up Mushroom"], hidden: Boolean }, followerUpdate: function(e, t) { var n = []; return "1Up Mushroom" == t.contents ? n.push([Mushroom, 1]) : n.push(window[t.contents]), "True" == t.hidden && (TimeHandler.addEvent((function() { editor.follower.hidden = !0 })), n.push(1)), n }, prefunc_custom: function(e, t, n, x) { var r = "Block, ", i = t.contents, a = i[0].name; return r += e.xloc + ", " + e.yloc, "Coin" != a ? ("Mushroom" == a && i[1] ? r += ", [Mushroom, " + String(i[1]) + "]" : r += ", " + a, t.hidden && (r += ", true")) : t.hidden && (r += ", false, true"), r } }, Cannon: { arguments: { height: 8 }, sprite_source: "top" }, Pipe: { width: 16, prefunc: pushPrePipe, prefunc_solo: !0, arguments: { height: 8, Pirhana: Boolean }, followerUpdate: function(e, t) { var n = []; return n.push(Number(t.height)), n.push(Boolean(t.Pirhana)), n }, sprite_source: "top" }, Stone: { arguments: { width: 8, height: 8 }, prefunc_custom: function(e, t, n, x) { var r = "Stone, " + e.xloc + ", " + e.yloc; return r += ", " + x[1] + ", " + x[2] } }, Coral: { arguments: { height: 8 } }, CastleBlock: { arguments: { fireballs: 2, direction: ["CW", "CCW"], hidden: Boolean }, followerUpdate: function(e, t) { return [ [Number(t.fireballs), "CW" == t.direction], "True" == t.hidden ] } }, Springboard: { height: 14.5, heightoff: 1.5 } }, scenery: { Bush1: { width: 16 }, Bush2: { width: 24 }, Bush3: { width: 32 }, Cloud1: { width: 16, height: 12 }, Cloud2: { width: 24, height: 12 }, Cloud3: { width: 32, height: 12 }, HillSmall: { width: 24, height: 9.5, heightoff: -1.5 }, HillLarge: { width: 40, height: 17.5, heightoff: -1.5 }, PlantSmall: { width: 7, height: 15, heightoff: 1 }, PlantLarge: { height: 23, heightoff: 1 }, Fence: {}, Water: { width: 4, height: 4, prefunc: fillPreWater, prefunc_solo: !0, prefunc_custom: function(e, t, n, x) { return e.xloc + ", " + e.yloc } } } }; var e, t, n, x; editor.defaults; for (n in editor) for (x in e = editor[n], editor[n]) t = e[x], proliferate(t, editor.defaults, !0); for (n in e = editor.scenery) t = e[n], proliferate(t, { createfunc: function(e) { return ThingCreate(Sprite, e.spritename) }, spritename: n, prefunc_custom: function(e, t, n, x) { return "'" + n.spritename + "', " + e.xloc + ", " + (e.yloc - n.height) } }, !0), t.prefunc == pushPreThing && (t.prefunc = pushPreScenery) } function setEditorHTML() { createEditorGuideLines(), createEditorSidebar(), createEditorBottomBar(), createEditorScrollers(), editor.sectionselect.onchange() } function createEditorSidebar() { var e, t = ["Solids", "Characters", "Scenery", "Settings"], n = editor.sidebar = createElement("div", { id: "sidebar" }), x = editor.category = createElement("div", { id: "category", className: "group first" }), r = editor.sectionselect = createElement("select", { id: "sectionselect", className: "options big", onchange: editorSelectSection }), i = editor.options = createElement("div", { id: "options", className: "options big" }); for (e in n.appendChild(x), x.appendChild(r), t) r.appendChild(createElement("option", { innerText: t[e] })); n.appendChild(i), body.appendChild(window.sidebar = n) } function createEditorBottomBar() { var e = editor.bottombar = createElement("div", { id: "bottombar", things: {} }); sidebar.appendChild(e) } function createEditorScrollers() { var e, t, n, x = ["right", "left"], r = {}; for (t = createElement("div", { id: "scrollers", style: { zIndex: 7, width: innerWidth - 32 + "px" } }), settings = { className: "scroller", style: { zIndex: 7, marginTop: innerHeight / 2 + "px" }, onmouseover: editorFollowerHide, onmouseout: editorFollowerShow, onmousedown: editorScrollingStart, onmouseup: editorScrollingStop }, e = x.length - 1; e >= 0; --e) x[e], n = r[x[e]] = createElement("div", settings), t.appendChild(n); proliferate(r.left, { id: "left", className: "scroller flipped off", dx: -7 }), proliferate(r.right, { id: "right", style: { right: "21px" }, dx: 7 }), editor.scrollers = r, body.appendChild(t) } function editorFollowerHide() { var e = editor.follower; e.hiddenOld = e.hidden, e.hidden = !0 } function editorFollowerShow() { var e = editor.follower; e.hidden = e.hiddenOld } function editorScrollingStart(e) { var t = e.target.dx; editorPreventClicks(), editor.scrolling = TimeHandler.addEventInterval(editorScrolling, 1, 1 / 0, -t), classRemove(editor.scrollers.left, "off") } function editorScrollingStop() { TimeHandler.addEvent(editorClickOff, 3), TimeHandler.clearEvent(editor.scrolling) } function editorScrolling(e) { if (scrollEditor(e), editor.xloc >= 0) return scrollEditor(-editor.xloc), editorScrollingStop(), classAdd(editor.scrollers.left, "off"), !0 } function createEditorGuideLines() { var e, t, n, x = { floor: 0, ceiling: ceillev, jumplev1: jumplev1, jumplev2: jumplev2 }, r = 16 * unitsize + "px", i = map.floor; for (e in window.maplines = t = document.createElement("div"), t.style.marginLeft = r, t.id = "maplines", x) n = createElement("div", { innerText: e, className: "mapline", id: e + "_line", style: { marginTop: (i - x[e]) * unitsize + "px", marginLeft: "-" + r, paddingLeft: r } }), t.appendChild(n); body.appendChild(t) } function setEditorControls(e) { e = e || ["load", "save", "reset", "undo"]; var t, n, x, r = document.getElementById("controls"), i = createElement("div", { id: "controls" }), a = editor.controls = { container: i }; for (x in r && (r.innerHTML = ""), e) t = e[x], n = createElement("div", { id: t, alt: t, className: "control", style: { backgroundImage: "url(Theme/" + t + ".gif)" }, innerHTML: "
" + t + "
", onclick: editorClickControl }), i.appendChild(n), a[t] = n; sidebar.appendChild(i) } function setEditorTriggers() { var e, t = [maplines, canvas]; for (e = t.length - 1; e >= 0; --e) t[e].onclick = editorMouseClick; document.onmousemove = editorFollowerFollowsCursor } function editorMouseClick(e) { if (window.editing && !editor.clicking) { if (editorPreventClicks(), editor.erasing) return editorPlaceEraser(e); if (!editor.in_settings && editor.canplace) { var t = editor.section_name, n = (window[t], editor.current_selected, editor.follower); editor.placed.push(n), editor.follower = !1, editorSetCurrentThingFromName(null, !0), paused && refillCanvas(), n.was_follower = !0, delete n.onclick, editor.playing && (thingRetrieveVelocity(n), proliferate(n, n.reference.attributes)) } } } function editorSelectSection() { var e = (this || editor.sectionselect).value.toLowerCase(); (editor.in_settings = "settings" == e) ? (editorSetSection(e, !0), editorSetSectionSettings()) : editorSetSection(e) } function editorSetSection(e, t) { var n, x, r = editor.section = editor[e], i = editor.bottombar, a = 0; if (editor.section_name = e, i.innerHTML = "", !t) for (e in r) ++a, x = editorAddBottomPreview(i, e, r[e]), n || (n = x); a ? (i.style.visibility = "visible", editorSetCurrentThingFromCanvas(n)) : i.style.visibility = "hidden" } function editorAddBottomPreview(e, t, n) { var x, r = n.width, i = n.height, a = window[t], o = a ? ThingCreate(a, n.previewargs) : new Thing(Sprite, t), l = createElement("div", { width: r * unitsize + "px", height: i * unitsize + "px", name: t, className: "holder " + t, onclick: editorSetCurrentThing }), s = proliferate(getCanvas(r * unitsizet2, i * unitsizet2), { name: t, reference: n, style: { marginLeft: -roundDigit(r / 2, scale) + "px" }, onclick: editorSetCurrentThing }), d = (e.things, r * unitsizet2), u = i * unitsizet2, p = s.getContext("2d"); return canvasDisableSmoothing(s), editor.bottombar.things[t] = s.thing = o, addClass(o, "editor"), x = o.canvas, o.canvases && (x = o.canvases[n.sprite_source || "middle"].canvas), n.previewsize ? (p.fillStyle = p.createPattern(x, "repeat"), p.fillRect(0, 0, d, u)) : p.drawImage(x, 0, 0, d, u), l.appendChild(l.canvas = s), e.appendChild(l), e[t] = l, s } function editorSetSectionSettings() { var e, t = editor.settings, n = ""; n += "

Settings

", n += addArgumentOption("night", Boolean, t.night), n += addArgumentOption("setting", ["Overworld", "Underworld", "Underwater", "Castle", "Sky"], t.setting), n += addArgumentOption("alt", Boolean, t.alt), n += "
", options.innerHTML = n, ensureOptionsAboveZero(editorUpdateSettingsOption), e = editor.sidebar.getElementsByTagName("table")[0].rows, editor.settings.night_elem = e[0].cells[1].firstChild, editor.settings.setting_elem = e[1].cells[1].firstChild, editor.settings.alt_elem = e[2].cells[1].firstChild, editor.follower && killNormal(editor.follower), editor.follower = !1 } function editorUpdateSettingsOption(e) { var t = editor.settings, n = t.night = "True" == t.night_elem.value, x = t.alt = "True" == t.alt_elem.value, r = (t.setting = t.setting_elem.value) + (n ? " Night" : "") + (x ? " " + x : ""); setAreaSetting(area, r, r != area.setting) } function editorSetCurrentThing(e, t) { var n = e.target, x = editor.current_thing_name = n.name, r = editor.current_thing = editor.section[x]; t || updateCurrentArguments(x, r), editorUpdateFollower() } function editorSetCurrentThingFromCanvas(e, t) { editorSetCurrentThing({ target: e }, t) } function editorSetCurrentThingFromName(e, t) { editorSetCurrentThing({ target: { name: e || editor.current_thing_name } }, t) } function updateCurrentArguments(e, t) { t = t || {}; var n, x = editor.options, r = "", i = t.mydefaults || {}, a = t.arguments || {}; for (n in r += "

" + e + "

", a.width || (r += addStaticOption("width", t.width)), a.height || (r += addStaticOption("height", t.height)), a) r += addArgumentOption(n.replace("_", "-"), a[n], null, i); r += "
", x.innerHTML = r, ensureOptionsAboveZero() } function addStaticOption(e, t) { return t == 1 / 0 && (t = "Inf."), "" + e + ": " + t + "" } function addArgumentOption(e, t, n, x) { x = x || {}; var r = "" + e + ": "; switch (t) { case 1 / 0: r += "Inf"; break; case Boolean: r += ""; break; case Number: r += ""; break; default: switch (typeof t) { case "number": r += "" + t + "x"; break; case "string": r += ""; break; case "object": for (i in r += "" } } return r + "" } function ensureOptionsAboveZero(e) { e = e || editorUpdateFollower; var t, n = editor.options.getElementsByTagName("input"); for (i = n.length - 1; i >= 0; --i)(t = n[i]).onchange = t.onclick = t.onkeypress = editorInputEnsureAboveZero; for (n = options.getElementsByTagName("select"), i = n.length - 1; i >= 0; --i)(t = n[i]).onchange = t.onclick = t.onkeypress = editorUpdateFollower } function editorInputEnsureAboveZero(e) { editorUpdateFollower(e) } function editorUpdateFollower(e) { if (editor.in_settings) return editorUpdateSettingsOption(e); var t, n = editor.current_thing; (t = editor.follower) && (t.id = "", killNormal(t)), t = n.createfunc ? n.createfunc(editor.current_thing, editorGetArguments()) : ThingCreate(window[editor.current_thing_name], n.followerUpdate(editor.current_thing, editorGetArguments())), editor.follower = t, proliferate(t, { id: "follower", libtype: editor.section_name, lookleft: !0, nocollide: !0, reference: n, onclick: editorMouseClick }, !0), addThing(t), addClass(t, "editor"), thingRetrieveVelocity(t), thingStoreVelocity(t), editorSetFollowerPosition(t), editor.erasing && (t.hidden = !0) } function editorGetArguments() { var e = arrayMake(editor.options.getElementsByTagName("input")), t = arrayMake(editor.options.getElementsByTagName("select")), n = e.concat(t); return pairs = generateInputNameValuePairs(n), pairs } function generateInputNameValuePairs(e) { var t, n = {}; for (t in e) n[e[t].name] = e[t].value; return n } function editorFollowerFollowsCursor(e) { var t = editor.follower; t && editorSetFollowerPosition(t, roundFollowerDigit(e.x) + (editor.current_thing.widthoff - editor.offset.x) * unitsize, roundFollowerDigit(e.y) + editor.current_thing.heightoff * unitsize) } function editorSetFollowerPosition(e, t, n) { t = t || editor.xloc_old || 0, n = n || editor.yloc_old || 0, setLeft(e, t), setTop(e, n), editor.xloc_old = t, editor.yloc_old = n } function roundFollowerDigit(e) { var t = "solids" == editor.section_name ? 8 : 4; return unitsize * t * round(e / (unitsize * t)) } function roundFollowerPosition(e, t) { editorSetFollowerPosition(e, roundFollowerDigit(e.left), roundFollowerDigit(e.top)) } function editorFollowerUpdateStandard(e, t) { "True" == t.hidden && TimeHandler.addEvent((function() { editor.follower.hidden = !0 })); var n = []; return t.width && n.push(Number(t.width)), t.height && n.push(Number(t.height)), n } function editorClickControl(e) { editorPreventClicks(); var t = e.target; t.id || (t = t.parentNode), window["editorControl" + capitalizeFirst(t.id)](), e.preventDefault() } function editorPreventClicks() { editor.clicking = !0, TimeHandler.addEvent(editorClickOff, 3) } function editorClickOff() { window.editor && (editor.clicking = !1) } function editorControlUndo() { var e = editor.placed.pop(); e && !e.player && killNormal(e) } function editorControlReset() { var e = editor.placed.length, t = roundDigit(35 / e, 21); TimeHandler.addEventInterval(editorControlUndo, t, e) } function editorControlSave() { var e = editor.rawfunc = editorGetRawFunc(); editorCreateInputWindow("Hit Submit below to start playing!

This map will be resumed automatically the next time you use the editor on this computer.
Alternately, you may copy this text to work on again later using Load (the button next to Save).

", e, editorSubmitGameFuncPlay); return e } function editorControlCancel() { loadEditor() } function editorGetRawFunc() { var e, t = editor.placed, n = t.length - 1, x = new Array(e), r = " var map = arguments[0] || new Map();\n"; for (r += "\n map.time = " + data.time.amount + ";", r += "\n map.locs = [ new Location(0, true) ];", r += "\n map.areas = [", r += "\n new Area('" + area.setting + "', function() {", r += "\n setLocationGeneration(0);\n\n", e = n; e >= 0; --e) x[e] = new editorPreStatement(t[e]); for (x.sort(prethingsorter), e = n; e >= 0; --e) x[e] = " " + x[e].statement; return r += (x = removeDuplicates(x)).join("\n"), r += "\n })", r += "\n ];", r += "\n return map;" } function editorPreStatement(e) { this.placer = e, this.xloc = (gamescreen.left + e.left) / unitsize, this.yloc = map.floor - e.top / unitsize, this.statement = editorGetStatement(this, e, e.reference, e.args) } function editorGetStatement(e, t, n, x) { if (!n && !(n = editor[t.libtype][t.title])) return ""; var r, i, a = (n.prefunc || pushPreThing).name, o = x.length; if (n.prefunc_custom) a += "(" + n.prefunc_custom(e, t, n, x) + ");"; else { r = [], n.prefunc_solo || r.push(t.title), r.push(String(e.xloc)), r.push(String(e.yloc)); for (var l = 1; l < o; ++l) { switch (typeof(i = x[l])) { case "undefined": break; case "number": i = String(round(i)); break; default: i = String(i) } void 0 !== i && r.push(i) } a += "(" + r.join(", ") + ");" } return a } function editorControlErase() { editor.erasing ? editorControlEraseOff() : editorControlEraseOn() } function editorControlEraseOn() { editor.erasing = editor.follower.hidden = !0, classAdd(body, "erasing"), classAdd(editor.controls.erase, "enabled") } function editorControlEraseOff() { editor.erasing = editor.follower.hidden = !1, classRemove(body, "erasing"), classRemove(editor.controls.erase, "enabled") } function editorPlaceEraser(e) { addThing(Eraser, e.x, e.y) } function Eraser(e) { e.width = e.height = 2, e.nocollide = e.nofall = !0, e.movement = eraserErases, setCharacter(e, "eraser") } function eraserErases(e) { if (window.editor) { var t, n, x = editor.placed, r = x.concat(solids).concat(characters).concat(scenery); for (n = r.length - 1; n >= 0; --n) if (!(t = r[n]).player && t != editor.follower && objectsTouch(e, t)) { killNormal(t), x.splice(x.indexOf(t), 1); break } killNormal(e) } } function editorControlLoad() { editorCreateInputWindow("Paste your work in progress here, and click Submit to continue it.", "", editorSubmitLoad) } function addThingsToPlaced() { var e = editor.placed; for (editor.placed = (editor.placed || []).concat(characters).concat(solids).concat(scenery), e.sort(prethingsorter), e.splice(e.indexOf(player), 1), i = e.length - 1; i >= 0; --i) placer = e[i], placer.reference = editor[placer.libtype][placer.title] } function editorCreateInputWindow(e, t, n) { var x = gamescreen.unitwidth, r = editor.input_window = createElement("div", { id: "input_window", innerHTML: e || "", style: { width: x + "px" } }), i = r.input = editor.window_input = createElement("textarea", { id: "window_input", value: t || "", style: { width: x - 49 + "px" } }), a = r.submit = createElement("div", { id: "window_submit", className: "window_button", innerText: "Submit", onclick: n }), o = r.cancel = createElement("div", { id: "window_cancel", className: "window_button", innerText: "Cancel", onclick: editorCloseInputWindow }); return r.appendChild(i), r.appendChild(a), r.appendChild(o), body.appendChild(r), killNormal(editor.follower = !1), editor.follower = !1, r } function editorCloseInputWindow(e) { editorPreventClicks(), removeChildSafe(window.input_window, body), e || (editorSetCurrentThingFromName(), window.editing = !0), editorUpdateFollower() } function editorClose(e) { if (window.editor) { classRemove(body, "editor"), classRemove(body, "erasing"), killNormal(editor.follower), editor.follower = !1, delete window.editor; var t, n = ["maplines", "sidebar", "bottombar", "scrollers"]; for (t in n) removeChildSafe(document.getElementById(n[t]), body); document.onmousemove = null, window.editing = !1, e && window.map && (map.shifting = !1) } } function scrollEditor(e, t) { window.editor && (editor.follower && (e = e || 0, t = t || 0, shiftAll(scenery, e, t), shiftAll(solids, e, t), shiftAll(characters, e, t), editor.xloc += e, editor.yloc += t)) } function editorStoreLocally() { localStorage.editorLastFunc = editor.rawfunc } function setEditorLocalRetrieval() { localStorage.editorLastFunc && (editor.rawfunc = round, editorSubmitGameFunc()) } function editorSubmitGameFunc() { if (!window.editor || !editor.rawfunc) return loadEditor(); editor.rawfunc; var e = window.custommapfunc = new Function(editor.rawfunc); mapfuncs.Custom = { Map: e }, window.canedit = !0, setMap(["Custom", "Map"]), window.canedit = editor.playing = !1, entryBlank(player), addThingsToPlaced(), editorStoreLocally(), editorCloseInputWindow() } function editorSubmitGameFuncPlay() { editorPreventClicks(), editorSubmitGameFunc(), editorStartPlaying() } function editorSubmitLoad() { if (window.editor && editor.window_input) { editorPreventClicks(); var e = editor.window_input.value; loadEditor(), editor.rawfunc = e, editorSubmitGameFunc() } } function editorStartPlaying() { editorPreventClicks(), editor.playing = !0, placePlayer(), entryPlain(player), nokeys = !1; var e, t, n, x = editor.placed; for (n in x) thingRetrieveVelocity(e = x[n]), (t = editor[e.libtype][e.title]) && proliferate(e, t.onadds); setEditorControls(["Cancel"]) } function setEditorLocalRetrieval() { var e = localStorage.editorLastFunc; if (e) { editor.rawfunc = e, editorSubmitGameFunc(), editorStoreLocally(); var t, n = editor.placed; for (t in n) thingStoreVelocity(n[t]) } } function resetSeed() { window.seeder = 1777771 / (window.seed = round(1e7 * random())), window.seedlast = .007, window.getSeed = function() { return seedlast = "0." + String(seeder / seedlast).substring(4).replace(".", "") } } function pushRandomSectionOverworld(e) { var t = max(randTrue(117), 1), n = 0; if (++map.num_random_sections, pushPreFuncCollider(e, zoneDisableCheeps), map.had_floor = !1, map.needs_floor || t >= 14 || t < 3 || randTrue() ? (pushPreFloor(e, 0, t), map.had_floor = !0) : pushPreThing(Stone, e, n = 0, t), window.randcount_powerup = 3, t <= 3 && map.had_floor) { if (randTrue()) switch (randTrue(3)) { case 0: if (t > 3) { pushPreScenery("HillSmall", e, 0); break } case 1: if (t > 2) { pushPreScenery("Bush1", e + 8 * max(0, randTrue(t - 2)), n); break } case 2: pushPreScenery("PlantLarge", e + 8 * max(0, randTrue(t - 2)), n); break; case 3: pushPreScenery("PlantSmall", e + 8 * max(0, randTrue(t - 2)), n) } } else for (var x = t - 2, r = 0, i = 0, a = randTrue(2); a < x; a += 3) randTrue(7) && (randTrue(2) ? (map.hadObstacle = !1, (i % 3 == 0 || randTrue()) && (pushRandomChunkEnemy(e, a), ++i), map.had_floor && pushRandomGroundScenery(e + 8 * a, a, t)) : pushRandomObstacle(e, a), !r && randTrue() ? (pushRandomSkyScenery(e + 8 * a), r = !0) : r = !1); prepareNextGeneratorStandard(e, t, pushRandomSectionOverworld) } function startRandomSectionBridge(e) { pushPreFuncCollider(e - 24, zoneDisableCheeps), pushPreFuncCollider(e, zoneEnableCheeps); var t = 5 + randTrue(4), n = t - 4; map.needs_bridge = !0, map.treelev = map.treeheight = 0, pushPreTree(e, 0, t + 1), pushPreThing(Stone, e + 16, 8, 1, 1), pushPreThing(Stone, e + 24, 16, 1, 2), pushPreThing(Stone, e + 32, 24, n, 3), pushRandomSectionBridge(e + 8 * (t - 1), 24, !0), spawnMap(), map.had_floor = !1 } function pushRandomSectionBridge(e, t, n) { var x = !1; if (t = t || 24 + 16 * randTrue() - 8, randTrue() || map.needs_bridge) switch (randTrue(3)) { case 0: switch (randTrue()) { case 0: var r = randTrue(3) + 1, i = 4 * r; x = !0; for (var a = 1; a <= 2 * r; a += 2) pushPreBridge(e + 16 * a, t, 3); break; case 1: i = randTrue(7) + 7; var o = DtB(t, 8); n || pushPreThing(Stone, e, t, 1, o), pushPreBridge(e + 8, t, i - 1), pushPreThing(Stone, e + 8 * i, t, 1, o) } break; default: map.needs_bridge = map.treeheight = 0; o = DtB(t, 8); i = 17 * (randTrue(3) + 3); for (a = 0; a < i; a += 17) if (!a && n || pushPreThing(Stone, e + 8 * a, t, 1, o), pushPreBridge(e + 8 * (a + 1), t, 16), randTrue() && pushRandomSmallEnemy(e + 8 * (a + 8), t), randTrue(2)) { randTrue(); var l = 3 + randTrue(2); pushRandomCoinRow(e + 8 * (a + 8), t + 32, l), pushRandomCoinRow(e + 8 * (a + 8), t + 40, getNextCoinRowSize(l)) } else pushPreThing(Block, e + 8 * (a + 8), t + jumplev1, Mushroom); pushPreThing(Stone, e + 8 * i, t, 1, o) } else i = 10, pushPreTree(e + 16, 8 * randTrue(), i); prepareNextGeneratorStandard(e, i + 2, randTrue() ? pushRandomSectionBridge : pushRandomSectionOverworld, !1, x) } function pushRandomSectionPreCastle(e, t) { var n, x, r = randTrue(35) + 35, i = r - 3, a = !1; for (t = t || 0, pushPreFloor(e, 0, r), hadcloud = !1, x = randTrue(3); x < i; x += n || 3) { switch (randTrue(3)) { case 0: switch (n = 3, randTrue(2)) { case 0: var o = randTrue(2) + 1; pushPreThing(Cannon, e + 8 * (x + randTrue(2)), 8 * o, o); break; case 1: for (var l = 0; l < n; ++l) randTrue() || pushPreThing(Stone, e + 8 * (x + l), 8 * (o = randTrue(3) + 1), 1, o); break; case 2: pushPrePipe(e + 8 * (x + randTrue()), 0, 8 * (2 + randTrue(2)), !0) } break; case 1: switch (n = 7, a = !0, randTrue(2)) { case 0: pushPreThing(Koopa, e + 8 * (x + randTrue(7)), 12 + 8 * randTrue(3), randTrue(), !0); break; case 1: randTrue() && pushPreThing(HammerBro, e + 8 * (x + randTrue(7)), 12 + 2 * randTrue(3)); break; case 2: n = 10, a = !1; for (l = 1; l < 8; ++l) for (var s = jumplev1; s <= jumplev2; s += 32) pushPreThing(Brick, e + 8 * (x + l), s, getRandomBrickItem(!1, randTrue())); var d = randTrue() ? jumplev1 : jumplev2; height2 = o == jumplev1 ? jumplev2 : jumplev1, randTrue(2) && pushPreThing(HammerBro, e + 8 * (x + randTrue(3)), d + 12), randTrue(2) && pushPreThing(HammerBro, e + 8 * (x + 4 + randTrue(3)), height2 + 12) } } a && n >= 7 && (pushPreScenery("CastleWall", e + 8 * (x + randTrue()), 0, n - randTrue(2)), randTrue() && pushPreThing(Brick, e + 8 * (x + randTrue(n)), jumplev1, randTrue() ? Mushroom : getRandomBrickItem(!1, randTrue()))); for (s = 0; s < n; s += 3) randTrue(2) && pushRandomGroundScenery(e + 8 * (x + s), 0), !hadcloud && randTrue() ? (pushRandomSkyScenery(e + 8 * (x + s)), hadcloud = !0) : hadcloud = !1 } pushPreFloor(e + 8 * r, 0, x + 3 - r); var u = 4 + randTrue(3); t >= 3 ? endCastleOutsideRandom(e + 8 * (r + u + 1), !0) : pushRandomSectionPreCastle(e + 8 * (r + u), t + 1), spawnMap() } function endCastleOutsideRandom(e) { var t, n; switch (randTrue()) { case 0: for (n = 1 + randTrue(); n < 9; n += 2) pushPreThing(Stone, e + 8 * n, 8 * (n - randTrue()), 1, 1 + randTrue()); pushPreThing(Stone, e + 72, 64, 2), t = 12; break; case 1: for (pushPreFloor(e, 0, 11), n = 1, hadlast = !1; n < 9; ++n) !hadlast || randTrue(2) || 8 == n ? (pushPreThing(Stone, e + 8 * n, 8 * n, 1, n), hadlast = !0) : (hadlast = !1, pushPrePipe(e + 8 * n, 0, 8 * max(n - randTrue(2), 2), !0), ++n); pushPreThing(Stone, e + 72, 72, 2, 9), t = 7 } pushPreFloor(e + 88, 0, round(gamescreen.width / 8)), endCastleOutside(e + 8 * (9 + t) + 4, 0, !0, round(gamescreen.width / 8)) } function startRandomSectionCastle(e) { e += 32; var t = randTrue(7) + 3, n = randTrue(4) + 3; randTrue(4); pushPreFloor(e, 24, t), pushPreThing(Stone, e, 88, t, 3), fillPreWater(e + 8 * t, 0, 2 * n), pushPreThing(Podoboo, e + 8 * t + max(0, 8 * randTrue(n - 3)), -32), pushRandomSectionCastle(e + 8 * (t + n), 0), spawnMap() } function pushRandomSectionCastle(e, t) { var n, x; switch (randTrue(3)) { case 0: x = 64 * (n = 1 + randTrue(2)) - 8; for (var r = 0; r < n; ++r) randTrue() ? (makeCeilingCastle(e + 64 * r, 8), fillPreWater(e + 64 * r, 0, 16), pushPreThing(Platform, e + 64 * r + 8 + 8 * randTrue(2), 8 + 8 * randTrue(max(r + 2, 4)), 4, moveFalling)) : (pushPreFloor(e + 64 * r - 8, 8, 1), pushPrePlatformGenerator(e + 64 * r + 24, 4, 1.75), pushPreFloor(e + 64 * r + 64, 8, 1)); break; case 1: var i, a, o; x = 64 * (n = 2 * (1 + randTrue())) - 8, makeCeilingCastle(e, 8 * n), fillPreWater(e, 0, 16 * n); for (r = 0; r < n; ++r) { switch (i = e + 64 * r, a = 8 * randTrue(max(r + 1, 2 + randTrue(2))), o = 2 + randTrue(3), randTrue(2)) { case 0: pushPreFloor(i + 8 * randTrue(3), a, o); break; case 1: pushPreThing(Stone, i + 8 * randTrue(3), a, o); break; case 2: pushPreThing(Platform, i += 8 + 8 * randTrue(), 8 * randTrue(3), 4, [moveSliding, i, i + 56 + 8 * randTrue(2), 2]) } randTrue(2) || o % 2 != 1 || pushPreThing(Block, i + 4 * o - 8, a + 40, Mushroom), o <= 4 && pushPreThing(Podoboo, i + 8 * (o + 1), -32) } break; case 2: var l; switch (x = 8 * (n = 14 + randTrue(21)) - 8, p = 1, pushPreFloor(e, 0, n), randTrue()) { case 0: makeCeilingCastle(e, n, p = 3); for (r = 1 + randTrue(); r < n - 6; ++r) l = min(7, n - r), pushPreThing(Stone, e + 8 * r, jumplev1, l), randTrue() && pushPreThing(CastleBlock, e + 8 * (r + l - 4), 0, [6, randTrue()], !0), pushPreThing(CastleBlock, e + 8 * (r + l), jumplev1, 6, randTrue()), randTrue() && pushPreThing(CastleBlock, e + 8 * (r + l + 4), jumplev2 + 8, [6, randTrue()], !0), r += l; break; case 1: makeCeilingCastle(e, n, p); var s = randTrue(), d = randTrue(); pushPreThing(Stone, e, 8 * s, n, s); for (r = randTrue(2); r < n - 3; r += 4) pushPreThing(Stone, e + 8 * (r + d), 16 + 8 * s, 3, 2), pushPreThing(CastleBlock, e + 8 * (r + d + 1), 24 + 8 * s, randTrue(2) ? 6 : 0, randSign()), pushPreThing(Stone, e + 8 * (r + d), 80, 3, 2), r < n - 5 && pushPreThing(CastleBlock, e + 8 * (r + d + 1), 64, randTrue(2) ? 6 : 0, randSign()), r += 1 + randTrue(3) } break; case 3: x = 8 * (n = 21 + randTrue(21)) - 8; var u = 1 + randTrue(3), p = 11 - u - 4; pushPreFloor(e, 8 * u, n), makeCeilingCastle(e, n, p); for (r = 0; r < n; r += 8) randTrue() && (pushRandomEnemy(e + 8 * r, 8 * u, 0), randTrue() && (pushRandomEnemy(e + 8 * r + 12, 8 * u, 0), randTrue() && pushRandomEnemy(e + 8 * r + 24, 8 * u, 0))) } pushPreThing(GenerationStarter, e + x, ceilmax + 20, t <= 280 ? pushRandomSectionCastle : endCastleInsideRandom, t + x / 8), spawnMap() } function endCastleInsideRandom(e) { var t = 2 + randTrue(2), n = 8 * randTrue(), x = n + 24 + 8 * randTrue(); pushPreFloor(e, n, 5 * t); for (var r = 0; r < t; ++r) pushPreFloor(e + 5 * (r + 1) * 8, x, max(2, randTrue(3))); var i = e + 5 * t * 8, a = 8 * randTrue(7); fillPreWater(i, 0, a), endCastleInsideRandomFinal(i + a), spawnMap() } function endCastleInsideRandomFinal(e) { fillPreWater(e, 0, 16), pushPreFloor(e + 24, 24, 3), endCastleInside(e + 48, 2), randTrue() && pushPreThing(Podoboo, e + 72 + 8 * randTrue(3), -32), randTrue() && fillPreThing(Brick, e + 56 + 8 * randTrue(3), 64, 3 + randTrue(3), 1, 8), randTrue() && pushPreThing(CastleBlock, e + 56 + 8 * randTrue(2), 24, [6, randSign()], !0), spawnMap() } function placeRandomCastleNPC(e) { pushPreThing(Toad, e + 194, 12).object.text = [pushPreText({ innerHTML: "THANK YOU " + window.player.title.toUpperCase() + "!" }, e + 160, 66).object, pushPreText({ innerHTML: "LOL YOU THOUGHT THERE WOULD BE SOMETHING HERE DIDN'T YOU!" }, e + 148, 50).object] } function pushRandomCoinRow(e, t, n) { if (n) { var x; if (3 == n && (e += 8), randTrue(2)) switch (n) { case 3: x = [1, 0, 1]; break; case 4: switch (randTrue()) { case 0: x = [1, 0, 0, 1]; break; case 1: x = [0, 1, 1, 0] } break; case 5: switch (randTrue()) { case 0: x = [1, 0, 1, 0, 1]; break; case 1: x = [0, 1, 0, 1, 0] } } else x = arrayOf(!0, n); for (var r = 0; r < n; ++r) x[r] && pushPreThing(Coin, e + 8 * r, t) } } function getNextCoinRowSize(e) { switch (e) { case 3: return 5; case 5: return 3; default: return e } } function pushRandomSectionTrees(e) { var t, n, x; switch (randTrue(7)) { case 0: var r, i; t = randTrue(14) + 7, n = randTrue(3), map.treefunc(e, 8 * n, t); for (var a = randTrue(2); a < t - 2; a += r - 1) randTrue(2) && pushRandomSmallEnemy(e + 8 * a, 8 * n), randTrue(2) && (r = 3 + (randTrue(3) ? 0 : randTrue(4)), i = 8 * min(9, n + randTrue(7) + 3), map.treefunc(e + 8 * a, i, r), randTrue() && pushRandomSmallEnemy(e + 8 * a, 8 * i), pushRandomSmallEnemy(e + 8 * (a += r - 1), 8 * n)); break; case 1: t = 14, n = 7, randTrue(), t = 4 + randTrue(2), pushPrePlatformGenerator(e + 8 * (randTrue() + 1), t, -1), t += randTrue(3) + 3; break; default: t = 4 + randSign() + randTrue(), n = min(randTrue(2) + 4 + randSign(2), map.treelev + 4); var o = e - 8 * randTrue(); if (n == map.treelev && (n += randSign()), map.treefunc(o, 8 * n, t), t > 3 || randTrue()) if (randTrue(3)) pushRandomSmallEnemy(o + 8 * (randTrue() + 1), 8 * n); else if (randTrue(2)) for (a = 1; a < t - 1; ++a) pushPreThing(Coin, o + 1 + 8 * a, 8 * (n + 1) - 1) }++map.sincechange > 7 && randTrue() ? (x = map.randtype, map.sincechange = 0) : x = pushRandomSectionTrees, pushPreThing(GenerationStarter, e + 8 * (t + randSign()), ceilmax + 20, x), spawnMap(), map.treelev = n } function pushRandomSmallEnemy(e, t, n) { switch (randTrue(7)) { case 1: case 2: case 3: pushPreThing(Koopa, e, t + 12, !0, n); break; case 7: pushPreThing(Beetle, e, t + 8.5); break; default: pushPreThing(Goomba, e, t + 8) } } function pushRandomSectionUnderworld(e) { var t, n, x = max(randTrue(117), 1), r = 14, i = x - x % r; floor(x / r); if (pushPreFloor(e, 0, x), window.randcount_powerup = 3, x < r) switch (randTrue()) { case 0: for (t = 0; t < x - 2; t += 3) pushRandomChunkEnemy(e + 8 * t, 0, t); break; case 1: for (t = 0; t < x - 2; t += 3) randTrue(2) ? t % 3 == 0 && pushRandomChunkEnemy(e, t) : pushRandomObstacle(e, t) } else for (t = 1; t < i; t += r) switch (randTrue(5)) { case 0: pushRandomUnderworldSquigglies(e + 8 * t, r), makeCeiling(e + 8 * t, r); break; case 1: var a = 1 + randTrue(), o = 4 + randTrue(7); for (t += a, n = 0; n < r; n += 1 + randTrue() / 2) randTrue() && pushRandomSmallEnemy(e + 8 * (t + n), 0); fillPreThing(Brick, e + 8 * t, 8 * o, 13, 12 - o, 8, 8), t -= a; break; case 2: createTunnel(e + 8 * (t + 2), 10, Brick); break; case 3: pushUnderworldPipes(e + 8 * (t + 2), 12), makeCeiling(e + 8 * (t + 1), r); break; case 4: pushUnderworldStones(e + 8 * (t + 2), 12), makeCeiling(e + 8 * (t + 1), r); break; case 5: for (n = 0; n < 10; n += 3) pushRandomChunkEnemy(e + 8 * (t + n), n); break; case 6: for (n = 0; n < x - 2; n += 3) randTrue(2) ? (t % 3 == 0 || randTrue()) && (pushRandomChunkEnemy(e + 8 * (t + n), n), ++numenemychunks) : pushRandomObstacle(e + 8 * (t + n), n) } prepareNextGeneratorStandard(e, x, pushRandomSectionUnderworld, !0), spawnMap() } function pushRandomUnderworldSquigglies(e, t, n, x) { n = n || 1 / 0; for (var r = 3 + randTrue(2), i = min(n, r + 1 + randTrue(4)), a = 1 == r ? i : randTrue(2) ? r : i, o = 1 + i - r, l = !1, s = i + 16, d = 0; d < t; ++d) { if (randTrue()) { for (var u = 0; u < 3; ++u) pushPreThing(Brick, e + 8 * (d + u), 8 * a, randTrue() ? null : getRandomBrickItem()); !x && randTrue(2) && fillPreThing(Coin, e + 1 + 8 * d, 8 * min(s, a + randTrue(4) + 1) - 1, 3 + randTrue(), 1, 8), l || (randTrue() ? pushPreThing(Block, e + 8 * (d + 3), 8 * a, getRandomBlockItem()) : pushPreThing(Brick, e + 8 * (d + 3), 8 * a), l = !0), d += 3 } else fillPreThing(Brick, e + 8 * d, 8 * r, 1, o, 8, 8), a = a == i ? r : i, l = !1; (d % 3 == 1 || randTrue() && d < t - 3) && pushRandomSmallEnemy(e + 8 * d, 0, !1) } } function pushUnderworldPipes(e, t) { var n, x, r, i = t - 4, a = !1; for (r = 0; r < i; r += 4) switch (randTrue()) { case 0: addPipeRandom(e + 8 * (r + (n = randTrue())), 0, 8 * (2 + randTrue(2))), r += 1 - n, a = !0; break; case 1: n = randTrue() || !a, x = 4 + randTrue(4), n && pushPreThing(Brick, e + 8 * r, 8 * max(x - 4, 3 + randTrue()), getRandomBrickItem(!1)), addPipeRandom(e + 8 * (r + n), 0, 8 * x), a = !1 } for (; r < t - 1; ++r) randTrue() && pushRandomChunkEnemy(e + 8 * r, 0) } function pushUnderworldStones(e, t) { var n, x, r, i = t - 4, a = !1; for (r = 0; r < i; r += 2) switch (randTrue()) { case 0: pushPreThing(Stone, e + 8 * (r + (n = randTrue())), 8 * (x = 2 + randTrue(2)), 1, x), r += 1 - n, a = !0; break; case 1: n = randTrue() || !a, x = 4 + randTrue(4), n && pushPreThing(Brick, e + 8 * r, 8 * max(x - 4, 3 + randTrue()), getRandomBrickItem(!1)), pushPreThing(Stone, e + 8 * (r + n), 8 * x, 1, x), a = !1 } for (; r < t - 1; r += 3) randTrue() && pushRandomChunkEnemy(e + 8 * r, 0) } function pushRandomSectionUnderwater(e) { var t = max(randTrue(117), 7); pushPreFloor(e, 0, t -= t % 3), pushPreScenery("Water", e, ceilmax - 21, 8 * t / 3, 1), pushPreThing(WaterBlock, e, ceilmax, 8 * t), window.randcount_powerup = 3; for (var n = 0; n < t; n += 4) { switch (randTrue(21)) { case 0: if (n < t - 2) { pushRandomObstacle(e, n); break } case 1: pushRandomEnemy(e, 0, n, !0); break; default: switch (randTrue(7)) { case 0: var x = randTrue() + 2, r = randTrue() + 2; pushPreThing(Stone, e + 8 * n, 8 * r, randTrue(3) + 1, r), pushPreThing(Stone, e + 8 * n, ceillev, randTrue(3) + 1, x); break; case 1: randTrue() && pushPreThing(Stone, e + 8 * n, jumplev1, 4), randTrue() && pushPreThing(Stone, e + 8 * n, jumplev2, 4); break; case 2: fillPreThing(Coin, e + 8 * (n + randTrue()) + 1, 8 * (randTrue(8) + 1) - 1, 3, 1, 8); break; default: if (map.had_coral) { map.had_coral = !1; break } map.had_coral = !0; var i, a = randTrue(3) + 2, o = jumplev1 * (1 + randTrue(2)), l = e + 8 * n; if (o == 3 * jumplev1) { var s = !0; o -= 8 } pushPreThing(Stone, e + 8 * n, o, a), i = !s && (randTrue(3) || a <= 3) ? o + 24 : o - 8, randTrue() && pushPreThing(Coral, l, i, 3), randTrue() && a > 3 && o < 64 && pushPreThing(Coral, l + 8 * (a - 1), i, 3), a >= 3 && (n += a - 3) } } map.countCheep > 1 && (pushPreThing(CheepCheep, e + 8 * n, randTrue(80) + 8, randTrue()), map.countCheep = 0), map.countBlooper > 7 && (pushPreThing(Blooper, e + 8 * n, randTrue(80) + 8), map.countBlooper = 0), randTrue(7) && ++map.countCheep, randTrue(3) && ++map.countBlooper } if (++map.sincechange < 3) { var d = prepareNextGeneratorStandard(e, t, pushRandomSectionUnderwater, !1, !0); pushPreScenery("Water", e + 8 * t, ceilmax - 21, 8 * (d + 1) / 3, 1), pushPreThing(WaterBlock, e + 8 * t, ceilmax, 8 * (d + 1)) } else endRandomSectionUnderwater(e + 8 * t) } function endRandomSectionUnderwater(e) { pushPreFloor(e, 0, 19), pushPreScenery("Water", e, ceilmax - 21, 28, 1), pushPreThing(WaterBlock, e, ceilmax, 157.5), pushPreThing(Stone, e, 8, 5, 1), pushPreThing(Stone, e + 8, 16, 4, 1), pushPreThing(Stone, e + 16, 24, 3, 1), pushPreThing(Stone, e + 24, 32, 2, 1), pushPreThing(Stone, e + 24, 88, 2, 4), pushPreThing(PipeSide, e + 32, 48, ["Random", randTrue() ? "Overworld" : "Underworld", "Up"]), pushPreThing(Stone, e + 40, 88, 14, 11), map.scrollblockerok = !0, pushPreThing(ScrollBlocker, e + 56, 80, !0), spawnMap() } function startRandomSectionSky(e) { pushPreThing(Stone, e, 0, 78), pushPreThing(Platform, e + 88, 24, 6, [collideTransport]), pushRandomSectionSky(e + 80, 1), spawnMap() } function pushRandomSectionSky(e, t) { if (t++ > 7) return fillPreThing(Coin, e + 8, 8, 3, 1, 8), spawnMap(); var n = 0; if (t % 2) fillPreThing(Coin, e + 1, 71, 3, 1, 8), n = 32; else switch (randTrue(t)) { case 3: pushPreThing(Stone, e + 8, 48, 1, 2), fillPreThing(Coin, e + 25, 63, 7, 1, 8), pushPreThing(Stone, e + 88, 48, 1, 2), n = 104; break; case 4: case 5: case 6: pushPreThing(Stone, e + 8, 56, 2); for (var x = 0; x <= 7; x += 2) pushPreThing(Stone, e + 8 * (x + 5), 56), fillPreThing(Coin, e + 8 * (x + 5) + 1, 63, 2, 1, 8); n = 104; break; default: fillPreThing(Coin, e + 1, 55 + 8 * randTrue(), 16, 1, 8), n = 128 } pushPreThing(GenerationStarter, e + n, ceilmax + 20, pushRandomSectionSky, t), spawnMap() } function prepareNextGeneratorStandard(e, t, n, x, r) { var i = 0, a = 0; if (r) i = 1; else switch (randTrue(7)) { case 0: t > 7 && map.underwater && !randTrue(7) ? (i = randTrue(3) + 7, pushPreThing(Springboard, e + 8 * (t - 1), 14.5)) : a = !0; break; case 1: var o = max(1, randTrue(7)); i = o + randTrue(3), pushPreFloor(e + 8 * t, 0, o); for (var l = 1; l <= o; ++l) pushPreThing(Stone, e + 8 * (t + l - 1), 8 * l, 1, l); if (randTrue()) { pushPreFloor(e + 8 * (t + i + (o = max(1, randTrue(o))) - 1), 0, o); for (var s = 0; s < o; ++s) pushPreThing(Stone, e + 8 * (t + i + o + s - 1), 8 * (o - s), 1, o - s); i += o + o - 2 } break; default: x && randTrue() ? pushPrePlatformGenerator(e + 8 * (t + 1.5), 2 * ((i = randTrue(1) + 4) - 2), randSign()) : a = !0 } return (a || !i || i < 1) && (i = randTrue(3) + 1), n == pushRandomSectionOverworld && map.num_random_sections >= 3 + randTrue(7) && (n = pushRandomSectionPreCastle), !r && ++map.sincechange > 3 && (n = getRandomNextSection(), map.sincechange = 0, pushPreFuncCollider(e, zoneDisableCheeps)), pushPreThing(GenerationStarter, e + 8 * (t + i), ceilmax + 20, n), spawnMap(), i } function getRandomNextSection() { switch (randTrue()) { case 0: return map.treeheight = 0, pushRandomSectionTrees; case 1: return startRandomSectionBridge } } function pushRandomChunkEnemy(e, t, n) { pushRandomEnemy(e, 0, t, n), randTrue(2) && (pushRandomSolidRow(e + 8 * t, jumplev1, randTrue(2) + 1), randTrue() && pushRandomEnemy(e, jumplev1, t + 1, !0), randTrue() && (pushRandomSolidRow(e + 8 * t, jumplev2, randTrue(2) + 1), randTrue() && pushRandomEnemy(e, jumplev2, t + 1, !0))) } function pushRandomEnemy(e, t, n, x) { switch (randTrue(14)) { case 0: case 1: fillPreThing(Beetle, e + 8 * n, t + 8.5, randTrue(2), 1, 12); break; case 3: if (!x) { switch (randTrue(4)) { case 0: pushPreThing(HammerBro, e + 8 * n, t + 12), randTrue() && pushPreThing(HammerBro, e + 8 * n + 16, t + 40); break; case 1: if ("Underworld" != map.randname) { pushPreThing(Lakitu, e + 8 * n, t + 80, !0); break } case 2: pushPreThing(Blooper, e + 8 * n, t + 40) } break } break; default: if (!randTrue(3)) return; switch (randTrue(3)) { case 1: fillPreThing(Koopa, e + 8 * n, t + 12, randTrue(2), 1, 12, 0, randTrue() || map.onlysmartkoopas, randTrue()); break; default: fillPreThing(Goomba, e + 8 * n, t + 8, randTrue(2), 1, 12) } } } function addPipeRandom(e, t, n) { var x; x = !(n <= 24 || randTrue(2)) && getRandomTransport(), pushPrePipe(e, t, n, randTrue(7), x) } function getRandomTransport() { var e, t = [ ["Overworld", "Up"], ["Underworld", "Down"], ["Underwater", "Up"] ]; return t[e = randTrue(t.length - 1)][0] == map.randname && (e = (e + randTrue(t.length - 2) + 1) % t.length), ["Random", t[e][0], t[e][1]] } function getAfterSkyTransport() { switch (randTrue(3)) { case 0: return ["Random", "Underworld", "Down"]; default: return ["Random", "Overworld" + (body.className.indexOf(!0) ? " Night" : ""), "Down"] } } function pushRandomObstacle(e, t) { var n = randTrue(3); switch (n > 1 && (map.hadPipe = !1), n) { case 0: case 1: if (t > 1) { addPipeRandom(e + 8 * t, 0, 8 * (randTrue(2 + (1 == map.hadObstacle && 0 == map.hadPipe && t > 7)) + 2)), map.hadObstacle = map.hadPipe = !0; break } case 2: for (var x = 0; x < 2; ++x) randTrue() || t < 1 || pushPreThing(Stone, e + 8 * (t + x), 8 * (r = randTrue(2) + 2), 1, r); break; default: x = randTrue(2); switch (randTrue(7)) { case 0: var r; if (pushPreThing(Cannon, e + 8 * (t + x), 8 * (r = randTrue(2) + 1), r), 1 == r && randTrue(2) && 2 != x) { var i = randTrue() + 2; pushPreThing(Cannon, e + 8 * (t + x), 8 * r + 8 * i, i) } map.hadObstacle = !0; break; case 1: if (!map.underwater) { randTrue() && (!map.underwater && randTrue(2) && pushPreThing(Brick, e + 8 * t, jumplev1), pushPreThing(Block, e + 8 * (t + 1), jumplev1, [Mushroom, 1], !0), !map.underwater && randTrue(2) && pushPreThing(Brick, e + 8 * (t + 2), jumplev1), map.hadObstacle = !0); break } case 2: if (!map.underwater) { var a = randTrue(); a || pushPreThing(Brick, e + 8 * t, jumplev1, getRandomBrickItem()), pushPreThing(Stone, e + 8 * (t + a), jumplev1, 2), addPipeRandom(e + 8 * (t + a), jumplev1, 24 + 8 * randTrue()), a && pushPreThing(Brick, e + 8 * t, jumplev1, getRandomBrickItem()); break } } } } function pushRandomSolidRow(e, t, n) { for (var x = 0; x < n; ++x) randTrue(2) ? pushPreThing(Brick, e + 8 * x, t, getRandomBrickItem("Overworld" == map.randname && t == jumplev2)) : pushPreThing(Block, e + 8 * x, t, getRandomBlockItem()) } function getRandomBrickItem(e, t) { return e && !randTrue(14) ? [Vine, ["Random", "Sky", "Vine"]] : !(!t && randTrue(7)) && (randTrue(3) ? Coin : Star) } function getRandomBlockItem() { return ++randcount_powerup, !(randcount_powerup <= 7) && (!randTrue(7) && Mushroom) } function pushRandomGroundScenery(e, t, n) { switch (randTrue(7)) { case 2: if (n - t > 4) { pushPreScenery("Bush3", e, 0); break } case 1: if (n - t > 2) { pushPreScenery("Bush2", e, 0); break } case 0: pushPreScenery("Bush1", e, 0); break; case 3: if (n - t > 4) { pushPreScenery("HillLarge", e, 0); break } case 4: pushPreScenery("HillSmall", e, 0); break; case 5: pushPreScenery("PlantLarge", e, 0); break; case 6: pushPreScenery("PlantSmall", e, 0); break; case 7: pushPreScenery("Fence", e, 0, randTrue(2) + 1) } } function pushRandomSkyScenery(e) { switch (randTrue(2)) { case 0: pushPreScenery("Cloud1", e, 8 * (randTrue(5) + 5)); break; case 1: pushPreScenery("Cloud2", e, 8 * (randTrue(4) + 6)); break; case 2: pushPreScenery("Cloud3", e, 8 * (randTrue(3) + 7)) } } function addDistanceCounter() { counter = createElement("div", { className: "indisplay counter randomdisplay", innerText: data.traveledold + " blocks traveled" }), body.appendChild(counter), TimeHandler.addEventInterval((function(e) { data.traveled = max(0, Math.round((player.right + gamescreen.left) / unitsizet8) - 3), e.innerText = data.traveledold + data.traveled + " blocks traveled" }), 3, 1 / 0, counter) } function addSeedDisplay() {} function createTunnel(e, t, n) { for (var x = randTrue(2) + 3, r = randTrue(2) + 2, i = !1, a = 0; a < t; ++a) fillPreThing(n, e + 8 * a, 8, 1, r, 8, 8), randTrue(3) || i ? i = !1 : pushRandomSmallEnemy(e + 8 * a, 8 * r), fillPreThing(n, e + 8 * a, 96 - 8 * x, 1, x, 8, 8) } function removeRandomDisplays() { var e, t = body.getElementsByClassName("randomdisplay"); for (e = t.length - 1; e >= 0; --e) body.removeChild(t[e]) } function resetLibrary() { window.palette = [ [0, 0, 0, 0], [255, 255, 255, 255], [0, 0, 0, 255], [188, 188, 188, 255], [116, 116, 116, 255], [252, 216, 168, 255], [252, 152, 56, 255], [252, 116, 180, 255], [216, 40, 0, 255], [200, 76, 12, 255], [136, 112, 0, 255], [124, 7, 0, 255], [168, 250, 188, 255], [128, 208, 16, 255], [0, 168, 0, 255], [24, 60, 92, 255], [0, 128, 136, 255], [32, 56, 236, 255], [156, 252, 240, 255], [60, 188, 252, 255], [92, 148, 252, 255], [0, 130, 0, 255] ], window.digitsize = getDigitSize(palette), window.filters = { Underworld: ["palette", { "05": "18", "09": "16" }], Castle: ["palette", { "02": "04", "05": "01", "09": "03" }], Alt: ["palette", { 11: "01" }], Alt2: ["palette", { "02": "04", "05": "01", "09": "03", 13: "01", 19: "08" }], star: { one: ["palette", {}], two: ["palette", { "06": "02", "08": "05", 10: "09" }], three: ["palette", { "06": "01", "08": "06", 10: "08" }], four: ["palette", { "06": "01", "08": "06", 10: "14" }] }, smart: ["palette", { 14: "08" }] }, window.library = { rawsprites: { characters: { Eraser: "p[7,7,7,7]x06,3333x011,x36,x09,x38,x07,x310,x05,311x36,11300033321333312333003332x16,23330333321233212x38,22233222x320,03333x26,3333x05,x28,x06,11x28,x05,x15,x25,110000x16,222111x05,x15,001110000", Beetle: { normal: { normal: "p[0,2,5,8]x022,1111x010,x18,x07,x110,x05,x17,33111000x18,32311000x19,3311003333x111,001133x110,001113x110,011213x110,011113x110,011113x110,0011233x15,x35,00222331133322200222203333002222", two: "p[0,2,5,8]x07,111x010,x18,x07,x110,x05,x17,33111000x18,32311000x19,3311003333x111,001133x110,001113x110,011213x110,011113x110,011113x110,0011233x15,x35,00022331133322x05,22233330222x06,22x05,22000" }, Underworld: { normal: "p[0,15,16,18]x022,1111x010,x18,x07,x110,x05,x17,22111000x18,23211000x19,2211002222x111,001122x110,001112x110,011312x110,011112x110,011112x110,0011322x15,x25,00333221122233300333302222003333", two: "p[0,15,16,18]x07,111x010,x18,x07,x110,x05,x17,22111000x18,23211000x19,2211002222x111,001122x110,001112x110,011312x110,011112x110,011112x110,0011322x15,x25,00033221122233x05,33322220333x06,33x05,33000" }, Castle: { normal: "p[0,1,3,4]x022,3333x010,x38,x07,x310,x05,x37,22333000x38,21233000x39,2233002222x311,003322x310,003332x310,033132x310,033332x310,033332x310,0033122x35,x25,00111223322211100111102222001111", two: "p[0,1,3,4]x07,333x010,x38,x07,x310,x05,x37,22333000x38,21233000x39,2233002222x311,003322x310,003332x310,033132x310,033332x310,033332x310,0033122x35,x25,00011223322211x05,11122220111x06,11x05,11000" } }, BeetleShell: { normal: "p[0,2,5,8]x06,1111x010,x18,x07,1111331111x05,1111322311110000x15,33x15,0000x112,000x114,00x114,00x114,00x114,00x114,00x114,00x114,0x35,x16,x35,000033311333x010,3333x06,", Underworld: "p[0,15,16,18]x06,1111x010,x18,x07,1111221111x05,1111233211110000x15,22x15,0000x112,000x114,00x114,00x114,00x114,00x114,00x114,00x114,0x25,x16,x25,000022211222x010,2222x06,", Castle: "p[0,1,3,4]x06,3333x010,x38,x07,3333223333x05,3333211233330000x35,22x35,0000x312,000x314,00x314,00x314,00x314,00x314,00x314,0x25,x36,x25,000022233222x010,2222x06," }, Blooper: { normal: { normal: "p[0,2,5,9]x06,2332x011,232232x09,23222232x07,2232222322x05,223x26,3220002223x26,322202223x28,32220003x28,3x06,x210,x06,2x18,2x06,1221111221x06,2112112112x06,2112112112x05,212211112212000022332222332200003x210,30000220x26,022000032032002302300002202200220220000320320023023x05,2022002202x06,2032002302x06,2002002002x09,2002x06,", squeeze: "p[0,2,5,9]x06,2332x011,232232x09,23222232x07,2232222322x05,223x26,3220002223x26,322202223x28,32220003x28,3x06,2x18,200003x25,11x25,30x216,32223x26,322232222022002202222032203200230223000222020020222x05,2202002022000" }, Underwater: { normal: "p[0,1,2,3]x06,1331x011,131131x09,13111131x07,1131111311x05,113x16,3110001113x16,311101113x18,31110003x18,3x06,x110,x06,1x28,1x06,2112222112x06,1221221221x06,1221221221x05,121122221121000011331111331100003x110,30000110x16,011000031031001301300001101100110110000310310013013x05,1011001101x06,1031001301x06,1001001001x09,1001x06,", squeeze: "p[0,1,2,3]x06,1331x011,131131x09,13111131x07,1131111311x05,113x16,3110001113x16,311101113x18,31110003x18,3x06,1x28,100003x15,22x15,30x116,31113x16,311131111011001101111031103100130113000111010010111x05,1101001011000" } }, Bowser: { normal: { normal: "p[0,1,6,14]x012,111x025,331112x025,3331122x023,113333223x019,200311x37,x018,2023311x38,x017,2221113332x35,x017,222213332223333x017,122233221323333113331x012,1022223332333311331123x010,10113133123333113111223111x09,10003223331113312233112x013,12233111x39,2231x011,2233111x313,1x09,122233111x36,111x35,x010,220033x16,33112333111x015,33222113322333112x011,222001022211x37,22x010,2210222012231x39,1x09,220022220033133311133321x08,210x26,1331133112333x010,200x25,333311333223311x010,10x25,333311x37,111x011,12220x35,1333311322x017,x35,1133323323x018,x35,111x36,x019,x35,11113333x019,2x36,x17,x017,1122332222x15,x016,111x210,11x021,1122112222x021,1112111x25,0", two: "p[0,1,6,14]x012,111x025,331112x025,3331122x023,113333223x019,200311x37,x018,2023311x38,x017,2221113332x35,x017,222213332223333x017,122233221323333113331x012,1022223332333311331123x010,10113133123333113111223111x09,10003223331113312233112x013,12233111x39,2231x011,2233111x313,1x09,122233111x36,111x35,x010,220033x16,33112333111x015,33222113322333112x011,222001022211x37,22x010,2210222012231x39,1x09,220022220033133311133321x08,210x26,1331133112333x010,200x25,333311333223311x010,10x25,333311x37,111x011,12220x35,1333311322x017,x35,1133323323x018,x35,11x37,x019,x35,11113333x020,x36,x17,x019,22332222x15,x018,2222112211211x018,112211121112222x016,111x27,x06," }, firing: { normal: "p[0,1,6,14]x012,111x025,331112x025,3331122x023,113333223x019,200311x37,x018,2023311x38,x017,2221113332x35,x017,222213332223333x017,112233221323333113331x012,1022223322333311331123x010,101030322x35,113111223111x06,x29,33331113312233112x07,x27,3333111x39,2231x07,x38,111x313,1x010,x35,111x36,111x35,x014,33x16,33112333111x015,33222113322333112x011,222001022211x37,22x010,2210222012231x39,1x09,220022220033133311133321x08,210x26,1331133112333x010,200x25,333311333223311x010,10x25,333311x37,111x011,12220x35,1333311322x017,x35,1133323323x018,x35,111x36,x019,x35,11113333x019,2x36,x17,x017,1122332222x15,x016,111x210,11x021,1122112222x021,1112111x25,0", two: "p[0,1,6,14]x012,111x025,331112x025,3331122x023,113333223x019,200311x37,x018,2023311x38,x017,2221113332x35,x017,222213332223333x017,112233221323333113331x012,1022223322333311331123x010,101030322x35,113111223111x06,x29,33331113312233112x07,x27,3333111x39,2231x07,x38,111x313,1x010,x35,111x36,111x35,x014,33x16,33112333111x015,33222113322333112x011,222001022211x37,22x010,2210222012231x39,1x09,220022220033133311133321x08,210x26,1331133112333x010,200x25,333311333223311x010,10x25,333311x37,111x011,12220x35,1333311322x017,x35,1133323323x018,x35,11x37,x019,x35,11113333x020,x36,x17,x019,22332222x15,x018,2222112211211x018,112211121112222x016,111x27,x06," } }, BowserFire: "p[0,1,6,8]x010,x36,003x010,x316,x06,x35,22332222332222x315,x25,111133x05,3333x213,13000x313,2223333x05,x39,0x36,x09,3300333033003x06,", BrickShard: { normal: "p[0,2,9]0021200002221200212121202212221222212221022212220021212000022200", Underworld: ["filter", ["characters", "BrickShard", "Overworld"], filters.Underworld], Castle: ["filter", ["characters", "BrickShard", "Overworld"], filters.Castle] }, BulletBill: "p[0,2,5,8]110x17,x06,2201x25,1110000113x16,2111000112x19,2100113x19,22101131133x15,2121113132212111121111313x26,x17,3111x25,x17,31111222x15,0113x111,00113x110,000110x19,0000110x17,x06,", Bubble: "p[0,1]0110100110010110", CastleFireBall: ["same", ["characters", "FireBall"]], CheepCheep: { normal: { normal: "p[0,1,3,6]0003333x013,x35,011x07,x26,11110000121122221111000x16,222111100012121122x15,0001212112211110000x16,221112x05,1211x27,0000333x210,0000233x29,00300233x28,3330023311x26,333033331112222333000x18,20333x05,x15,0000300", two: "p[0,1,3,6]0003333x013,x35,x010,x26,3x07,1211x25,x06,x16,x25,111001212112222x15,0121211222x16,0x16,22x16,0001211222x16,00333x210,0300233x29,33000233x28,3300023311x26,300033331112222330000x18,203x07,x15,x07," }, red: { normal: "p[0,1,6,8]0002222x013,x25,x010,x36,2x07,1311x35,x06,x16,x35,111001313113333x15,0131311333x16,0x16,33x16,0001311333x16,00222x310,0200322x39,22000322x38,2200032211x36,200022221113333220000x18,302x07,x15,x07,", two: "p[0,1,6,8]0002222x013,x25,011x07,x36,11110000131133331111000x16,333111100013131133x15,0001313113311110000x16,331113x05,1311x37,0000222x310,0000322x39,00200322x38,2220032211x36,222022221113333222000x18,30222x05,x15,0000200" } }, Coin: { normal: { normal: { normal: "p[0,2,6,8]00222211000x26,11002233221102232212211223221221122322122112232212211223221221122322122112232212211223221221102211221100x26,1100022221100", two: "p[0,2,8]00222211000x26,1100x26,110x25,12211x25,12211x25,12211x25,12211x25,12211x25,12211x25,12211x25,1221102211221100x26,1100022221100", three: "p[0,2,9,11]00333311000x36,11003322331103323313311332331331133233133113323313311332331331133233133113323313311332331331103311331100x36,1100033331100" }, Underworld: { normal: "p[0,6,9,16]00111133000x16,33001122113301121131133112113113311211311331121131133112113113311211311331121131133112113113301133113300x16,3300011113300", two: "p[0,9,16]00111122000x16,2200x16,220x15,21122x15,21122x15,21122x15,21122x15,21122x15,21122x15,21122x15,2112201122112200x16,2200011112200", three: "p[0,9,11,16]00222233000x26,33002211223302212232233221223223322122322332212232233221223223322122322332212232233221223223302233223300x26,3300022223300" } }, anim: { normal: "p[0,1,7]000012x08,12x07,1112x06,1112x06,1112x06,1112x06,1112x06,1112x06,1112x06,1112x06,1112x06,1112x07,12x08,120000", anim2: "p[0,1,6,7]000022x07,2222x05,x26,000022132200022122322002212232200221223220022122322002212232200221223220002213220000x26,x05,2222x07,220000", anim3: "p[0,1,6,7]000023x08,23x07,2333x06,2333x06,2333x06,2333x06,1333x06,1333x06,2333x06,2333x06,2333x06,2333x07,23x08,230000", anim4: "p[0,1,6]x05,2x09,2x09,2x09,2x09,2x09,2x09,1x09,1x09,2x09,2x09,2x09,2x09,2x09,20000" } }, FireBall: { normal: "p[0,1,6,8]0303330000303330300032330033322303322123032212330332233000333300", two: "p[0,1,6,8]x05,3000333000333233030322230033212x36,2122330332233000333300", three: "p[0,1,6,8]0033330003322330332122303212233032233300332300030333030000333030", four: "p[0,1,6,8]0033330003322330332212x36,2123300322230303323330003330003x05," }, FireFlower: { normal: { normal: "p[0,1,6,8,14]0000x18,x06,x112,000111x28,111011222x36,2221111222x36,222110111x28,111000x112,x06,x18,x011,44x07,444000044000044404440004400044400444400440044440004444044044440000444404404444x05,x410,x09,4444x06,", two: "p[0,2,5,9,14]0000x28,x06,x212,000222x38,222022333x16,3332222333x16,333220222x38,222000x212,x06,x28,x011,44x07,444000044000044404440004400044400444400440044440004444044044440000444404404444x05,x410,x09,4444x06,", three: "p[0,6,8,10,14]0000x18,x06,x112,000111x38,111011333x26,3331111333x26,333110111x38,111000x112,x06,x18,x011,44x07,444000044000044404440004400044400444400440044440004444044044440000444404404444x05,x410,x09,4444x06,", four: "p[0,1,6,14]0000x18,x06,x112,000111x28,111011222x36,2221111222x36,222110111x28,111000x112,x06,x18,x011,33x07,333000033000033303330003300033300333300330033330003333033033330000333303303333x05,x310,x09,3333x06," }, Underworld: { normal: "p[0,1,6,8,16]0000x18,x06,x112,000111x28,111011222x36,2221111222x36,222110111x28,111000x112,x06,x18,x011,44x07,444000044000044404440004400044400444400440044440004444044044440000444404404444x05,x410,x09,4444x06,", two: "p[0,15,16,18]0000x38,x06,x312,000333x28,333033222x16,2223333222x16,222330333x28,333000x312,x06,x38,x011,22x07,222000022000022202220002200022200222200220022220002222022022220000222202202222x05,x210,x09,2222x06,", three: "p[0,6,8,10,16]0000x18,x06,x112,000111x38,111011333x26,3331111333x26,333110111x38,111000x112,x06,x18,x011,44x07,444000044000044404440004400044400444400440044440004444044044440000444404404444x05,x410,x09,4444x06,", four: "p[0,5,9,16]0000x18,x06,x112,000111x28,111011222x36,2221111222x36,222110111x28,111000x112,x06,x18,x011,33x07,333000033000033303330003300033300333300330033330003333033033330000333303303333x05,x310,x09,3333x06," } }, Firework: ["same", ["solids", "Firework"]], Goomba: { normal: "p[0,2,5,9]x06,3333x011,x36,x09,x38,x07,x310,x05,311x36,11300033321333312333003332x16,23330333321233212x38,22233222x320,03333x26,3333x05,x28,x06,11x28,x05,x15,x25,110000x16,222111x05,x15,001110000", Underworld: "p[0,15,16,18]x06,2222x011,x26,x09,x28,x07,x210,x05,211x26,11200022231222213222002223x16,32220222231322313x28,33322333x220,02222x36,2222x05,x38,x06,11x38,x05,x15,x35,110000x16,333111x05,x15,001110000", Castle: ["filter", ["characters", "Goomba", "Overworld"], filters.Castle] }, Hammer: { normal: "p[0,2,5,8]x08,2x014,12101x010,111101x09,1122232x09,1211131x08,x16,31x08,10011131x09,x15,01x012,2x015,2x015,2x015,2x015,2x015,2x015,2x015,2x07,", two: "p[0,2,5,8]x073,11x013,10111x011,101211x010,11112110x28,11112122x08,1111211x010,3333x011,1111211x065,", three: "p[0,2,5,8]x07,2x015,2x015,2x015,2x015,2x015,2x015,2x015,2x012,10x15,x09,13111001x08,13x16,x08,1311121x09,2322211x09,101111x010,10121x014,2x08,", four: "p[0,2,5,8]x065,1121111x011,3333x010,1121111x08,22121111x28,01121111x010,112101x011,11101x013,11x073," }, HammerBro: { normal: { normal: "p[0,1,6,14]003333x011,31x35,x08,31113313x09,31133313x08,311x35,x07,221221233x07,x25,122133x05,x25,12113333x06,21231x36,00022210311133313x06,3322113231x06,3222212331x06,x25,1323130000x25,1133233000x25,1133332200x25,313333233x06,33123323330000223311223333000022233111133x05,222x35,11110000222233x26,x05,222033x25,x06,2200002222x013,222", two: "p[0,1,6,14]003333x011,31x35,x08,31113313x09,31133313x08,311x35,x07,221221233x07,x25,122133x05,x25,1211333300002221231x36,x06,10311133313x06,3322113231x06,3222212331x06,3x25,32313x05,33x25,3233x05,33312222322x06,3313333233x06,3312333233x06,3311223333x07,33111133x08,x35,1111x07,23322233x08,x27,x010,x25,x012,2222000" }, throwing: { normal: "p[0,1,6,14]00003333x011,333313x09,3113331x010,31133332x07,231133322x06,x25,12322x06,x25,12222x06,x25,1122233x05,2221x25,333x07,1322223313x06,3322223231x06,33x25,331x06,33322132313x05,33311133233x05,3331x35,22x06,3313333233x06,33123323330000223311223333000022233111133x05,222x35,11110000222233x26,x05,222033x25,x06,2200002222x013,222", two: "p[0,1,6,14]00003333x011,333313x09,3113331x010,31133332x07,231133322x06,x25,12322x06,x25,12222x06,x25,1122233x05,2221x25,333x07,1322223313x06,3322223231x06,33x25,331x06,33322132313x05,33311133233x05,3331x35,22x06,3313333233x06,3312333233x06,3311223333x07,33111133x08,x35,1111x07,23322233x08,x27,x010,x25,x012,2222000" }, thrown: { normal: "p[0,1,6,14]003333x011,31x35,x08,31113313x09,31133313x08,311x35,x07,221221233x07,x25,122133x05,x25,12113333x06,21231x36,00022210311133313x06,3322113231x06,3222212331x06,x25,1323130000x25,1133233000x25,1133332200x25,313333233x06,33123323330000223311223333000022233111133x05,222x35,11110000222233x26,x05,222033x25,x06,2200002222x013,222", two: "p[0,1,6,14]003333x011,31x35,x08,31113313x09,31133313x08,311x35,x07,221221233x07,x25,122133x05,x25,12113333x06,21231x36,00022210311133313x06,3322113231x06,3222212331x06,x25,1323130000x25,1133233000x25,113333220022223313333233x06,3312333233x06,3311223333x07,33111133x08,x35,1111x07,23322233x08,x27,x010,x25,x012,2222000" } }, Koopa: { normal: { normal: { flying: { normal: "p[0,1,6,14]x019,1x09,11000111x07,1111001112x05,x15,0231122000x15,0023112200112110002311220012111100211122011211110222122201211110023x25,012111010x26,0012x15,022202203312111002200220331113330220221333232333002022133233323200002212x36,23000221132x35,2300002132323332320000212333232333x05,1x35,23333x05,113332323111000221112331110000x25,x15,22200x25,x06,2222", two: "p[0,1,6,14]00001x014,111x012,2111x012,23112x010,223112x010,223112x010,2211120011100002322122011211000x27,0121111002220022012x15,022000213x17,x05,22133x17,00022133331131110222213332323311002221232333232000021132x35,2300002132323332320000212333232333x05,1x35,23333x05,113332323111000021112331112x05,222x15,222x06,2220000222x07,2220022200" }, normal: { normal: { normal: "p[0,1,6,14]x019,1x014,111x013,1112x011,231122x010,231122x010,231122x010,211122x09,2221222x09,23x25,x09,x26,00x35,0002220220323332300220022033232333022022133332311300202213332323130000221232333232000221132x35,2300002132323332320000212333232333x05,1x35,23333x05,113332323111000221112331110000x25,x15,22200x25,x06,2222", two: "p[0,1,6,14]00001x014,111x012,2111x012,23112x010,223112x010,223112x010,221112x09,2322122x09,x27,x09,22200220x35,00022000213233323x06,2213323233x05,22133332311300222213332323130002221232333232000021132x35,2300002132323332320000212333232333x05,1x35,23333x05,113332323111000021112331112x05,222x15,222x06,2220000222x07,2220022200" }, Underworld: { normal: "p[0,5,9,16]x019,1x014,111x013,1112x011,231122x010,231122x010,231122x010,211122x09,2221222x09,23x25,x09,x26,00x35,0002220220323332300220022033232333022022133332311300202213332323130000221232333232000221132x35,2300002132323332320000212333232333x05,1x35,23333x05,113332323111000221112331110000x25,x15,22200x25,x06,2222", two: "p[0,5,9,16]00001x014,111x012,2111x012,23112x010,223112x010,223112x010,221112x09,2322122x09,x27,x09,22200220x35,00022000213233323x06,2213323233x05,22133332311300222213332323130002221232333232000021132x35,2300002132323332320000212333232333x05,1x35,23333x05,113332323111000021112331112x05,222x15,222x06,2220000222x07,2220022200" } } }, smart: ["filter", ["characters", "Koopa", "normal", "normal"], filters.smart] }, Castle: ["filter", ["characters", "Koopa", "normal"], filters.Castle] }, Lakitu: { normal: "p[0,1,6,14]x05,x25,x010,x27,x08,333233322x06,3111311132x06,3x17,323x05,3113131132330000311313113233x05,3332x37,x05,222333322233000x25,33x25,3003x25,11x25,30031222111122213003x112,303x114,33x15,3113x15,33x15,3113x15,33x15,3113x15,33x114,3313x110,3130311131111311130031111333311113003x112,3000311113311113x05,3333003333000", hiding: "p[0,1,6,14]x0131,2220000222x05,x25,33x25,0000x25,11x25,00003222111122230003x112,303x114,33x15,3113x15,33x15,3113x15,33x15,3113x15,33x114,3313x110,3130311131111311130031111333311113003x112,3000311113311113x05,3333003333000" }, Mario: { dead: "p[0,6,8,10]x05,x25,x07,11x27,1100111131311313x16,3313113133x15,33311113331100x35,113333x05,331333313x06,33x16,3x05,222211112220003332233332233003333223322333003333212212333003333x26,333000333x26,3300", normal: { normal: { normal: "p[0,6,8,10]0000x26,x09,x210,x06,33331131x07,33131113111x05,331331113111000033311113333x07,x18,x07,3332333x08,333323323330000x35,2222333300011132122123110001111x26,111000111x28,11x05,222202222x06,333300033330000x35,000x35,00", hopping: ["same", ["characters", "Mario", "normal", "normal", "running", "normal", "two"]], jumping: "p[0,6,8,10]x013,111x06,x26,0111x05,x29,11x05,33311311333000031311131133300003133111311130000331111x36,x06,x17,33000x35,2333233000x37,2333220311x36,x26,0311112232212212330113x210,3300333x29,330333x28,x05,330x25,x07,", running: { skidding: "p[0,6,8,10]x05,x26,x08,x28,33x07,131x37,0000x16,3113111001133113311311100033x16,3111x05,1123332222x05,3332231112220000x36,1113220000x36,112222x05,3333x26,x07,222233322x07,222x35,x09,2333223333x09,2x36,x010,x35,00", normal: { normal: "p[0,6,8,10]x05,x26,x09,x210,x06,33331131x07,33131113111x05,331331113111000033311113333x07,x18,x05,x35,2233x05,1113333222333x17,3332122233x15,0x28,0330000x210,33000x211,330033322200222233003333x013,3333x010,", two: "p[0,6,8,10]x020,x26,x09,x210,x06,33311311x07,31311131111x05,3133111311110000331111x35,x07,x18,x07,3323333x08,333322333x07,3332212211x06,3333x26,x06,2331112222x07,23112222x09,2223333x09,x38,0000", three: "p[0,6,8,10]x021,x26,x09,x210,x06,33331131x07,33131113111x05,331331113111000033311113333x07,x18,x07,x35,2311x06,11x36,11100001112x35,11x05,333x27,x06,33x28,x05,333x27,x06,330003333x012,x35,x05," } }, paddling: { normal: { normal: "p[0,6,8,10]x05,x26,x09,x210,x06,33311311x07,31311131111x05,3133111311110000331111x35,x07,x18,x07,32x35,111x06,2x36,11x06,22233332x06,33x27,x07,33x26,x08,332222x010,30033x014,3x027,", paddle1: "p[0,6,8,10]x05,x26,x09,x210,x06,33311311x07,31311131111x05,3133111311110000331111x35,x07,x18,x07,32x35,1111x05,2x36,111x05,222333322x05,33x28,x06,33x27,x07,33x25,x09,330333x013,33x026,", paddle2: "p[0,6,8,10]x05,x26,x09,x210,x06,33311311x07,31311131111x05,3133111311110000331111x35,x07,x18,x07,3233322x09,2x36,x08,222333311x05,33x25,33111000033x27,111000033x26,00110000330333x013,33x026,", paddle3: "p[0,6,8,10]x05,x26,x09,x210,x06,33311311x07,31311131111x05,3133111311110000331111x35,x07,x18,x07,3332333x08,33332333x06,1333322333x05,1113322122x07,33x27,x07,33x25,x09,330333x013,33x026," }, swim2: { normal: "p[0,6,8,10]x05,x26,x09,x210,x06,33311311x07,31311131111x05,3133111311110000331111x35,x07,x18,x07,32x35,111x06,2x36,11x06,22233332x07,3x27,x07,33x26,x010,3322x011,333x013,33x028,", paddle1: "p[0,6,8,10]x05,x26,x09,x210,x06,33311311x07,31311131111x05,3133111311110000331111x35,x07,x18,x07,32x35,1111x05,2x36,111x05,222333322x06,3x28,x06,33x27,x09,33222x010,3333x012,333x027,", paddle2: "p[0,6,8,10]x05,x26,x09,x210,x06,33311311x07,31311131111x05,3133111311110000331111x35,x07,x18,x07,3233322x09,2x36,x08,222333311x06,3x25,33111000033x27,111x06,3322220011x05,3333x012,333x027,", paddle3: "p[0,6,8,10]x05,x26,x09,x210,x06,33311311x07,31311131111x05,3133111311110000331111x35,x07,x18,x07,3332333x08,33332333x06,1333322333x05,1113322122x07,33x27,x09,332222x09,3333x012,333x027," } }, climbing: { normal: "p[0,6,8,10]0000x26,x09,x210,x06,33311311x07,31311131111x05,3133111311110000331111x35,x07,x18,x07,3323333x09,222x35,x08,222x36,11100002222x35,111100x26,3333111100x211,33300x211,330000x29,x08,x26,x06,", two: "p[0,6,8,10]x05,x26,x09,x210,x06,33311311x07,31311131111x05,3133111311110000331111x35,x07,x18,x08,22x35,111x05,22x36,1111000222x36,1111000x25,122x08,x28,00033000x210,3330000x29,333x05,x28,333x016," } }, large: { normal: "p[0,6,8,10]x06,x25,x09,x26,1x08,x26,11x08,x211,x05,333113111x06,311311331111000031133x18,00331133111311110033x15,x36,000333x15,x35,x05,33x18,x07,2x15,3x09,32333323x07,3323333233x05,3332333323330003333233332333300333223333223330333322333322x38,x28,x38,2122221233331111x28,x18,x28,11110111x28,1110011x210,11000x212,000x26,00x26,00x25,0000x25,00x25,0000x25,000333300003333000033330000333300x36,0000x312,0000x36,", jumping: "p[0,6,8,10]x012,111x012,11311x06,x25,113310000x27,x15,000x28,x35,000x211,33000333113111333300311311331111330031133x18,30031133111311113033x15,x37,0033331111333313000033x18,33x05,2222332333300x36,223233300x38,23323300x38,2232300033113333223320003111133222231000x15,32221222000x15,x28,0001011x29,003011x210,033000x29,33330003x28,x37,233x26,x37,222332222x37,x25,0022x37,x25,x08,3332222x09,33x014,3x015,", hopping: ["same", ["characters", "Mario", "normal", "large", "running", "normal", "two"]], crouching: "p[0,6,8,10]x07,x25,x09,x26,1x08,x26,11x08,x211,x05,333113111x06,311311331111000331113111311110033x15,x36,000223x15,x35,0033323x19,0033323331113323033332x38,23033332x37,22x36,21x35,22x37,x28,x39,x26,x38,1112222111333231111222211113221111x26,1111202113x06,311200033330000333300x36,0000x36,", running: { skidding: "p[0,6,8,10]000x27,x09,11x27,33x06,1x27,333000x26,31133110022113113113111100013311311311110x16,3111213x16,3x15,22313111133331133223110333311113332x05,x15,x35,220003322233111332000333222x15,32000333233x15,3200x37,x15,0000x37,113122200x38,11222200x37,x27,00x36,x27,0000333x25,333x05,x25,x35,x06,x25,x38,0000222333311113x06,233x16,3x07,3112222x010,x27,003x07,222230033x07,22x37,x08,x37,x09,x36,x011,3333x012,3330000", normal: { normal: "p[0,6,8,10]x06,x25,x09,x26,1x08,x26,11x08,x211,x05,333113111x06,311311331111000031133x18,00331133111311110033x15,x36,000333x15,x35,x05,33x18,x08,33311x010,222233200010000333322332011100x36,223231110x37,223321110x37,223323130x36,222332330x36,22212313003333x29,000x15,x28,000x15,x28,0031111x29,0330111x27,x35,00023x26,x35,003223x25,x38,22233222x39,2222000x310,2x011,333x013,333x014,333x011,", two: "p[0,6,8,10]x023,x25,x09,x26,1x08,x26,11x08,x211,x05,333113111x06,311311331111000031133x18,00331133111311110033x15,x36,000033x15,x35,x06,3x18,x06,3222111x08,3233323x09,32333323x07,332x35,22110000322x37,1111003222x36,1111000222x37,1110002222x36,111000x26,3332x06,x210,x06,x29,30003333x27,322003333x25,3322200333322223222200033332220022220003333x05,333300033x07,33330003x08,x36,x010,x36,x017,", three: "p[0,6,8,10]x022,x25,x09,x26,1x08,x26,11x08,x211,x05,333113111x06,311311331111000031133x18,00331133111311110033x15,x36,000033x15,x35,x05,33x18,x07,222211x09,32332233x07,323333223x07,3233332233x06,3233332223x06,32x35,113x06,3233331111x06,22333311112x05,22233311112200002222331112220000x26,332222x05,x25,33322x07,222x36,x07,22x36,x09,223333x010,3222333x09,3333033x08,x35,x011,x37,x011,x35,x05," } }, paddling: { normal: { normal: "p[0,6,8,10]x07,x25,x09,x26,1x08,x26,11x08,x211,x05,333113111x06,311311331111000031133x18,00331133111311110033x15,x36,000033x15,331111x05,3113331111x05,322x35,11x05,322x36,1x06,32x36,x08,32x35,23x07,323333223x08,223322233x07,x28,3x07,x25,1222x06,x210,x06,x210,x06,x210,x05,33x28,00003333x27,x05,3333x25,x07,33332223x08,3333033x09,3300033x09,300003x058,", paddle1: "p[0,6,8,10]x023,x25,x09,x26,1x08,x26,11x08,x211,x05,333113111x06,311311331111000031133x18,00331133111311110033x15,x36,000033x15,331111x05,3113331111x05,322x35,11x05,322x36,1x06,32x36,x08,32x35,23x07,323333223x08,223322233x07,x28,3x07,x25,1222x06,x210,x06,x210,x06,x210,x05,33x28,00003333x27,x05,3333x25,x07,33332223x08,3333033x09,3300033x09,300003x042,", paddle2: "p[0,6,8,10]x023,x25,x09,x26,1x08,x26,11x08,x211,x05,333113111x06,311311331111000031133x18,00331133111311110033x15,x36,000033x15,x35,x06,3x18,x06,3222111x08,3233323x09,32333323x07,332x35,2x07,322x36,2x06,3222x36,11x05,222x36,11100002222x35,1111000x26,3331111000x210,011000x29,x06,33x28,00003333x27,x05,3333x25,x07,33332223x08,3333033x09,3300033x09,300003x042,", paddle3: "p[0,6,8,10]x023,x25,x09,x26,1x08,x26,11x08,x211,x05,333113111x06,311311331111000031133x18,00331133111311110033x15,x36,000033x15,x35,x06,3x18,x06,3222111x08,3233323x09,32333323x08,x36,233x07,x36,223x06,x36,22233x05,x35,x25,3000011333222122200001113x28,0001111x29,000111x29,x06,33x28,00003333x27,x05,3333x25,x07,33332223x08,3333033x09,3300033x09,300003x042," }, swim2: { normal: "p[0,6,8,10]x07,x25,x09,x26,1x08,x26,11x08,x211,x05,333113111x06,311311331111000031133x18,00331133111311110033x15,x36,000033x15,331111x05,3113331111x05,322x35,11x05,322x36,1x06,32x36,x08,32x35,23x07,323333223x08,223322233x07,x28,3x07,x25,1222x06,x210,x06,x210,x06,x210,x06,x29,x07,x28,x08,3x25,x09,333222x010,x35,x011,3333x012,333x014,33x043,", paddle1: "p[0,6,8,10]x023,x25,x09,x26,1x08,x26,11x08,x211,x05,333113111x06,311311331111000031133x18,00331133111311110033x15,x36,000033x15,331111x05,3113331111x05,322x35,11x05,322x36,1x06,32x36,x08,32x35,23x07,323333223x08,223322233x07,x28,3x07,x25,1222x06,x210,x06,x210,x06,x210,x06,x29,x07,x28,x08,3x25,x09,333222x010,x35,x011,3333x012,333x014,33x027,", paddle2: "p[0,6,8,10]x022,x25,x09,x26,1x08,x26,11x08,x211,x05,333113111x06,311311331111000031133x18,00331133111311110033x15,x36,000033x15,x35,x06,3x18,x06,3222111x08,3233323x09,32333323x07,332x35,2x07,322x36,2x06,3222x36,11x05,222x36,11100002222x35,1111000x26,3331111000x210,011000x29,x07,x29,x07,x28,x08,3x25,x09,333222x010,x35,x011,3333x012,333x014,33x028,", paddle3: "p[0,6,8,10]x023,x25,x09,x26,1x08,x26,11x08,x211,x05,333113111x06,311311331111000031133x18,00331133111311110033x15,x36,000033x15,x35,x06,3x18,x06,3222111x08,3233323x09,32333323x08,x36,233x07,x36,223x06,x36,22233x05,x35,x25,3000011333222122200001113x28,0001111x29,000111x29,x07,x29,x07,x28,x08,3x25,x09,333222x010,x35,x011,3333x012,333x014,33x027," } }, climbing: { normal: "p[0,6,8,10]x023,x25,x09,x26,1x08,x26,11x08,x211,x05,333113111x06,311311331111000031133x18,00331133111311110033x15,x36,000033x15,331111x05,3113331111x05,322x35,11x05,322x36,1x06,32x36,x08,32x35,23x07,323333223x08,223322233x07,x28,3x07,x25,1222x06,x210,x06,x210,x06,x210,x06,x29,x07,x29,30330000x27,x35,x05,x26,x35,x07,22223333x011,x35,x013,33x015,3x018,", two: "p[0,6,8,10]x023,x25,x09,x26,1x08,x26,11x08,x211,x05,333113111x06,311311331111000031133x18,00331133111311110033x15,x36,000033x15,x35,x06,3x18,x06,3222111x08,3233323x09,32333323x07,332x35,22110000322x37,1111003222x36,1111000222x37,1110002222x36,111000x26,3332x06,x210,x06,x29,3x06,x210,033000x29,33330000x28,33330000x28,3333x05,x27,3333x064," } }, fiery: { normal: "p[0,5,6,8]x06,x15,x09,x16,2x08,x16,22x08,x111,x05,333223222x06,322322332222000032233x28,00332233222322220033x25,x36,000333x25,x35,x05,33x28,x07,1x25,3x09,31333313x07,3313333133x05,3331333313330003333133331333300333113333113330333311333311x38,x18,x38,1211112133332222x18,x28,x18,22220222x18,2220022x110,22000x112,000x16,00x16,00x15,0000x15,00x15,0000x15,000333300003333000033330000333300x36,0000x312,0000x36,", jumping: "p[0,5,6,8]x012,222x012,22322x06,x15,223320000x17,x25,000x18,x35,000x111,33000333223222333300322322332222330032233x28,30032233222322223033x25,x37,0033332222333323000033x28,33x05,1111331333300x36,113133300x38,13313300x38,1131300033223333113310003222233111132000x25,31112111000x25,x18,0002222x19,003022x110,033000x19,33330003x18,x37,133x16,x37,111331111x37,x15,0011x37,x15,x08,3331111x09,33x014,3x015,", hopping: ["same", ["characters", "Mario", "normal", "fiery", "running", "normal", "three"]], crouching: "p[0,5,6,8]x07,x15,x09,x16,2x08,x16,22x08,x111,x05,333223222x06,322322332222000332223222322220033x25,x36,000113x25,x35,0033313x29,0033313332223313033331x38,13033331x37,11x36,12x35,11x37,x18,x39,x16,x38,2221111222333132222111122223112222x16,2222101223x06,322100033330000333300x36,0000x36,", firing: ["same", ["characters", "Mario", "normal", "fiery", "running", "normal", "two"]], running: { skidding: "p[0,5,6,8]000x17,x09,22x17,33x06,2x17,333000x16,32233220011223223223222200023322322322220x26,3222123x26,3x25,11323222233332233113220333322223331x05,x25,x35,110003311133222331000333111x25,31000333133x25,3100x37,x25,0000x37,223211100x38,22111100x37,x17,00x36,x17,0000333x15,333x05,x15,x35,x06,x15,x38,0000111333322223x06,133x26,3x07,3221111x010,x17,003x07,111130033x07,11x37,x08,x37,x09,x36,x011,3333x012,3330000", normal: { normal: "p[0,5,6,8]x06,x15,x09,x16,2x08,x16,22x08,x111,x05,333223222x06,322322332222000032233x28,00332233222322220033x25,x36,000333x25,x35,x05,33x28,x08,33322x010,111133100020000333311331022200x36,113132220x37,113312220x37,113313230x36,111331330x36,11121323003333x19,000x25,x18,000x25,x18,0032222x19,0330222x17,x35,00013x16,x35,003113x15,x38,11133111x39,1111000x310,1x011,333x013,333x014,333x011,", two: "p[0,5,6,8]x039,x15,x09,x16,2x08,x16,22x08,x111,x05,333223222x06,322322332222000032233x28,00332233222322220033x25,x36,000033x25,x35,x06,3x28,x06,3111222x08,3133313x09,31333313x07,331x35,11220000311x37,2222003111x36,2222000111x37,2220001111x36,222000x16,3331x06,x110,x06,x19,30003333x17,311003333x15,3311100333311113111100033331110011110003333x05,333300033x07,33330003x08,x36,x010,x36,0", three: "p[0,5,6,8,10]x022,x15,x09,x16,2x08,x16,22x08,x111,x05,333223222x06,322322332222000032233x28,00332233222322220033x25,x36,000044x25,x35,x05,33x28,x07,111122x09,31331133x07,313333113x07,3133331133x06,3133331113x06,31x35,223x06,3133332222x06,11333322221x05,11133322221100001111332221110000x16,331111x05,x15,33311x07,111x36,x07,11x36,x09,113333x010,3111333x09,3333033x08,x35,x011,x37,x011,x35,x05," } }, paddling: { normal: { normal: "p[0,6,8,10]x07,x25,x09,x26,1x08,x26,11x08,x211,x05,333113111x06,311311331111000031133x18,00331133111311110033x15,x36,000033x15,331111x05,3113331111x05,322x35,11x05,322x36,1x06,32x36,x08,32x35,23x07,323333223x08,223322233x07,x28,3x07,x25,1222x06,x210,x06,x210,x06,x210,x05,33x28,00003333x27,x05,3333x25,x07,33332223x08,3333033x09,3300033x09,300003x058,", paddle1: "p[0,5,6,8]x023,x15,x09,x16,2x08,x16,22x08,x111,x05,333223222x06,322322332222000032233x28,00332233222322220033x25,x36,000033x25,332222x05,3223332222x05,311x35,22x05,311x36,2x06,31x36,x08,31x35,13x07,313333113x08,113311133x07,x18,3x07,x15,2111x06,x110,x06,x110,x06,x110,x05,33x18,00003333x17,x05,3333x15,x07,33331113x08,3333033x09,3300033x09,300003x042,", paddle2: "p[0,5,6,8]x023,x15,x09,x16,2x08,x16,22x08,x111,x05,333223222x06,322322332222000032233x28,00332233222322220033x25,x36,000033x25,x35,x06,3x28,x06,3111222x08,3133313x09,31333313x07,331x35,1x07,311x36,1x06,3111x36,22x05,111x36,22200001111x35,2222000x16,3332222000x110,022000x19,x06,33x18,00003333x17,x05,3333x15,x07,33331113x08,3333033x09,3300033x09,300003x042,", paddle3: "p[0,5,6,8]x023,x15,x09,x16,2x08,x16,22x08,x111,x05,333223222x06,322322332222000032233x28,00332233222322220033x25,x36,000033x25,x35,x06,3x28,x06,3111222x08,3133313x09,31333313x08,x36,133x07,x36,113x06,x36,11133x05,x35,x15,3000022333111211100002223x18,0002222x19,000222x19,x06,33x18,00003333x17,x05,3333x15,x07,33331113x08,3333033x09,3300033x09,300003x042," }, swim2: { normal: "p[0,6,8,10]x07,x25,x09,x26,1x08,x26,11x08,x211,x05,333113111x06,311311331111000031133x18,00331133111311110033x15,x36,000033x15,331111x05,3113331111x05,322x35,11x05,322x36,1x06,32x36,x08,32x35,23x07,323333223x08,223322233x07,x28,3x07,x25,1222x06,x210,x06,x210,x06,x210,x06,x29,x07,x28,x08,3x25,x09,333222x010,x35,x011,3333x012,333x014,33x043,", paddle1: "p[0,5,6,8]x023,x15,x09,x16,2x08,x16,22x08,x111,x05,333223222x06,322322332222000032233x28,00332233222322220033x25,x36,000033x25,332222x05,3223332222x05,311x35,22x05,311x36,2x06,31x36,x08,31x35,13x07,313333113x08,113311133x07,x18,3x07,x15,2111x06,x110,x06,x110,x06,x110,x06,x19,x07,x18,x08,3x15,x09,333111x010,x35,x011,3333x012,333x014,33x027,", paddle2: "p[0,5,6,8]x022,x15,x09,x16,2x08,x16,22x08,x111,x05,333223222x06,322322332222000032233x28,00332233222322220033x25,x36,000033x25,x35,x06,3x28,x06,3111222x08,3133313x09,31333313x07,331x35,1x07,311x36,1x06,3111x36,22x05,111x36,22200001111x35,2222000x16,3332222000x110,022000x19,x07,x19,x07,x18,x08,3x15,x09,333111x010,x35,x011,3333x012,333x014,33x028,", paddle3: "p[0,5,6,8]x023,x15,x09,x16,2x08,x16,22x08,x111,x05,333223222x06,322322332222000032233x28,00332233222322220033x25,x36,000033x25,x35,x06,3x28,x06,3111222x08,3133313x09,31333313x08,x36,133x07,x36,113x06,x36,11133x05,x35,x15,3000022333111211100002223x18,0002222x19,000222x19,x07,x19,x07,x18,x08,3x15,x09,333111x010,x35,x011,3333x012,333x014,33x027," } }, climbing: { normal: "p[0,5,6,8]x023,x15,x09,x16,2x08,x16,22x08,x111,x05,333223222x06,322322332222000032233x28,00332233222322220033x25,x36,000033x25,332222x05,3223332222x05,311x35,22x05,311x36,2x06,31x36,x08,31x35,13x07,313333113x08,113311133x07,x18,3x07,x15,2111x06,x110,x06,x110,x06,x110,x06,x19,x07,x19,30330000x17,x35,x05,x16,x35,x07,11113333x011,x35,x013,33x015,3x018,", two: "p[0,5,6,8]x023,x15,x09,x16,2x08,x16,22x08,x111,x05,333223222x06,322322332222000032233x28,00332233222322220033x25,x36,000033x25,x35,x06,3x28,x06,3111222x08,3133313x09,31333313x07,331x35,11220000311x37,2222003111x36,2222000111x37,2220001111x36,222000x16,3331x06,x110,x06,x19,3x06,x110,033000x19,33330000x18,33330000x18,3333x05,x17,3333x064," } }, shrooming: { normal: "p[0,6,8,10]x0261,x25,x010,x29,x07,3331131x08,3131113111x06,31331113111x05,3311113333x08,x17,x08,332333x09,3332332333x05,33332222333300001132122123110000111x26,111000011x28,11x06,22200222x07,3330000333x05,33330000333300", shrooming2: "p[0,6,8,10]x0134,x25,x09,x26,1x08,x26,11x08,x211,x05,333113111x06,311311331111000031133x18,00331133111311110033x15,x36,000333x15,x35,x05,33x18,x07,2x15,3x09,32333323x07,3323333233x05,33323333233300033332333323333011002122221200x15,0x28,0x16,x210,11101022220022220100022220000222200003333000033330000333300003333000x35,0000x35,0", shrooming3: "p[0,6,8,10]x06,x25,x09,x26,1x08,x26,11x08,x211,x05,333113111x06,311311331111000031133x18,00331133111311110033x15,x36,000333x15,x35,x05,33x18,x07,2x15,3x09,32333323x07,3323333233x05,3332333323330003333233332333300333223333223330333322333322x38,x28,x38,2122221233331111x28,x18,x28,11110111x28,1110011x210,11000x212,000x26,00x26,00x25,0000x25,00x25,0000x25,000333300003333000033330000333300x36,0000x312,0000x36," } }, star: { normal: ["filter", ["characters", "Mario", "normal"], filters.star.one], star2: ["filter", ["characters", "Mario", "normal"], filters.star.two], star3: ["filter", ["characters", "Mario", "normal"], filters.star.three], star4: ["filter", ["characters", "Mario", "normal"], filters.star.four] } }, Luigi: { dead: "p[0,6,1,21]x05,x25,x07,11x27,1100111131311313x16,3313113133x15,33311113331100x35,113333x05,331333313x06,33x16,3x05,222211112220003332233332233003333223322333003333212212333003333x26,333000333x26,3300", normal: { normal: { normal: "p[0,6,1,21]0000x26,x09,x210,x06,33331131x07,33131113111x05,331331113111000033311113333x07,x18,x07,3332333x08,333323323330000x35,2222333300011132122123110001111x26,111000111x28,11x05,222202222x06,333300033330000x35,000x35,00", hopping: ["same", ["characters", "Luigi", "normal", "normal", "running", "normal", "two"]], jumping: "p[0,6,1,21]x013,111x06,x26,0111x05,x29,11x05,33311311333000031311131133300003133111311130000331111x36,x06,x17,33000x35,2333233000x37,2333220311x36,x26,0311112232212212330113x210,3300333x29,330333x28,x05,330x25,x07,", running: { skidding: "p[0,6,1,21]x05,x26,x08,x28,33x07,131x37,0000x16,3113111001133113311311100033x16,3111x05,1123332222x05,3332231112220000x36,1113220000x36,112222x05,3333x26,x07,222233322x07,222x35,x09,2333223333x09,2x36,x010,x35,00", normal: { normal: "p[0,6,1,21]x05,x26,x09,x210,x06,33331131x07,33131113111x05,331331113111000033311113333x07,x18,x05,x35,2233x05,1113333222333x17,3332122233x15,0x28,0330000x210,33000x211,330033322200222233003333x013,3333x010,", two: "p[0,6,1,21]x020,x26,x09,x210,x06,33311311x07,31311131111x05,3133111311110000331111x35,x07,x18,x07,3323333x08,333322333x07,3332212211x06,3333x26,x06,2331112222x07,23112222x09,2223333x09,x38,0000", three: "p[0,6,1,21]x021,x26,x09,x210,x06,33331131x07,33131113111x05,331331113111000033311113333x07,x18,x07,x35,2311x06,11x36,11100001112x35,11x05,333x27,x06,33x28,x05,333x27,x06,330003333x012,x35,x05," } }, paddling: { normal: { normal: "p[0,6,1,21]x05,x26,x09,x210,x06,33311311x07,31311131111x05,3133111311110000331111x35,x07,x18,x07,32x35,111x06,2x36,11x06,22233332x06,33x27,x07,33x26,x08,332222x010,30033x014,3x027,", paddle1: "p[0,6,1,21]x05,x26,x09,x210,x06,33311311x07,31311131111x05,3133111311110000331111x35,x07,x18,x07,32x35,1111x05,2x36,111x05,222333322x05,33x28,x06,33x27,x07,33x25,x09,330333x013,33x026,", paddle2: "p[0,6,1,21]x05,x26,x09,x210,x06,33311311x07,31311131111x05,3133111311110000331111x35,x07,x18,x07,3233322x09,2x36,x08,222333311x05,33x25,33111000033x27,111000033x26,00110000330333x013,33x026,", paddle3: "p[0,6,1,21]x05,x26,x09,x210,x06,33311311x07,31311131111x05,3133111311110000331111x35,x07,x18,x07,3332333x08,33332333x06,1333322333x05,1113322122x07,33x27,x07,33x25,x09,330333x013,33x026," }, swim2: { normal: "p[0,6,1,21]x05,x26,x09,x210,x06,33311311x07,31311131111x05,3133111311110000331111x35,x07,x18,x07,32x35,111x06,2x36,11x06,22233332x07,3x27,x07,33x26,x010,3322x011,333x013,33x028,", paddle1: "p[0,6,1,21]x05,x26,x09,x210,x06,33311311x07,31311131111x05,3133111311110000331111x35,x07,x18,x07,32x35,1111x05,2x36,111x05,222333322x06,3x28,x06,33x27,x09,33222x010,3333x012,333x027,", paddle2: "p[0,6,1,21]x05,x26,x09,x210,x06,33311311x07,31311131111x05,3133111311110000331111x35,x07,x18,x07,3233322x09,2x36,x08,222333311x06,3x25,33111000033x27,111x06,3322220011x05,3333x012,333x027,", paddle3: "p[0,6,1,21]x05,x26,x09,x210,x06,33311311x07,31311131111x05,3133111311110000331111x35,x07,x18,x07,3332333x08,33332333x06,1333322333x05,1113322122x07,33x27,x09,332222x09,3333x012,333x027," } }, climbing: { normal: "p[0,6,1,21]0000x26,x09,x210,x06,33311311x07,31311131111x05,3133111311110000331111x35,x07,x18,x07,3323333x09,222x35,x08,222x36,11100002222x35,111100x26,3333111100x211,33300x211,330000x29,x08,x26,x06,", two: "p[0,6,1,21]x05,x26,x09,x210,x06,33311311x07,31311131111x05,3133111311110000331111x35,x07,x18,x08,22x35,111x05,22x36,1111000222x36,1111000x25,122x08,x28,00033000x210,3330000x29,333x05,x28,333x016," } }, large: { normal: "p[0,6,1,21]x06,x25,x09,x26,1x08,x26,11x08,x211,x05,333113111x06,311311331111000031133x18,00331133111311110033x15,x36,000333x15,x35,x05,33x18,x07,2x15,3x09,32333323x07,3323333233x05,3332333323330003333233332333300333223333223330333322333322x38,x28,x38,2122221233331111x28,x18,x28,11110111x28,1110011x210,11000x212,000x26,00x26,00x25,0000x25,00x25,0000x25,000333300003333000033330000333300x36,0000x312,0000x36,", jumping: "p[0,6,1,21]x012,111x012,11311x06,x25,113310000x27,x15,000x28,x35,000x211,33000333113111333300311311331111330031133x18,30031133111311113033x15,x37,0033331111333313000033x18,33x05,2222332333300x36,223233300x38,23323300x38,2232300033113333223320003111133222231000x15,32221222000x15,x28,0001011x29,003011x210,033000x29,33330003x28,x37,233x26,x37,222332222x37,x25,0022x37,x25,x08,3332222x09,33x014,3x015,", hopping: ["same", ["characters", "Luigi", "normal", "large", "running", "normal", "two"]], crouching: "p[0,6,1,21]x07,x25,x09,x26,1x08,x26,11x08,x211,x05,333113111x06,311311331111000331113111311110033x15,x36,000223x15,x35,0033323x19,0033323331113323033332x38,23033332x37,22x36,21x35,22x37,x28,x39,x26,x38,1112222111333231111222211113221111x26,1111202113x06,311200033330000333300x36,0000x36,", running: { skidding: "p[0,6,1,21]000x27,x09,11x27,33x06,1x27,333000x26,31133110022113113113111100013311311311110x16,3111213x16,3x15,22313111133331133223110333311113332x05,x15,x35,220003322233111332000333222x15,32000333233x15,3200x37,x15,0000x37,113122200x38,11222200x37,x27,00x36,x27,0000333x25,333x05,x25,x35,x06,x25,x38,0000222333311113x06,233x16,3x07,3112222x010,x27,003x07,222230033x07,22x37,x08,x37,x09,x36,x011,3333x012,3330000", normal: { normal: "p[0,6,1,21]x06,x25,x09,x26,1x08,x26,11x08,x211,x05,333113111x06,311311331111000031133x18,00331133111311110033x15,x36,000333x15,x35,x05,33x18,x08,33311x010,222233200010000333322332011100x36,223231110x37,223321110x37,223323130x36,222332330x36,22212313003333x29,000x15,x28,000x15,x28,0031111x29,0330111x27,x35,00023x26,x35,003223x25,x38,22233222x39,2222000x310,2x011,333x013,333x014,333x011,", two: "p[0,6,1,21]x023,x25,x09,x26,1x08,x26,11x08,x211,x05,333113111x06,311311331111000031133x18,00331133111311110033x15,x36,000033x15,x35,x06,3x18,x06,3222111x08,3233323x09,32333323x07,332x35,22110000322x37,1111003222x36,1111000222x37,1110002222x36,111000x26,3332x06,x210,x06,x29,30003333x27,322003333x25,3322200333322223222200033332220022220003333x05,333300033x07,33330003x08,x36,x010,x36,x017,", three: "p[0,6,1,21]x022,x25,x09,x26,1x08,x26,11x08,x211,x05,333113111x06,311311331111000031133x18,00331133111311110033x15,x36,000033x15,x35,x05,33x18,x07,222211x09,32332233x07,323333223x07,3233332233x06,3233332223x06,32x35,113x06,3233331111x06,22333311112x05,22233311112200002222331112220000x26,332222x05,x25,33322x07,222x36,x07,22x36,x09,223333x010,3222333x09,3333033x08,x35,x011,x37,x011,x35,x05," } }, paddling: { normal: { normal: "p[0,6,1,21]x07,x25,x09,x26,1x08,x26,11x08,x211,x05,333113111x06,311311331111000031133x18,00331133111311110033x15,x36,000033x15,331111x05,3113331111x05,322x35,11x05,322x36,1x06,32x36,x08,32x35,23x07,323333223x08,223322233x07,x28,3x07,x25,1222x06,x210,x06,x210,x06,x210,x05,33x28,00003333x27,x05,3333x25,x07,33332223x08,3333033x09,3300033x09,300003x058,", paddle1: "p[0,6,1,21]x023,x25,x09,x26,1x08,x26,11x08,x211,x05,333113111x06,311311331111000031133x18,00331133111311110033x15,x36,000033x15,331111x05,3113331111x05,322x35,11x05,322x36,1x06,32x36,x08,32x35,23x07,323333223x08,223322233x07,x28,3x07,x25,1222x06,x210,x06,x210,x06,x210,x05,33x28,00003333x27,x05,3333x25,x07,33332223x08,3333033x09,3300033x09,300003x042,", paddle2: "p[0,6,1,21]x023,x25,x09,x26,1x08,x26,11x08,x211,x05,333113111x06,311311331111000031133x18,00331133111311110033x15,x36,000033x15,x35,x06,3x18,x06,3222111x08,3233323x09,32333323x07,332x35,2x07,322x36,2x06,3222x36,11x05,222x36,11100002222x35,1111000x26,3331111000x210,011000x29,x06,33x28,00003333x27,x05,3333x25,x07,33332223x08,3333033x09,3300033x09,300003x042,", paddle3: "p[0,6,1,21]x023,x25,x09,x26,1x08,x26,11x08,x211,x05,333113111x06,311311331111000031133x18,00331133111311110033x15,x36,000033x15,x35,x06,3x18,x06,3222111x08,3233323x09,32333323x08,x36,233x07,x36,223x06,x36,22233x05,x35,x25,3000011333222122200001113x28,0001111x29,000111x29,x06,33x28,00003333x27,x05,3333x25,x07,33332223x08,3333033x09,3300033x09,300003x042," }, swim2: { normal: "p[0,6,1,21]x07,x25,x09,x26,1x08,x26,11x08,x211,x05,333113111x06,311311331111000031133x18,00331133111311110033x15,x36,000033x15,331111x05,3113331111x05,322x35,11x05,322x36,1x06,32x36,x08,32x35,23x07,323333223x08,223322233x07,x28,3x07,x25,1222x06,x210,x06,x210,x06,x210,x06,x29,x07,x28,x08,3x25,x09,333222x010,x35,x011,3333x012,333x014,33x043,", paddle1: "p[0,6,1,21]x023,x25,x09,x26,1x08,x26,11x08,x211,x05,333113111x06,311311331111000031133x18,00331133111311110033x15,x36,000033x15,331111x05,3113331111x05,322x35,11x05,322x36,1x06,32x36,x08,32x35,23x07,323333223x08,223322233x07,x28,3x07,x25,1222x06,x210,x06,x210,x06,x210,x06,x29,x07,x28,x08,3x25,x09,333222x010,x35,x011,3333x012,333x014,33x027,", paddle2: "p[0,6,1,21]x022,x25,x09,x26,1x08,x26,11x08,x211,x05,333113111x06,311311331111000031133x18,00331133111311110033x15,x36,000033x15,x35,x06,3x18,x06,3222111x08,3233323x09,32333323x07,332x35,2x07,322x36,2x06,3222x36,11x05,222x36,11100002222x35,1111000x26,3331111000x210,011000x29,x07,x29,x07,x28,x08,3x25,x09,333222x010,x35,x011,3333x012,333x014,33x028,", paddle3: "p[0,6,1,21]x023,x25,x09,x26,1x08,x26,11x08,x211,x05,333113111x06,311311331111000031133x18,00331133111311110033x15,x36,000033x15,x35,x06,3x18,x06,3222111x08,3233323x09,32333323x08,x36,233x07,x36,223x06,x36,22233x05,x35,x25,3000011333222122200001113x28,0001111x29,000111x29,x07,x29,x07,x28,x08,3x25,x09,333222x010,x35,x011,3333x012,333x014,33x027," } }, climbing: { normal: "p[0,6,1,21]x023,x25,x09,x26,1x08,x26,11x08,x211,x05,333113111x06,311311331111000031133x18,00331133111311110033x15,x36,000033x15,331111x05,3113331111x05,322x35,11x05,322x36,1x06,32x36,x08,32x35,23x07,323333223x08,223322233x07,x28,3x07,x25,1222x06,x210,x06,x210,x06,x210,x06,x29,x07,x29,30330000x27,x35,x05,x26,x35,x07,22223333x011,x35,x013,33x015,3x018,", two: "p[0,6,1,21]x023,x25,x09,x26,1x08,x26,11x08,x211,x05,333113111x06,311311331111000031133x18,00331133111311110033x15,x36,000033x15,x35,x06,3x18,x06,3222111x08,3233323x09,32333323x07,332x35,22110000322x37,1111003222x36,1111000222x37,1110002222x36,111000x26,3332x06,x210,x06,x29,3x06,x210,033000x29,33330000x28,33330000x28,3333x05,x27,3333x064," } }, fiery: { normal: "p[0,5,6,8]x06,x15,x09,x16,2x08,x16,22x08,x111,x05,333223222x06,322322332222000032233x28,00332233222322220033x25,x36,000333x25,x35,x05,33x28,x07,1x25,3x09,31333313x07,3313333133x05,3331333313330003333133331333300333113333113330333311333311x38,x18,x38,1211112133332222x18,x28,x18,22220222x18,2220022x110,22000x112,000x16,00x16,00x15,0000x15,00x15,0000x15,000333300003333000033330000333300x36,0000x312,0000x36,", jumping: "p[0,5,6,8]x012,222x012,22322x06,x15,223320000x17,x25,000x18,x35,000x111,33000333223222333300322322332222330032233x28,30032233222322223033x25,x37,0033332222333323000033x28,33x05,1111331333300x36,113133300x38,13313300x38,1131300033223333113310003222233111132000x25,31112111000x25,x18,0002222x19,003022x110,033000x19,33330003x18,x37,133x16,x37,111331111x37,x15,0011x37,x15,x08,3331111x09,33x014,3x015,", hopping: ["same", ["characters", "Luigi", "normal", "fiery", "running", "normal", "three"]], crouching: "p[0,5,6,8]x07,x15,x09,x16,2x08,x16,22x08,x111,x05,333223222x06,322322332222000332223222322220033x25,x36,000113x25,x35,0033313x29,0033313332223313033331x38,13033331x37,11x36,12x35,11x37,x18,x39,x16,x38,2221111222333132222111122223112222x16,2222101223x06,322100033330000333300x36,0000x36,", firing: ["same", ["characters", "Luigi", "normal", "fiery", "running", "normal", "two"]], running: { skidding: "p[0,5,6,8]000x17,x09,22x17,33x06,2x17,333000x16,32233220011223223223222200023322322322220x26,3222123x26,3x25,11323222233332233113220333322223331x05,x25,x35,110003311133222331000333111x25,31000333133x25,3100x37,x25,0000x37,223211100x38,22111100x37,x17,00x36,x17,0000333x15,333x05,x15,x35,x06,x15,x38,0000111333322223x06,133x26,3x07,3221111x010,x17,003x07,111130033x07,11x37,x08,x37,x09,x36,x011,3333x012,3330000", normal: { normal: "p[0,5,6,8]x06,x15,x09,x16,2x08,x16,22x08,x111,x05,333223222x06,322322332222000032233x28,00332233222322220033x25,x36,000333x25,x35,x05,33x28,x08,33322x010,111133100020000333311331022200x36,113132220x37,113312220x37,113313230x36,111331330x36,11121323003333x19,000x25,x18,000x25,x18,0032222x19,0330222x17,x35,00013x16,x35,003113x15,x38,11133111x39,1111000x310,1x011,333x013,333x014,333x011,", two: "p[0,5,6,8]x039,x15,x09,x16,2x08,x16,22x08,x111,x05,333223222x06,322322332222000032233x28,00332233222322220033x25,x36,000033x25,x35,x06,3x28,x06,3111222x08,3133313x09,31333313x07,331x35,11220000311x37,2222003111x36,2222000111x37,2220001111x36,222000x16,3331x06,x110,x06,x19,30003333x17,311003333x15,3311100333311113111100033331110011110003333x05,333300033x07,33330003x08,x36,x010,x36,0", three: "p[0,5,6,8,10]x022,x15,x09,x16,2x08,x16,22x08,x111,x05,333223222x06,322322332222000032233x28,00332233222322220033x25,x36,000044x25,x35,x05,33x28,x07,111122x09,31331133x07,313333113x07,3133331133x06,3133331113x06,31x35,223x06,3133332222x06,11333322221x05,11133322221100001111332221110000x16,331111x05,x15,33311x07,111x36,x07,11x36,x09,113333x010,3111333x09,3333033x08,x35,x011,x37,x011,x35,x05," } }, paddling: { normal: { normal: "p[0,6,1,21]x07,x25,x09,x26,1x08,x26,11x08,x211,x05,333113111x06,311311331111000031133x18,00331133111311110033x15,x36,000033x15,331111x05,3113331111x05,322x35,11x05,322x36,1x06,32x36,x08,32x35,23x07,323333223x08,223322233x07,x28,3x07,x25,1222x06,x210,x06,x210,x06,x210,x05,33x28,00003333x27,x05,3333x25,x07,33332223x08,3333033x09,3300033x09,300003x058,", paddle1: "p[0,5,6,8]x023,x15,x09,x16,2x08,x16,22x08,x111,x05,333223222x06,322322332222000032233x28,00332233222322220033x25,x36,000033x25,332222x05,3223332222x05,311x35,22x05,311x36,2x06,31x36,x08,31x35,13x07,313333113x08,113311133x07,x18,3x07,x15,2111x06,x110,x06,x110,x06,x110,x05,33x18,00003333x17,x05,3333x15,x07,33331113x08,3333033x09,3300033x09,300003x042,", paddle2: "p[0,5,6,8]x023,x15,x09,x16,2x08,x16,22x08,x111,x05,333223222x06,322322332222000032233x28,00332233222322220033x25,x36,000033x25,x35,x06,3x28,x06,3111222x08,3133313x09,31333313x07,331x35,1x07,311x36,1x06,3111x36,22x05,111x36,22200001111x35,2222000x16,3332222000x110,022000x19,x06,33x18,00003333x17,x05,3333x15,x07,33331113x08,3333033x09,3300033x09,300003x042,", paddle3: "p[0,5,6,8]x023,x15,x09,x16,2x08,x16,22x08,x111,x05,333223222x06,322322332222000032233x28,00332233222322220033x25,x36,000033x25,x35,x06,3x28,x06,3111222x08,3133313x09,31333313x08,x36,133x07,x36,113x06,x36,11133x05,x35,x15,3000022333111211100002223x18,0002222x19,000222x19,x06,33x18,00003333x17,x05,3333x15,x07,33331113x08,3333033x09,3300033x09,300003x042," }, swim2: { normal: "p[0,6,1,21]x07,x25,x09,x26,1x08,x26,11x08,x211,x05,333113111x06,311311331111000031133x18,00331133111311110033x15,x36,000033x15,331111x05,3113331111x05,322x35,11x05,322x36,1x06,32x36,x08,32x35,23x07,323333223x08,223322233x07,x28,3x07,x25,1222x06,x210,x06,x210,x06,x210,x06,x29,x07,x28,x08,3x25,x09,333222x010,x35,x011,3333x012,333x014,33x043,", paddle1: "p[0,5,6,8]x023,x15,x09,x16,2x08,x16,22x08,x111,x05,333223222x06,322322332222000032233x28,00332233222322220033x25,x36,000033x25,332222x05,3223332222x05,311x35,22x05,311x36,2x06,31x36,x08,31x35,13x07,313333113x08,113311133x07,x18,3x07,x15,2111x06,x110,x06,x110,x06,x110,x06,x19,x07,x18,x08,3x15,x09,333111x010,x35,x011,3333x012,333x014,33x027,", paddle2: "p[0,5,6,8]x022,x15,x09,x16,2x08,x16,22x08,x111,x05,333223222x06,322322332222000032233x28,00332233222322220033x25,x36,000033x25,x35,x06,3x28,x06,3111222x08,3133313x09,31333313x07,331x35,1x07,311x36,1x06,3111x36,22x05,111x36,22200001111x35,2222000x16,3332222000x110,022000x19,x07,x19,x07,x18,x08,3x15,x09,333111x010,x35,x011,3333x012,333x014,33x028,", paddle3: "p[0,5,6,8]x023,x15,x09,x16,2x08,x16,22x08,x111,x05,333223222x06,322322332222000032233x28,00332233222322220033x25,x36,000033x25,x35,x06,3x28,x06,3111222x08,3133313x09,31333313x08,x36,133x07,x36,113x06,x36,11133x05,x35,x15,3000022333111211100002223x18,0002222x19,000222x19,x07,x19,x07,x18,x08,3x15,x09,333111x010,x35,x011,3333x012,333x014,33x027," } }, climbing: { normal: "p[0,5,6,8]x023,x15,x09,x16,2x08,x16,22x08,x111,x05,333223222x06,322322332222000032233x28,00332233222322220033x25,x36,000033x25,332222x05,3223332222x05,311x35,22x05,311x36,2x06,31x36,x08,31x35,13x07,313333113x08,113311133x07,x18,3x07,x15,2111x06,x110,x06,x110,x06,x110,x06,x19,x07,x19,30330000x17,x35,x05,x16,x35,x07,11113333x011,x35,x013,33x015,3x018,", two: "p[0,5,6,8]x023,x15,x09,x16,2x08,x16,22x08,x111,x05,333223222x06,322322332222000032233x28,00332233222322220033x25,x36,000033x25,x35,x06,3x28,x06,3111222x08,3133313x09,31333313x07,331x35,11220000311x37,2222003111x36,2222000111x37,2220001111x36,222000x16,3331x06,x110,x06,x19,3x06,x110,033000x19,33330000x18,33330000x18,3333x05,x17,3333x064," } }, shrooming: { normal: "p[0,6,1,21]x0261,x25,x010,x29,x07,3331131x08,3131113111x06,31331113111x05,3311113333x08,x17,x08,332333x09,3332332333x05,33332222333300001132122123110000111x26,111000011x28,11x06,22200222x07,3330000333x05,33330000333300", shrooming2: "p[0,6,1,21]x0134,x25,x09,x26,1x08,x26,11x08,x211,x05,333113111x06,311311331111000031133x18,00331133111311110033x15,x36,000333x15,x35,x05,33x18,x07,2x15,3x09,32333323x07,3323333233x05,33323333233300033332333323333011002122221200x15,0x28,0x16,x210,11101022220022220100022220000222200003333000033330000333300003333000x35,0000x35,0", shrooming3: "p[0,6,1,21]x06,x25,x09,x26,1x08,x26,11x08,x211,x05,333113111x06,311311331111000031133x18,00331133111311110033x15,x36,000333x15,x35,x05,33x18,x07,2x15,3x09,32333323x07,3323333233x05,3332333323330003333233332333300333223333223330333322333322x38,x28,x38,2122221233331111x28,x18,x28,11110111x28,1110011x210,11000x212,000x26,00x26,00x25,0000x25,00x25,0000x25,000333300003333000033330000333300x36,0000x312,0000x36," } }, star: { normal: ["filter", ["characters", "Luigi", "normal"], filters.star.one], star2: ["filter", ["characters", "Luigi", "normal"], filters.star.two], star3: ["filter", ["characters", "Luigi", "normal"], filters.star.three], star4: ["filter", ["characters", "Luigi", "normal"], filters.star.four] } }, Mushroom: { normal: "p[0,1,6,8]x06,2222x011,332222x09,33332222x07,x35,x25,x05,22333x27,000x29,3332200x28,x35,202233x25,x35,222333x25,x35,22233x27,333x219,02333x16,3332x05,x18,x08,12x16,x08,12x16,x09,121111x05,", gainlife: "p[0,1,6,14]x06,2222x011,332222x09,33332222x07,x35,x25,x05,22333x27,000x29,3332200x28,x35,202233x25,x35,222333x25,x35,22233x27,333x219,02333x16,3332x05,x18,x08,12x16,x08,12x16,x09,121111x05,", deathly: "p[0,5,9,16]x06,2222x011,332222x09,33332222x07,x35,x25,x05,22333x27,000x29,3332200x28,x35,202233x25,x35,222333x25,x35,22233x27,333x219,02333x16,3332x05,x18,x08,12x16,x08,12x16,x09,121111x05," }, Pirhana: { normal: { normal: "p[0,6,14]x022,2002x011,210012x09,22200222x08,12200221x07,2221001222x06,2222002222x05,1212200221210000x25,00x25,0000222120021222000021222002221200002222100122220000212220022212x05,2212002122x06,2222002222x07,12100121x010,2002x06,11x05,11x05,11121100011000112101211001100112100112110110112110001121011012110000111211112111x05,x110,000", two: "p[0,1,6,14]x034,3x010,30003211x06,112300331x08,1330023311000011332033321x06,12333233331100113333233233100001332x37,x06,x36,23333100133332x35,23100132333302x35,00x35,20033233300333233000333320023333x05,32x36,23x08,323323x05,22x05,22x05,22232200022000223202322002200223200223220220223220002232022023220000222322223222x05,x210,000" }, Underworld: { normal: "p[0,9,16]x022,2002x011,210012x09,22200222x08,12200221x07,2221001222x06,2222002222x05,1212200221210000x25,00x25,0000222120021222000021222002221200002222100122220000212220022212x05,2212002122x06,2222002222x07,12100121x010,2002x06,11x05,11x05,11121100011000112101211001100112100112110110112110001121011012110000111211112111x05,x110,000", two: "p[0,5,9,16]x034,3x010,30003211x06,112300331x08,1330023311000011332033321x06,12333233331100113333233233100001332x37,x06,x36,23333100133332x35,23100132333302x35,00x35,20033233300333233000333320023333x05,32x36,23x08,323323x05,22x05,22x05,22232200022000223202322002200223200223220220223220002232022023220000222322223222x05,x210,000" }, Castle: ["same", ["characters", "Pirhana", "Underworld"]] }, Podoboo: "p[0,1,6,8]0000x36,x07,x38,x05,3332222333000333x26,33300332221122233033322111122x35,22x16,22333322x16,22333322x16,223333222111122233332222112222x35,232222323330x35,22x35,00x35,22x35,0003303333033x05,30033003000", Shell: { normal: { normal: { normal: "p[0,1,6,14]x05,233332x09,33222233x07,3323333233x06,32x36,23x05,32x38,230000232x36,2320002333233332333200x35,2222x35,01113323333233x17,2x36,2111100011x36,11x07,11333311x09,x16,x011,1111x06,", peeking: "p[0,1,6,14]x05,233332x09,33222233x07,3323333233x06,32x36,23x05,32x38,230000232x36,2320002333233332333200x35,2222x35,01113323333233x17,2x36,2111100211x36,11200022211333311222002220x16,02220022000111100022002x012,20" }, smart: ["filter", ["characters", "Shell", "normal", "normal"], filters.smart] }, Underworld: { normal: "p[0,5,9,16]x05,233332x09,33222233x07,3323333233x06,32x36,23x05,32x38,230000232x36,2320002333233332333200x35,2222x35,01113323333233x17,2x36,2111100011x36,11x07,11333311x09,x16,x011,1111x06,", peeking: "p[0,5,6,9,16]x05,344443x09,44333344x07,4434444344x06,43x46,34x05,43x48,340000343x46,3430003444344443444300x45,3333x45,01114434444344x17,3x46,3111100211x46,11200022211444411222002220x16,02220022000111100022002x012,20" }, Castle: ["same", ["characters", "Shell", "normal", "normal"]] }, ShellBeetle: { normal: "p[0,2,5,9]x06,1111x010,x18,x07,1111331111x05,1111322311110000x15,33x15,0000x112,000x114,00x114,00x114,00x114,00x114,00x114,00x114,0x35,x16,x35,000033311333x010,3333x06,", Underworld: "p[0,15,16,18]x06,1111x010,x18,x07,1111221111x05,1111233211110000x15,22x15,0000x112,000x114,00x114,00x114,00x114,00x114,00x114,00x114,0x25,x16,x25,000022211222x010,2222x06,", Castle: "p[0,1,3,4]x06,3333x010,x38,x07,3333223333x05,3333211233330000x35,22x35,0000x312,000x314,00x314,00x314,00x314,00x314,00x314,0x25,x36,x25,000022233222x010,2222x06," }, Spiny: { normal: "p[0,1,6,8]x024,1x015,1x014,122x08,10000122000010001200122220012000122012222012200012223222312220001122x35,1222003322331123322301113331122233330033133x25,x36,133133222333111333321x35,111x05,222x16,2220002222x06,2222", two: "p[0,1,6,8]x08,1x015,1x014,122x08,10000122000010001200122220012000122012222012200012223222312220001122x35,1222003322331123322301113331122233330033133x25,x36,133133222333111333321x35,111x05,222x16,22x06,222000222x08,22000220000" }, SpinyEgg: { normal: "p[0,1,6,8]x06,22x09,22322322x06,2x36,2x05,x310,00022311x35,22002311x37,200331x39,022x310,2222x310,220x39,133002x37,11320022x35,11322000x310,x05,2x36,2x06,22322322x09,22x06,", two: "p[0,1,6,8]0000220022x08,233332x05,22x38,2200233311x35,20003311x36,0022331x37,2222x310,220x312,00x312,022x310,2222x37,1332200x36,11330002x35,1133320022x38,22x05,233332x08,2200220000" }, Star: { normal: "p[0,6,8]x06,11x012,11x011,1111x010,1111x09,x16,0000x119,2112x15,01111211211110001112112111x05,x18,x06,x18,x05,x110,0000x110,00001111001111000111x06,1110011x08,110", two: "p[0,2,9]x06,22x012,22x011,2222x010,2222x09,x26,0000x219,1221x25,02222122122220002221221222x05,x28,x06,x28,x05,x210,0000x210,00002222002222000222x06,2220022x08,220", three: "p[0,5,8]x06,22x012,22x011,2222x010,2222x09,x26,0000x219,1221x25,02222122122220002221221222x05,x28,x06,x28,x05,x210,0000x210,00002222002222000222x06,2220022x08,220", four: "p[0,6,14]x06,11x012,11x011,1111x010,1111x09,x16,0000x119,2112x15,01111211211110001112112111x05,x18,x06,x18,x05,x110,0000x110,00001111001111000111x06,1110011x08,110" }, Vine: ["multiple", "vertical", { top: "p[0,6,14]00222x010,x25,x08,2211122x07,x25,12x09,222022x012,22x012,22x012,22x012,22x012,220022x08,2202222x07,2221112x07,x26,12x06,220x25,", middle: "p[0,6,14]x06,22x012,22x012,22x08,220022x07,2222022x07,2111222x06,21x26,x06,x25,022x012,22x012,22x012,22x012,220022x08,2202222x07,2221112x07,x26,12x06,220x25," }] }, solids: { Axe: { normal: "p[0,2,4,6,9]003x010,3000323300420033130032333322333313032x35,42x35,1332x35,42x35,1332x35,42x35,1332x35,42x35,1332x35,42x35,130323333423333130002330042000313000300002200003x09,42x014,22x014,42x014,22x014,42x07,", two: "p[0,2,4,9]003x010,3000323300320033130032333322333313032x36,2x35,1332x36,2x35,1332x36,2x35,1332x36,2x35,1332x36,2x35,13032x35,23333130002330032000313000300002200003x09,32x014,22x014,32x014,22x014,32x07,", three: "p[0,2,4,9,11]004x010,4000424400320044140042444422444414042x45,32x45,1442x45,32x45,1442x45,32x45,1442x45,32x45,1442x45,32x45,140424444324444140002440032000414000400002200004x09,32x014,22x014,32x014,22x014,32x07," }, Block: { normal: { normal: "p[0,2,9]0x114,01x214,1121x210,1211x214,11x214,11x214,11x214,11x214,11x214,11x214,11x214,11x214,11x214,1121x210,1211x214,10x114,0", unused: { normal: "p[0,2,6,9]0x314,03x214,1321x210,12132222x35,x25,132223311133222213222331223312221322233122331222132222112333122213x26,3311122213x26,331x25,13x27,11x25,13x26,33x26,13x26,331x25,1321x25,112221213x214,x117,", two: "p[0,2,9]0x214,0x215,1221x210,121x215,1x26,111x26,1x26,1222212221x26,1222212221x25,11222212221x29,1112221x29,1x25,1x28,11x25,1x215,1x29,1x25,1221x25,11222121x215,x117,", three: "p[0,2,9,11]0x214,02x314,1231x310,13123333x25,x35,123332211122333312333221332213331233322133221333123333113222133312x36,2211133312x36,221x35,12x37,11x35,12x36,22x36,12x36,221x35,1231x35,113331312x314,x117," } }, Underworld: { normal: "p[0,9,16]0x214,02x114,2212x110,2122x114,22x114,22x114,22x114,22x114,22x114,22x114,22x114,22x114,22x114,2212x110,2122x114,20x214,0", unused: { normal: "p[0,6,9,16]0x214,02x114,3213x110,31321111x25,x15,321112233322111132111223112231113211122311223111321111331222311132x16,2233311132x16,223x15,32x17,33x15,32x16,22x16,32x16,223x15,3213x15,331113132x114,x317,", two: "p[0,9,16]0x114,0x115,2112x110,212x115,2x16,222x16,2x16,2111121112x16,2111121112x15,22111121112x19,2221112x19,2x15,2x18,22x15,2x115,2x19,2x15,2112x15,22111212x115,x217,", three: "p[0,9,11,16]0x114,01x214,3123x210,32312222x15,x25,312221133311222231222113221132223122211322113222312222332111322231x26,1133322231x26,113x25,31x27,33x25,31x26,11x26,31x26,113x25,3123x25,332223231x214,x317," } }, Castle: ["same", ["solids", "Block", "Underworld"]] }, Brick: { normal: { normal: "p[2,5,9]x116,x27,0x27,0x27,0x27,x017,2220x27,0x27,0x27,0x27,0x27,02222x016,x27,0x27,0x27,0x27,0x27,0x27,x017,2220x27,0x27,0x27,0x27,0x27,02222x016,", used: ["same", ["solids", "Block", "Overworld", "used"]] }, Underworld: { normal: "p[2,16]x17,0x17,0x17,0x17,0x17,0x17,x017,1110x17,0x17,0x17,0x17,0x17,01111x016,x17,0x17,0x17,0x17,0x17,0x17,x017,1110x17,0x17,0x17,0x17,0x17,01111x016,", used: ["same", ["solids", "Block", "Overworld", "used"]] }, Castle: ["filter", ["solids", "Brick", "Overworld"], filters.Castle], Alt2: ["filter", ["solids", "Brick", "Overworld"], filters.Alt2] }, BridgeBase: "p[0,2,5,8]111000112221012222x35,222x35,222x35,222x35,22221012211100011", Cannon: ["multiple", "vertical", { top: "p[0,2,5,9]222x010,2222111x210,11222x110,x26,1x213,111x210,112x112,2112x112,2112x112,2112x15,22221112112111121111311211211121122113121121112121131312112111212113131211211121133113221122212x16,3122221102x16,302110002x18,3x06,2x18,3x05,2x110,300002x110,3000211x38,1130021333222233313021133x26,3313021133232232331132113233223323113211323322332311321132332233231132113x28,3113211333233233311321133322223331132111x38,11132x114,3", middle: "p[2,5,9]1x014,21x014,21x014,21x014,21x014,21x014,21x014,21x014,21x014,21x014,21x014,21x014,21x014,21x014,21x014,21x014,21x014,21x014,21x014,21x014,21x014,21x014,21x014,21x014,21x014,21x014,21x014,21x014,21x014,21x014,21x014,21x014,2" }], CastleAxe: "p[0,2,4,6,8]003x010,3000323300420033130032333322333313032x35,42x35,1332x35,42x35,1332x35,42x35,1332x35,42x35,1332x35,42x35,130323333423333130002330042000313000300002200003x09,42x014,22x014,42x014,22x014,42x07,", CastleBlock: "p[0,4,9]0x114,01x214,1121x210,1211x214,11x214,11x214,11x214,11x214,11x214,11x214,11x214,11x214,11x214,1121x210,1211x214,10x114,0", CastleBridge: "p[1,2,4,8]10001000100010001000100010001000122212223222322232223222322232223222322232223222322232221222122213331333133313331333133313331333", CastleChain: "p[0,1,3]x014,1x013,1x014,22x011,12x013,22x011,12x012,102x012,22x011,12x012,102x012,22x011,12x013,22x011,12x012,102x012,22x013,", CastleStone: { normal: "p[1,2,3,4]0031x06,31000022310x25,310x25,310x25,310x25,310x25,310x25,310x25,310x25,310x25,3102223331x37,13333x116,x06,31x06,310x25,310x25,310x25,310x25,310x25,310x25,310x25,310x25,310x25,310x25,31x37,1x37,x117,", Underwater: "p[2,12,14,20]1103x16,03111122031x25,031x25,031x25,031x25,031x25,031x25,031x25,031x25,031x25,0312220003x07,30000x316,x16,03x16,031x25,031x25,031x25,031x25,031x25,031x25,031x25,031x25,031x25,031x25,03x07,3x07,x317," }, Cloud: "p[0,1,2]000x210,x05,2x110,20002x112,2002x112,2002x112,202x114,22x15,2112x15,22x15,2112x15,22x15,2112x15,22x114,2212x110,2120211121111211120021111222211112002x112,2000211112211112x05,2222002222000", Coral: "p[0,7,8]0000100012x05,110001000120000121001000112000120110100012000020001010011211112000101001x26,100021100120000221000221112x06,2x05,22120001x05,1000012001x06,1011012001000100101001120122010001100012120022000021001122000020000211112x011,22212x06,", DeadGoomba: { normal: "p[0,5,9,15]x06,2222x09,x210,000022333222233322022111133331111x218,000x110,x07,x18,x05,x35,0000x35,0", Underworld: "p[0,15,16,18]x06,2222x09,x210,000022111222211122022333311113333x218,000x310,x07,x38,x05,x15,0000x15,0", Castle: ["filter", ["solids", "DeadGoomba", "normal"], filters.Castle] }, Firework: { normal: "p[0,6,8]x070,2002x010,20222202x09,221122x09,22111122x08,22111122x09,221122x09,20222202x010,2002x070,", n2: "p[0,1,6,8]x020,3x06,3x09,303303x09,x38,x06,303232232303x05,3321221233x06,3221111223x05,3332111123330000333211112333x05,3221111223x06,3321221233x05,303232232303x06,x38,x09,303303x09,3x06,3x020,", n3: "p[0,1,6,8]00030033330030000300x38,003000x35,22x35,00303323233232330300323x26,32300033321211212333033232x16,232x35,22x16,22x36,22x16,22x35,232x16,23233033321211212333000323x26,32300303323233232330300x35,22x35,000300x38,00300003003333003000" }, Flag: { normal: "p[0,1,14]x116,0x18,x25,1100x16,22121221000x15,211211210000111121222121x05,11122212221x06,11x27,1x07,111222111x08,x18,x09,x17,x010,x16,x011,x15,x012,1111x013,111x014,11x015,1", Alt: "p[0,5,16]x116,0x18,x25,1100x16,22121221000x15,211211210000111121222121x05,11122212221x06,11x27,1x07,111222111x08,x18,x09,x17,x010,x16,x011,x15,x012,1111x013,111x014,11x015,1", Alt2: ["same", ["solids", "Flag", "Alt"]] }, FlagPole: { normal: "p[13]x0288,", Alt: "p[1]x0288,", Alt2: ["same", ["solids", "FlagPole", "Alt"]] }, FlagTop: { normal: "p[0,2,13,14]001111000123331012x35,112x35,11x36,11x36,10133331000111100", Alt: "p[0,1,3,4]002222000213332021x35,221x35,22x36,22x36,20233332000222200", Alt2: ["same", ["solids", "Flag", "Alt"]] }, Floor: { normal: "p[2,5,9]2x18,02111121x28,01222201x28,01222201x28,01222201x28,01022201x28,02000021x28,0x15,01x28,01222201x28,01222201x28,012222000x26,01x25,01100222201x25,0121100001x26,0122211101x26,01x26,01x25,002x06,21x06,2", Underworld: "p[2,16,18]1x28,01222212x18,02111102x18,02111102x18,02111102x18,02011102x18,01000012x18,0x25,02x18,02111102x18,02111102x18,021111000x16,02x15,02200111102x15,0212200002x16,0211122202x16,02x16,02x15,001x06,12x06,1", Underwater: "p[2,12,14]22x112,0221111x29,0011122111222211100122x15,2212221202112222011x25,0211222201x26,021x26,0x25,0221x26,0022201201x26,0000101011112222000100101222122220012011x25,02200122011x25,0200012001x25,001111220012220000122220022x06,2x07,2", Castle: ["same", ["solids", "Stone", "Castle"]], Alt2: ["filter", ["solids", "Floor", "Overworld"], filters.Alt2] }, Peach: "p[0,1,2,6,8]x019,303303x010,x36,x09,x48,x07,x410,x07,4443234444x07,433233434x06,x37,434x07,x38,44x05,3444x35,44x05,34433334444x06,x36,4444x06,4413341444x05,44133111144x05,431111331440000x39,144x05,x37,1444x07,44111144x07,x110,x05,x112,0000x112,0001111x46,111100x414,00x45,1111x45,0", Pipe: { normal: ["multiple", "vertical", { top: "p[0,2,13,14]x133,x230,11x35,x26,x319,1122233x26,322x310,2323221122233x26,322x311,232221122233x26,322x310,2323221122233x26,322x311,232221122233x26,322x310,2323221122233x26,322x311,232221122233x26,322x310,2323221122233x26,322x311,232221122233x26,322x310,2323221122233x26,322x311,232221122233x26,322x310,232322x133,00x128,00", middle: "p[0,2,13,14]00122233x25,322x38,2322210000122233x25,322x39,232210000122233x25,322x38,2322210000122233x25,322x39,232210000122233x25,322x38,2322210000122233x25,322x39,232210000122233x25,322x38,2322210000122233x25,322x39,232210000122233x25,322x38,2322210000122233x25,322x39,232210000122233x25,322x38,2322210000122233x25,322x39,232210000122233x25,322x38,2322210000122233x25,322x39,232210000122233x25,322x38,2322210000122233x25,322x39,2322100" }], Castle: { normal: ["multiple", "vertical", { top: "p[0,1,3,4]x333,x130,33x25,x16,x219,3311122x16,211x210,1212113311122x16,211x211,121113311122x16,211x210,1212113311122x16,211x211,121113311122x16,211x210,1212113311122x16,211x211,121113311122x16,211x210,1212113311122x16,211x211,121113311122x16,211x210,1212113311122x16,211x211,121113311122x16,211x210,121211x333,00x328,00", middle: "p[0,1,3,4]00311122x15,211x28,1211130000311122x15,211x29,121130000311122x15,211x28,1211130000311122x15,211x29,121130000311122x15,211x28,1211130000311122x15,211x29,121130000311122x15,211x28,1211130000311122x15,211x29,121130000311122x15,211x28,1211130000311122x15,211x29,121130000311122x15,211x28,1211130000311122x15,211x29,121130000311122x15,211x28,1211130000311122x15,211x29,121130000311122x15,211x28,1211130000311122x15,211x29,1211300" }], Underwater: ["multiple", "vertical", { top: "p[0,5,9,17]x133,x230,11x35,x26,x319,1122233x26,322x310,2323221122233x26,322x311,232221122233x26,322x310,2323221122233x26,322x311,232221122233x26,322x310,2323221122233x26,322x311,232221122233x26,322x310,2323221122233x26,322x311,232221122233x26,322x310,2323221122233x26,322x311,232221122233x26,322x310,232322x133,00x128,00", middle: "p[5,9,17,20]33011122x15,211x28,1211103333011122x15,211x29,121103333011122x15,211x28,1211103333011122x15,211x29,121103333011122x15,211x28,1211103333011122x15,211x29,121103333011122x15,211x28,1211103333011122x15,211x29,121103333011122x15,211x28,1211103333011122x15,211x29,121103333011122x15,211x28,1211103333011122x15,211x29,121103333011122x15,211x28,1211103333011122x15,211x29,121103333011122x15,211x28,1211103333011122x15,211x29,1211033" }] }, Alt: ["same", ["solids", "Pipe", "Castle"]], Alt2: ["same", ["solids", "Pipe", "Castle"]] }, PipeSide: { normal: "p[0,2,13,14]x115,x024,1x213,x122,0001x213,11x220,1001x213,11x220,1001x213,11x220,1001x313,11x221,101x313,11x321,101x213,11x321,101x213,11x221,101x213,11x221,101x213,11x222,11x213,11x222,11x313,11x222,11x213,11x322,11x213,11x222,11x213,11x222,11x213,11x322,11x313,11x322,11x313,11x322,11x313,11x322,11x313,11x322,11x313,11x322,11x313,11x321,101x313,11x321,101x313,11x321,101x313,11323232323232323232323101323232323232311232323232323232323232101232323232323211323232323232323232321001323232323232311x220,1001x213,11x220,1001x213,x122,000x115,x024,", small: "p[0,2,13,14]x115,01x213,111x213,111x213,111x213,111x313,111x313,111x213,111x213,111x213,111x213,111x213,111x313,111x213,111x213,111x213,111x213,111x313,111x313,111x313,111x313,111x313,111x313,111x313,111x313,111x313,111323232323232311123232323232321113232323232323111x213,111x213,x117,0" }, PipeVertical: { normal: "p[0,2,13,14]012232x310,223x25,332222100122232x39,223x25,33222210012232x310,223x25,332222100122232x39,223x25,33222210012232x310,223x25,332222100122232x39,223x25,33222210012232x310,223x25,332222100122232x39,223x25,33222210012232x310,223x25,332222100122232x39,223x25,33222210012232x310,223x25,332222100122232x39,223x25,33222210012232x310,223x25,332222100122232x39,223x25,33222210012232x310,223x25,332222100122232x39,223x25,33222210", Castle: { normal: "p[0,1,3,4]00211133x15,311x38,1311120000211133x15,311x39,131120000211133x15,311x38,1311120000211133x15,311x39,131120000211133x15,311x38,1311120000211133x15,311x39,131120000211133x15,311x38,1311120000211133x15,311x39,131120000211133x15,311x38,1311120000211133x15,311x39,131120000211133x15,311x38,1311120000211133x15,311x39,131120000211133x15,311x38,1311120000211133x15,311x39,131120000211133x15,311x38,1311120000211133x15,311x39,1311200", Underwater: "p[0,7,8,17]00122233x25,322x38,2322210000122233x25,322x39,232210000122233x25,322x38,2322210000122233x25,322x39,232210000122233x25,322x38,2322210000122233x25,322x39,232210000122233x25,322x38,2322210000122233x25,322x39,232210000122233x25,322x38,2322210000122233x25,322x39,232210000122233x25,322x38,2322210000122233x25,322x39,232210000122233x25,322x38,2322210000122233x25,322x39,232210000122233x25,322x38,2322210000122233x25,322x39,2322100" } }, Platform: { normal: "p[0,1,6,9]x18,x38,220000222x05,322x05,32223333x210,x38,", Sky: "p[0,1,6]001111000x15,2012x15,212x15,212211112112211220111122000222200" }, Scale: { normal: ["multiple", "horizontal", { left: "p[0,2,5,9]000x27,00x28,0222333000022x35,00223331333022331113302233313330220x35,00220033300022x08,", middle: "p[0,5]x120,x080,", right: "p[0,2,5,9]x27,000x28,x05,333222000x35,22003331333220331113322033313332200x35,0220003330022x08,22" }], Alt: ["multiple", "horizontal", { left: "p[0,1,2,9]000x17,00x18,0111333000011x35,00113332333011332223301133323330110x35,00110033300011x08,", middle: "p[0,1]x120,x080,", right: "p[0,1,2,9]x17,000x18,x05,333111000x35,11003332333110332223311033323331100x35,0110003330011x08,11" }] }, Springboard: { normal: ["multiple", "vertical", { top: "p[8]x032,", topheight: 2, middle: "p[0,1,6]x05,110011x010,210012x010,200002x010,200002x09,2x06,2x08,2x06,2x08,2x06,2x07,2x08,2x05,12x08,21000011x08,11000011x08,11000012x08,21x05,2x08,2x07,2x06,2x08,2x06,2x08,2x06,2x09,200002x010,200002x010,210012x010,110011x05,", bottom: "p[2,8,9]x132,x27,0x27,0x27,0x27,x017,2220x27,0x27,0x27,0x27,0x27,02222x016,", bottomheight: 9 }], alt: ["multiple", "vertical", { top: "p[8]x032,", topheight: 2, middle: "p[0,1,6]x05,110011x010,210012x010,200002x010,200002x09,2x06,2x08,2x06,2x08,2x06,2x07,2x08,2x05,12x08,21000011x08,11000011x08,11000012x08,21x05,2x08,2x07,2x06,2x08,2x06,2x08,2x06,2x09,200002x010,200002x010,210012x010,110011x05,", bottom: "p[3,4,8]x232,x07,1x07,1x07,1x07,x117,0001x07,1x07,1x07,1x07,1x07,10000x116,", bottomheight: 9 }] }, Stone: { normal: "p[2,5,9]2x114,012x112,00112x110,0001112x18,00001111x28,00001111x28,00001111x28,00001111x28,00001111x28,00001111x28,00001111x28,00001111x28,0000111x09,200011x011,2001x013,2x016,2", Underwater: ["same", ["solids", "Floor", "Underwater"]], Underworld: ["filter", ["solids", "Stone", "Overworld"], filters.Underworld], Castle: { normal: "p[1,2,3,4]0031x06,31000022310x25,310x25,310x25,310x25,310x25,310x25,310x25,310x25,310x25,3102223331x37,13333x116,x06,31x06,310x25,310x25,310x25,310x25,310x25,310x25,310x25,310x25,310x25,310x25,31x37,1x37,x117,", Underwater: "p[2,3,14,20]1103x16,03111122031x25,031x25,031x25,031x25,031x25,031x25,031x25,031x25,031x25,0312220003x07,30000x316,x16,03x16,031x25,031x25,031x25,031x25,031x25,031x25,031x25,031x25,031x25,031x25,03x07,3x07,x317," }, Sky: "p[0,1,2]000x210,x05,2x110,20002x112,2002x112,2002x112,202x114,22x15,2112x15,22x15,2112x15,22x15,2112x15,22x114,2212x110,2120211121111211120021111222211112002x112,2000211112211112x05,2222002222000" }, Toad: "p[0,1,2,6,8]x06,1111x010,x18,x06,144411114441000114441441444110011441444414411044111144441111x45,1114444111x46,1111441111x46,x110,x45,1133233233114401143323323341100300x38,00303330333223330x37,443333443333003x410,300004444333344440000444x36,4440000444x36,444x05,x110,x05,x112,000444x18,444041444x16,4441x47,1111x412,1111x46,", ShroomTop: ["multiple", "horizontal", { left: "p[0,2,6,8]000x113,001x36,x27,01x37,x27,01x37,x27,1x38,x27,1x37,x28,1x37,222333221x36,222x35,21x35,222x37,1x28,x37,1x28,x37,1x29,x35,21x210,333221x215,011x213,000x113,", middle: "p[2,6,8]x016,1x28,x18,x28,x19,x26,x132,x25,x110,x27,x19,x27,x18,x29,x17,x29,x17,x29,x17,x29,x18,x27,x19,x27,x110,x25,111x016,", right: "p[0,2,6,8]x113,000x38,x25,100x38,x26,10x38,x26,10x38,222333212x36,222x35,1223333222x36,1x29,x36,1x29,x36,1x210,x35,1x211,33321x215,1x215,1x215,1x214,x117,0" }], TreeTop: { normal: ["multiple", "horizontal", { left: "p[0,2,13]00x114,011x213,01x214,11x214,1x215,1x215,1x215,1x215,1x215,1x215,1x215,1x215,1x215,1x26,1x27,1012222101x25,10001111000x15,00", middle: "p[2,8,13]x016,x2199,0x27,00x25,010x25,011x05,111x05,11", right: "p[0,2,13]x114,00x213,110x214,10x214,11x215,1x215,1x215,1x215,1x215,1x215,1x215,1x215,1x215,11x27,1x26,101x25,10122221000x15,000111100" }], Alt: ["multiple", "horizontal", { left: "p[0,1,4]00x214,022x113,02x114,22x114,2x115,2x115,2x115,2x115,2x115,2x115,2x115,2x115,2x115,2x16,2x17,2021111202x15,20002222000x25,00", middle: "p[1,3,4]x216,x0199,2x07,22x05,212x05,211x25,111x25,11", right: "p[0,1,4]x213,000x113,200x114,20x114,20x115,2x115,2x115,2x115,2x115,2x115,2x115,2x115,2x115,22x17,2x16,202x15,20211112000x25,000222200" }], Alt2: ["same", ["solids", "TreeTop", "Alt"]] }, WaterBlock: "20" }, scenery: { BrickHalf: { normal: "p[2,9]x17,0x17,0x17,0x17,0x17,0x17,x017,1110x17,0x17,0x17,0x17,0x17,01111x016,", Alt2: ["filter", ["scenery", "BrickHalf", "normal"], filters.Alt2] }, BrickPlain: { normal: "p[2,9]x17,0x17,0x17,0x17,0x17,0x17,x017,1110x17,0x17,0x17,0x17,0x17,01111x016,x17,0x17,0x17,0x17,0x17,0x17,x017,1110x17,0x17,0x17,0x17,0x17,01111x016,x17,0x17,0", Alt2: ["filter", ["scenery", "BrickPlain", "normal"], filters.Alt2] }, BridgeBase: "p[0,2,5,9]111000112221012222x35,222x35,222x35,222x35,22221012211100011", Bush1: "p[0,2,13,14]x014,1111x027,122221x024,11x26,1x022,1x28,101x020,1x29,121x019,1x26,3x25,1x017,122233222322221x016,12223x210,1x013,111x216,1001x08,1x219,10121x06,1x221,1221x06,x225,1010011x226,1211x230,11x230,101x228,10", Bush2: "p[0,2,13,14]x014,1111x012,1111x027,122221x010,122221x024,11x26,1x07,11x26,1x022,1x28,10100001x28,101x020,1x29,1210001x29,121x019,1x26,3x25,1001x26,3x25,1x017,1222332223222210122233222322221x016,12223x210,112223x210,1x013,111x232,1001x08,1x235,10121x06,1x237,1221x06,x241,1010011x242,1211x246,11x246,101x244,10", Bush3: "p[0,2,13,14]x014,1111x012,1111x012,1111x027,122221x010,122221x010,122221x024,11x26,1x07,11x26,1x07,11x26,1x022,1x28,10100001x28,10100001x28,101x020,1x29,1210001x29,1210001x29,121x019,1x26,3x25,1001x26,3x25,1001x26,3x25,1x017,12223322232222101222332223222210122233222322221x016,12223x210,112223x210,112223x210,1x013,111x248,1001x08,1x251,10121x06,1x253,1221x06,x257,1010011x258,1211x262,11x262,101x260,10", CastleBridge: "p[1,2,4,9]10001000100010001000100010001000122212223222322232223222322232223222322232223222322232221222122213331333133313331333133313331333", CastleChain: "p[0,1,3]x014,1x013,1x014,22x011,12x013,22x011,12x012,102x012,22x011,12x012,102x012,22x011,12x013,22x011,12x012,102x012,22x013,", CastleDoor: { normal: "p[2,9]x17,0x17,0x17,0x17,0x17,0x17,x017,1110x17,0x17,0x17,0x17,0x17,01111x016,x15,x06,11110111x010,11011x012,1x017,1x014,11x014,1x0416,", Alt2: ["filter", ["scenery", "CastleDoor", "normal"], filters.Alt2] }, CastleRailing: { normal: "p[0,2,5,9]2222x07,x25,3332x07,2x37,2x07,2x37,2x07,2x37,2x07,2x37,2x07,2x37,2x07,23333111x29,1111", Alt2: ["filter", ["scenery", "CastleRailing", "normal"], filters.Alt2] }, CastleRailingFilled: { normal: "p[2,5,9]11112220222x15,222122202221x27,122202221x27,1x07,1x27,1x27,1x27,1x27,1x27,1x27,12222000x19,0000", Alt2: ["filter", ["scenery", "CastleRailingFilled", "normal"], filters.Alt2] }, CastleTop: { normal: "p[2,9]x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,x025,1110x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,01111x024,x17,x09,x17,0x17,x09,x17,0x17,x09,x17,x025,11101111x08,1110x17,01111x08,1110x17,01111x08,11101111x024,x17,x09,x17,0x17,x09,x17,0x17,x09,x17,x025,11101111x08,1110x17,01111x08,1110x17,01111x08,11101111x024,", Alt2: ["filter", ["scenery", "CastleTop", "normal"], filters.Alt2] }, CastleWall: { normal: "p[0,2,5,9]2222x07,x25,3332x07,2x37,2x07,2x37,2x07,2x37,2x07,2x37,2x07,2x37,2x07,23333111x29,1111x37,1x37,1x37,1x37,1x37,1x37,x117,3331x37,1x37,1x37,1x37,1x37,13333x116,x37,1x37,1x37,1x37,1x37,1x37,x117,3331x37,1x37,1x37,1x37,1x37,13333x116,x37,1x37,1x37,1x37,1x37,1x37,x117,3331x37,1x37,1x37,1x37,1x37,13333x116,x37,1x37,1x37,1x37,1x37,1x37,x117,3331x37,1x37,1x37,1x37,1x37,13333x116,x37,1x37,1x37,1x37,1x37,1x37,x117,3331x37,1x37,1x37,1x37,1x37,13333x116,x37,1x37,1x37,1x37,1x37,1x37,x117,3331x37,1x37,1x37,1x37,1x37,13333x116,x37,1x37,1x37,1x37,1x37,1x37,x117,3331x37,1x37,1x37,1x37,1x37,13333x116,x37,1x37,1x37,1x37,1x37,1x37,x117,3331x37,1x37,1x37,1x37,1x37,13333x116,x37,1x37,1x37,1x37,1x37,1x37,x117,3331x37,1x37,1x37,1x37,1x37,13333x116,x37,1x37,1x37,1x37,1x37,1x37,x117,3331x37,1x37,1x37,1x37,1x37,13333x116,x37,1x37,1x37,1x37,1x37,1x37,x117,3331x37,1x37,1x37,1x37,1x37,13333x116,", Alt2: ["filter", ["scenery", "CastleRailingFilled", "normal"], filters.Alt2] }, Cloud1: { normal: "p[0,1,2,19]x014,2222x027,211112x024,22x16,2x022,2x18,202x020,2x19,212x019,2x16,3x15,2x017,211133111311112x016,21113x110,2x013,222x116,2002x08,2x119,20212x06,2x121,2112x06,x125,2020022x126,2122x130,22x130,202x128,20002113x111,3x111,2x05,2113113x16,3x113,2x05,2113333111333311113x18,200002x15,x36,1x35,x19,x06,2221111331111333x18,22x09,2x16,2x18,21122x012,221112022111122022x016,22200002222x010,", Alt2: ["filter", ["scenery", "Cloud1", "normal"], filters.Alt2] }, Cloud2: { normal: "p[0,1,2,19]x014,2222x012,2222x027,211112x010,211112x024,22x16,2x07,22x16,2x022,2x18,20200002x18,202x020,2x19,2120002x19,212x019,2x16,3x15,2002x16,3x15,2x017,2111331113111120211133111311112x016,21113x110,221113x110,2x013,222x132,2002x08,2x135,20212x06,2x137,2112x06,x141,2020022x142,2122x146,22x146,202x144,20002113x111,3x115,3x111,2x05,2113113x16,3x18,3x16,3x113,2x05,21133331113333111131333111333311113x18,200002x15,x36,1x35,1111x36,1x35,x19,x06,2221111331111333x17,331111333x18,22x09,2x16,2x18,2x16,2x18,21122x012,2211120221111220221112022111122022x016,22200002222x05,22200002222x010,", Alt2: ["filter", ["scenery", "Cloud2", "normal"], filters.Alt2] }, Cloud3: { normal: "p[0,1,2,19]x014,2222x012,2222x012,2222x027,211112x010,211112x010,211112x024,22x16,2x07,22x16,2x07,22x16,2x022,2x18,20200002x18,20200002x18,202x020,2x19,2120002x19,2120002x19,212x019,2x16,3x15,2002x16,3x15,2002x16,3x15,2x017,21113311131111202111331113111120211133111311112x016,21113x110,221113x110,221113x110,2x013,222x148,2002x08,2x151,20212x06,2x153,2112x06,x157,2020022x158,2122x162,22x162,202x160,20002113x111,3x115,3x115,3x111,2x05,2113113x16,3x18,3x16,3x18,3x16,3x113,2x05,211333311133331111313331113333111131333111333311113x18,200002x15,x36,1x35,1111x36,1x35,1111x36,1x35,x19,x06,2221111331111333x17,331111333x17,331111333x18,22x09,2x16,2x18,2x16,2x18,2x16,2x18,21122x012,22111202211112202211120221111220221112022111122022x016,22200002222x05,22200002222x05,22200002222x010,", Alt2: ["filter", ["scenery", "Cloud3", "normal"], filters.Alt2] }, Fence: "p[0,2,5,9]000023222331x08,2322333100003322232233312222333323223331333311112322333x15,000023223331x08,23223331x08,23232331x08,23232331x08,2323233100003322232323312222333323232331333311112322233x15,000023222331x08,23222331x08,232223310000", HillLarge: "p[0,2,14]x037,x16,x071,111x26,111x066,11x212,11x063,1x213,1221x061,1x213,111221x059,1x214,1112221x057,1x215,11122221x055,1x213,112111x25,1x053,1x214,11221x27,1x051,1x215,11x211,1x049,1x216,11x212,1x047,1x232,1x045,1x234,1x043,1x236,1x041,1x238,1x039,1x240,1x037,1x242,1x035,1x244,1x033,1x246,1x031,1x213,1x223,1x210,1x029,1x213,111x221,111x210,1x027,1x214,111x221,111x211,1x025,1x215,111x221,111x212,1x023,1x213,112111x218,112111x213,1x021,1x214,11221x219,11221x215,1x019,1x215,11x222,11x219,1x017,1x216,11x222,11x220,1x015,1x264,1x013,1x266,1x011,1x268,1x09,1x270,1x07,1x272,1x05,1x274,10001x276,101x278,1", HillSmall: "p[0,2,14]x021,x16,x039,111x26,111x034,11x212,11x031,1x213,1221x029,1x213,111221x027,1x214,1112221x025,1x215,11122221x023,1x213,112111x25,1x021,1x214,11221x27,1x019,1x215,11x211,1x017,1x216,11x212,1x015,1x232,1x013,1x234,1x011,1x236,1x09,1x238,1x07,1x240,1x05,1x242,10001x244,101x246,1", Pirhana: ["same", ["characters", "Pirhana"]], pirhana: ["same", ["characters", "Pirhana"]], PlantLarge: { normal: "p[0,2,5,13]x06,1111x010,11333311x07,1x38,1x05,1x310,10001x312,1001x312,101x314,11x314,11x314,11x314,11x314,11x314,11x314,11x314,11x314,11x314,11x314,11x314,11x314,11x314,11x314,11x314,101x312,1001x312,1001x312,10001x310,1000011x38,11x05,1113333111x07,x18,x09,x17,x08,1x26,1x08,12222121x08,12222121x08,12222121x08,12222121x08,11222211x09,121121x09,12122121x08,1x26,1x08,12222121x08,12222121x08,12222121x08,12222121x08,11222211x09,121121x09,121221210000", Alt: "p[0,1,2,3,5]x06,3333x010,33111133x07,3x18,3x05,3x110,30003x112,3003x112,303x114,33x114,33x114,33x114,33x114,33x114,33x114,33x114,33x114,33x114,33x114,33x114,33x114,33x114,33x114,33x114,303x112,3003x112,3003x112,30003x110,3000033x18,33x05,3331111333x07,x38,x09,x37,x08,2x46,2x08,24444242x08,24444242x08,24444242x08,24444242x08,22444422x09,242242x09,24244242x08,2x46,2x08,24444242x08,24444242x08,24444242x08,24444242x08,22444422x09,242242x09,242442420000", Alt2: ["same", ["solids", "PlantLarge", "Alt"]] }, PlantSmall: { normal: "p[0,2,5,13]x05,1111x08,11333311x05,1x38,10001x310,101x312,11x312,11x312,11x312,11x312,101x310,10011x38,110001113333111x05,x18,x07,x17,x06,1x26,1x06,12222121x06,12222121x06,12222121x06,12222121x06,11222211x07,121121x07,12122121x06,1x26,1x06,12222121x06,12222121x06,12222121x06,12222121x06,11222211x07,121121x07,12122121000", Alt: "p[0,1,2,3,5]x05,3333x08,33111133x05,3x18,30003x110,303x112,33x112,33x112,33x112,33x112,303x110,30033x18,330003331111333x05,x38,x07,x37,x06,2x46,2x06,24444242x06,24444242x06,24444242x06,24444242x06,22444422x07,242242x07,24244242x06,2x46,2x06,24444242x06,24444242x06,24444242x06,24444242x06,22444422x07,242242x07,24244242000", Alt2: ["same", ["solids", "PlantSmall", "Alt"]] }, Railing: { normal: "p[0,2,13]2x06,221x05,12010001220100012200111022x06,22x06,22x06,2", Night: "p[0,1,3]1x06,112x05,21020002110200021100222011x06,11x06,11x06,1" }, ShroomTrunk: ["multiple", "vertical", { top: "p[2,5,9]0x114,00x114,00x114,00x114,00x114,00111121111211110021121211212112001221112211122100x114,00x114,00x114,00x114,00x114,00x114,00x114,00x114,0", middle: "p[2,5]0x114,00x114,00x114,00x114,00x114,00x114,00x114,00x114,00x114,00x114,00x114,00x114,00x114,00x114,00x114,00x114,0" }], String: "x056,", TreeTrunk: { normal: "p[2,9]x120,0x17,0x17,0x17,0x17,0x17,0x16,0x17,0x17,0x17,0x17,0x17,0x140,0x17,0x17,0x17,0x17,0x17,0x16,0x17,0x17,0x17,0x17,0x17,0x120,", Underworld: ["filter", ["scenery", "TreeTrunk", "normal"], filters.Underworld], Alt2: ["filter", ["scenery", "TreeTrunk", "normal"], filters.Alt2] }, Water: { normal: "p[0,1,17]x028,1x06,121000012210011222100x26,1121x26,1212222122122112", Underwater: "p[1,17,20]x212,0x26,010222201102200111022x16,0010x16,010111101101100x19,", Night: "p[2,1,19]x028,1x06,121000012210011222100x26,1121x26,1212222122122112", Castle: { normal: "p[0,1,8]x028,1x06,121000012210011222100x26,1121x26,1212222122122112", Underwater: "p[1,17,20]x212,0x26,010222201102200111022x16,0010x16,010111101101100x19," } }, WaterFill: { normal: { normal: "p[17]x088,", Night: "p[19]x088," }, Castle: "p[8]x088," } } }, cache: {}, posts: [] }, library.filters = filters, delete window.filters, library.sprites = libraryParse(library.rawsprites), libraryPosts() } function libraryParse(e) { var t, n, x = {}; for (n in e) switch ((t = e[n]).constructor) { case String: x[n] = spriteGetArray(spriteExpand(spriteUnravel(t))); break; case Array: library.posts.push({ caller: x, name: n, command: e[n] }); break; case Object: x[n] = libraryParse(t) } return x } function libraryPosts() { var e, t, n, x, r, i = library.posts; for (r in i) t = (e = i[r]).caller, n = e.name, x = e.command, t[n] = evaluatePost(t, x, r) } function evaluatePost(e, t, n) { switch (t[0]) { case "same": return followPath(library.sprites, t[1], 0); case "filter": return applyLibraryFilter(followPath(library.rawsprites, t[1], 0), t[2], n); case "multiple": return evaluatePostMultiple(t) } } function applyLibraryFilter(e, t) { switch (t[0]) { case "palette": return e.constructor == String ? spriteGetArray(spriteExpand(applyPaletteFilter(spriteUnravel(e), t[1]))) : applyPaletteFilterRecursive(e, t[1]) } } function applyPaletteFilterRecursive(e, t) { var n, x, r = {}; for (x in e) switch ((n = e[x]).constructor) { case String: r[x] = spriteGetArray(spriteExpand(applyPaletteFilter(spriteUnravel(n), t))); break; case Object: r[x] = applyPaletteFilterRecursive(n, t) } return r } function applyPaletteFilter(e, t) { var n, x, r, i = ""; for (x = 0, r = e.length; x < r; x += digitsize) i += t[n = e.substr(x, digitsize)] || n; return i } function evaluatePostMultiple(e) { var t, n, x = e[1], r = e[2], i = new SpriteMultiple(x); for (n in r) t = r[n], i[n] = "string" == typeof t ? spriteGetArray(spriteExpand(spriteUnravel(t))) : t; return i } function SpriteMultiple(e) { this.type = e, this.multiple = !0 } function getDigitSize(e) { return Number(String(e.length).length) } function startLoadingMaps() { "file:" != window.location.protocol && passivelyLoadMap([1, 2], new XMLHttpRequest) } function passivelyLoadMap(e, t) { if (!(!e || e[0] > 8 || e[1] <= 0)) { var n = "Maps/World" + e[0] + e[1] + ".js"; t.open("GET", n, !0), mlog("Maps", "Requesting:", n), t.send(), t.onreadystatechange = function() { if (4 == t.readyState) { if (200 == t.status) mapfuncs[e[0]][e[1]] = Function(t.responseText), window.parentwindow && parentwindow.onMapLoad && (parentwindow.onMapLoad(e[0], e[1]), setTimeout((function() { parentwindow.onMapLoad(e[0], e[1]) }), 2100)), mlog("Maps", " Loaded: Maps/World" + e[0] + e[1] + ".js"); else if (404 != t.status) return; setTimeout((function() { passivelyLoadMap(setNextLevelArr(e), t) }), 7) } } } } function setNextLevelArr(e) { return 4 == e[1]++ && (++e[0], e[1] = 1), e } function resetMaps() { var e; window.currentmap = [1, 1], window.defaultsetting = { setting: "Overworld" }, window.mapfuncs = new Array(9); for (var t, n = 1; n <= 9; ++n) for (t = (e = mapfuncs[n] = [0, 0, 0, 0, 0]).length; t >= 0; --t) e[t] = window["World" + n + t]; mapfuncs.Random = { Overworld: WorldRandomOverworld, Underworld: WorldRandomUnderworld, Underwater: WorldRandomUnderwater, Bridge: WorldRandomBridge, Sky: WorldRandomSky, Castle: WorldRandomCastle }, mapfuncs.Special = { Blank: BlankMap }, startLoadingMaps() } function Map() { this.underwater = this.current_character = this.current_solid = this.current_scenery = this.xloc = 0, this.canscroll = !0, this.floor = 104, this.time = 400, this.curloc = -1, this.gravity = gravity, this.maxyvel = 1.75 * unitsize, this.maxyvelinv = -2.1 * this.maxyvel } function Area(e, t) { this.creation = t || function() {}, this.precharacters = [], this.presolids = [], this.prescenery = [], this.floor = 140, this.width = 0, this.underwater = !1, setAreaSetting(this, e || "") } function setAreaSetting(e, t, n) { map.shifting = !0, 1 == arguments.length && (t = arguments[0] || "Overworld", e = map.area), e.setting = e.background = t, e.theme = t.split(" ")[0], e.fillStyle = getAreaFillStyle(e.setting), -1 != e.fillStyle.indexOf("Underwater") ? goUnderWater() : goOntoLand(), n && AudioPlayer.playTheme(), gameon && clearAllSprites(), map.shifting = !1 } function Location(e, t, n) { this.area = e, this.xloc = n || 0, this.yloc = this.floor = 0, this.entry = 1 == t ? entryPlain : t || entryNormal } function PreThing(e, t, n) { this.xloc = e, this.yloc = t, this.type = n; var x = arrayMake(arguments), r = new Thing; x[2] = n, x = x.splice(2), Thing.apply(r, x), this.object = r } function setMap(e, t) { if (gameon) { !window.canedit && window.editing && editorClose(!0), removeRandomDisplays(), e instanceof Array && (t = e[1], e = e[0]); var n = e ? [e, t] : window.currentmap, x = new Map, r = mapfuncs[n[0]]; r ? (n.func = r = r[n[1]], r ? (window.map = x, window.currentmap = n, r(x), x.areanum = x.curloc = 0, window.area = x.area = x.areas[0], window.player && player.power && storePlayerStats(), window.data && (data.scoreold = data.score.amount), shiftToLocation(0)) : log("No such map exists (yet?):", r)) : log("No such map section exists (yet?):", r) } } function setMapRandom(e) { gameon && (resetSeed(), "string" == typeof e ? e = ["Random", e] : e || (e = ["Random", "Overworld"]), setMap(e[0], e[1]), data.traveledold = data.traveled, map.sincechange = map.num_random_sections = 0, map.entrancetype = e[2], map.random = !0, "Sky" == map.randname && (map.exitloc = ["Random", "Overworld", "Down"])) } function shiftToLocation(e) { if (map.random && "number" != typeof e) return setMapRandom(e); "number" == typeof e && (e = map.locs[e]), pause(), resetGameState(), resetGameScreenPosition(), resetQuadrants(), map.areanum = e.area, window.area = map.area = map.areas[map.areanum], setAreaPreCreation(area), area.creation(), setAreaPostCreation(area), spawnMap(), player = placePlayer(), scrollPlayer(e.xloc * unitsize), locMovePreparations(player), unpause(), e.entry(player, e.entrything), TimeHandler.addEvent(AudioPlayer.playTheme, 2), TimeHandler.addEventInterval(checkTexts, 117, 1 / 0) } function setAreaPreCreation(e) { window.events = [], TimeHandler.clearAllEvents(), window.characters = [], window.solids = [], window.scenery = [], clearTexts(), e.precharacters = [], e.presolids = [], e.prescenery = [], map.current_solid = map.current_character = map.current_scenery = map.shifting = 0, map.canscroll = !0, data.time.amount = map.time, data.world.amount = currentmap[0] + "-" + currentmap[1], setDataDisplay(), startDataTime(), map.random && (data.world.amount = "Random Map", data.world.element.innerHTML = "WORLD
Random Map") } function clearTexts() { if (window.texts) for (var e = texts.length - 1; e >= 0; --e) texts[e] && removeChildSafe(texts[e], body); window.texts = [] } function setAreaPostCreation() { if (map.current_character = map.current_solid = map.current_scenery = 0, area.width = max(area.width, gamescreen.width), map.underwater = map.area.underwater, map.jumpmod = 1.056 + 3.5 * map.underwater, map.has_lakitu = !1, TimeHandler.addEvent(setMapGravity, 1), area.underwater && (area.presolids.push(new PreThing(0, 0, WaterBlock, area.width)), map.random || area.presolids.push(new PreThing(0, 16, Sprite, "Water", [area.width / 3, 1]))), area.presolids.sort(prethingsorter), area.precharacters.sort(prethingsorter), area.prescenery.sort(prethingsorter), area.sections && area.sections[0]) setBStretch(), area.sections.current = 0, area.sections[0](area.sections.start); else if (!map.random && "Sky" != area.setting) { var e = new PreThing(area.width, 0, ScrollBlocker); area.presolids.push(e) } area.fillStyle = getAreaFillStyle(area.setting) } function getAreaFillStyle(e) { return stringHas(e, "Underworld") || stringHas(e, "Castle") || stringHas(e, "Night") ? stringHas(e, "Underwater") ? "#2038ec" : "black" : stringHas(e, "Underwater") ? "#2038ec" : "#5c94fc" } function prethingsorter(e, t) { return e.xloc == t.xloc ? t.yloc - e.yloc : e.xloc - t.xloc } function setLocationGeneration(e) { map.curloc = e, map.refx = map.locs[map.curloc].xloc, map.refy = map.locs[map.curloc].yloc + map.floor, map.areanum = map.locs[map.curloc].area } function spawnMap() { var e, t, n, x, r, i = map.area, a = QuadsKeeper.getOutDifference(), o = gamescreen.right + a, l = o + (2 * QuadsKeeper.getQuadWidth() + a); for (t = (e = i.precharacters).length, r = map.current_character; t > r && o >= (n = e[r]).xloc * unitsize;) addThing(x = n.object, n.xloc * unitsize - gamescreen.left, n.yloc * unitsize), x.placenum = r, ++r; for (map.current_character = r, t = (e = i.presolids).length, r = map.current_solid; t > r && l >= (n = e[r]).xloc * unitsize;) addThing(x = n.object, n.xloc * unitsize - gamescreen.left, n.yloc * unitsize), x.placenum = r, ++r; for (map.current_solid = r, t = (e = i.prescenery).length, r = map.current_scenery; t > r && l >= (n = e[r]).xloc * unitsize;) addThing(x = n.object, n.xloc * unitsize - gamescreen.left, n.yloc * unitsize), x.placenum = r, ++r; map.current_scenery = r } function goToTransport(e) { e instanceof Array ? (map.ending = !0, storePlayerStats(), pause(), map.random ? setMapRandom(e) : setMap(e)) : shiftToLocation(map.locs[e]), is_mobile && applyNewJs() } function entryPlain(e) { setLeft(e, unitsizet16), setBottom(e, map.floor * unitsize), e.nocollide = e.piping = !1, e.placed = !0 } function entryNormal(e) { setLeft(e, unitsizet16), setTop(e, unitsizet16), e.nocollide = e.piping = !1, e.placed = !0 } function entryBlank(e) { setLeft(e, unitsizet16), setBottom(e, map.floor * unitsize), e.nocollide = e.piping = e.movement = !1, e.placed = e.nofall = e.nocollide = notime = nokeys = !0, thingStoreVelocity(e), clearDataDisplay() } function entryRandom(e) { switch (data.time.amount = 0, data.time.dir = 1, updateDataElement(data.time), map.startwidth ? map.nofloor || pushPreFloor(0, 0, map.startwidth) : map.startwidth = 0, map.firstRandomThings(map), map.randtype(8 * (map.startwidth + 1)), entryPlain(e), addDistanceCounter(), addSeedDisplay(), map.entrancetype) { case "Down": entryNormal(player); break; case "Up": locMovePreparations(player), exitPipeVert(player, addThing(new Thing(Pipe, 32), unitsizet8, (map.floor - 32) * unitsize)); break; case "Vine": locMovePreparations(player), TimeHandler.addEvent((function() { enterCloudWorld(player, !0) }), 1), player.nofall = !0, spawnMap(); break; case "Castle": startCastle(player) } } function enterCloudWorld(e) { map.random && (map.exitloc = getAfterSkyTransport()); var t = 140 * unitsize, n = 72 * unitsize; e.placed = e.nofall = !0, setTop(e, t), setLeft(e, 30 * unitsize), removeClass(e, "jumping"), addClasses(e, ["climbing", "animated"]), e.climbing = TimeHandler.addSpriteCycle(e, ["one", "two"], "climbing"), e.attached = new Thing(Vine, -1), addThing(e.attached, unitsizet32, t - unitsizet8); var x = setInterval((function() { if (e.attached.top <= n) { clearInterval(x), setTop(e.attached, n, !0), e.attached.movement = !1; var t = e.attached.top + unitsizet16; x = setInterval((function() { shiftVert(e, -1 * unitsized4, !0), e.top <= t && (removeClass(e, "animated"), clearInterval(x), setTop(e, t, !0), clearInterval(x), setTimeout((function() { setLeft(e, 36 * unitsize, !0), addClass(e, "flipped"), setTimeout((function() { playerHopsOff(e, e.attached, !0), TimeHandler.clearClassCycle(e, "climbing"), e.running = TimeHandler.addSpriteCycle(e, ["one", "two", "three", "two"], "running", setPlayerRunningCycler) }), 28 * timer) }), 14 * timer)) }), timer) } }), timer) } function walkToPipe() { player = placePlayer(), startWalking(player), map.canscroll = !1; var e = setInterval((function() { player.piping && (AudioPlayer.pauseTheme(), clearInterval(e), player.maxspeed = player.maxspeedsave) }), timer); unpause() } function startWalking(e) { e.movement = movePlayer, e.maxspeed = e.walkspeed, nokeys = notime = e.keys.run = !0, e.nofall = e.nocollide = !1 } function intoPipeVert(e, t, n) { if (!(!t.transport || !e.resting || e.right + unitsizet2 > t.right || e.left - unitsizet2 < t.left)) { pipePreparations(e), switchContainers(e, characters, scenery), unpause(); var x = setInterval((function() { shiftVert(e, unitsized4, !0), e.top >= t.top && (clearInterval(x), setTimeout((function() { goToTransport(n) }), 700)) }), timer) } } function intoPipeHoriz(e, t, n) { pipePreparations(e), switchContainers(e, characters, scenery), unpause(); var x = setInterval((function() { shiftHoriz(e, unitsized4, !0), e.left >= t.left && (clearInterval(x), setTimeout((function() { goToTransport(n) }), 700)) }), timer) } function pipePreparations(e) { AudioPlayer.pauseTheme(), AudioPlayer.play("Pipe"), locMovePreparations(e), e.nofall = e.nocollide = nokeys = notime = !0, e.movement = e.xvel = e.yvel = 0 } function locMovePreparations(e) { e.keys = new Keys, e.nocollide = e.piping = 1, e.placed = !1, removeCrouch(), removeClass(e, "running"), removeClass(e, "jumping"), removeClass(e, "flipped") } function startCastle(e) { (e = e || window.player) && (setBottom(e, 56 * unitsize), setLeft(e, unitsizet2), e.nocollide = e.piping = !1, e.placed = !0) } function exitPipeVert(e, t) { switchContainers(e, characters, scenery), e.nofall = nokeys = notime = !0, AudioPlayer.play("Pipe"), setTop(e, t.top), setMidXObj(e, t, !0); var n = unitsize / -4, x = setInterval((function() { shiftVert(e, n, !0), e.bottom <= t.top && (switchContainers(e, scenery, characters), clearInterval(x), e.nocollide = e.piping = e.nofall = nokeys = notime = !1, e.placed = !0) }), timer) } function endLevel() { map.ending || (map.ending = !0, map.random ? setMapRandom(["Random", "Castle"]) : setNextLevelArr(currentmap), storePlayerStats(), pause(), setMap()) } function setExitLoc(e) { map.exitloc = e } function pushPreThing(e, t, n, x, r) { var i = new PreThing(map.refx + t, map.refy - n, e, x, r), a = i.object; return !a.solid && !a.character || a.nostretch || (map.area.width = max(map.area.width, i.xloc + a.width)), a.solid && !a.spawn_as_char ? map.area.presolids.push(i) : map.area.precharacters.push(i), i } function pushPreScenery(e, t, n, x, r) { x = round(x || 1), r = round(r || 1); var i = new PreThing(map.refx + t, map.refy - n, Sprite, e, [x, r]); return i.yloc -= i.object.height, map.area.prescenery.push(i), i } function pushPreScenerySolid(e, t, n, x, r) { x = x || 1, r = r || 1; var i = new PreThing(map.refx + t, map.refy - n, Sprite, e, [x, r]); return i.yloc -= i.object.height, map.area.presolids.push(i), i } function pushPreText(e, t, n) { var x = new PreThing(map.refx + t, map.refy - n, FuncSpawner, spawnText, e); return map.area.presolids.push(x), x } function fillPreThing(e, t, n, x, r, i, a, o, l) { for (var s, d, u = t, p = 0; p < x; ++p) { for (s = n, d = 0; d < r; ++d) pushPreThing(e, u, s, o, l), s += a; u += i } } function pushPreFloor(e, t, n) { pushPreThing(Floor, e, t || 0, n || 1, DtB(t, 8)) } function makeCeiling(e, t) { t = t || 1; for (var n = 0; n < t; ++n) pushPreThing(Brick, e + 8 * n, ceillev) } function makeCeilingCastle(e, t, n) { pushPreThing(Stone, e, ceillev, t || 1, n || 1) } function pushPreBridge(e, t, n, x) { pushPreScenery("Railing", e, t, 2 * n), pushPreThing(BridgeBase, e, t, n), x instanceof Array && (x[0] && pushPreThing(Stone, e - 8, t, 1, 64), x[1] && pushPreThing(Stone, e + 8 * n, t, 1, 64)) } function fillPreWater(e, t, n) { var x = DtB(t), r = ceil(x / 5.5), i = 5 * r; pushPreScenery("Water", e, t - 5.5, 4 * n / 3), pushPreScenery("WaterFill", e, t - i - 15.5, 4 * n / 3, r + 2) } function pushPrePlatformGenerator(e, t, n) { pushPreThing(PlatformGenerator, e, ceilmax + 16, t, n) } function pushPreScale(e, t, n, x) { var r = x[0], i = 2 * r, a = x[1] + 1.5, o = x[2] + 1.5, l = pushPreThing(Scale, e, t, n).object; platleft = pushPreThing(Platform, e - i, t - 4 * a, r, moveFallingScale).object, platright = pushPreThing(Platform, e + 4 * n - r - 6, t - 4 * o, r, moveFallingScale).object, platleft.parent = l, platright.parent = l, platleft.partner = platright, platright.partner = platleft, platleft.tension = a * unitsizet4 - 10 * unitsize, platright.tension = o * unitsizet4 - 10 * unitsize, l.tensionleft = a * unitsize, l.tensionright = o * unitsize, platleft.string = pushPreScenery("String", e, t - 4 * a, 1, 4 * (a - .5)).object, platright.string = pushPreScenery("String", e + 4 * n - 1, t - 4 * o, 1, 4 * (o - .5)).object } function pushPreWarpWorld(e, t, n, x, r) { 1 == n.length && (n = [-1, n[0], -1]); var i, a, o = (x || 0) + e + 10, l = n.length; warp = pushPreThing(WarpWorld, e, t + ceilmax).object; var s = pushPreText({ innerText: "WELCOME TO WARP ZONE!", style: { visibility: "hidden" } }, o, 58); for (warp.texts.push(s.object), a = 0; a < l; ++a) - 1 != n[a] && (warp.pipes.push(i = pushPrePipe(o, t, 24, !0, n[a]).object), warp.pirhanas.push(i.pirhana), n[a] instanceof Array && warp.texts.push(pushPreText({ innerText: n[a][0], style: { visibility: "hidden" } }, o + 4, 38).object)), o += 32; r && (window.block = pushPreThing(ScrollBlocker, e, ceilmax), pushPreThing(ScrollBlocker, o + 16, ceilmax)) } function goUnderWater() { window.map && (map.area && (window.player && !map.shifting && setAreaSetting(String(map.area.setting || "") + " Underwater"), map.area.underwater = !0), setMapGravity(), TimeHandler.clearEvent(map.bubbling), map.bubbling = TimeHandler.addEventInterval(playerBubbles, 96, 1 / 0), map.underwater = !0) } function goOntoLand() { map && (map.area && (window.player && !map.shifting && setAreaSetting(map.area.setting.replace("Underwater", "") || "Overworld"), map.area.underwater = !1), setMapGravity(), TimeHandler.clearEvent(map.bubbling), map.underwater = !1) } function setMapGravity() { window.player && (map.underwater ? player.gravity = gravity / 2.8 : player.gravity = gravity) } function setBStretch() { window.bstretch = gamescreen.width / 8 - 2 } function endCastleOutside(e, t, n, x, r) { e = e || 0, t = t || 0, n && (n = castlev), r = r || 20; var i = pushPreThing(FlagDetector, e + 7, t + 108).object, a = pushPreThing(CastleDoorDetector, e + 60 + 8 * (0 == castlev), 8).object; i.flag = pushPreThing(Flag, e + .5, t + 79.5).object, i.stone = pushPreThing(Stone, e + 4, t + 8).object, i.top = pushPreThing(FlagTop, e + 6.5, 84).object, i.pole = pushPreThing(FlagPole, e + 8, 80).object, x && pushPreScenery("CastleWall", e + r + 72, t, x), 0 == n && shiftHoriz(a, unitsizet8), pushPreCastle(e + r + 16, t, n) } function startCastleInside() { pushPreThing(Stone, 0, 88, 5, 3), pushPreThing(Stone, 0, 48, 3, DtB(48, 8)), pushPreThing(Stone, 24, 40, 1, DtB(40, 8)), pushPreThing(Stone, 32, 32, 1, DtB(32, 8)) } function endCastleInside(e, t, n) { var x = pushPreThing(FuncCollider, e + 104, 48, CastleAxeFalls, [16, 24]).object.axe = pushPreThing(CastleAxe, e + 104, 40).object; x.bridge = pushPreThing(CastleBridge, e, 24, 13).object, x.chain = pushPreThing(CastleChain, e + 96.5, 32).object, x.bowser = pushPreThing(Bowser, e + 69, 42, n).object, pushPreThing(ScrollBlocker, e + 112, ceilmax), pushPreThing(Stone, e, 88, 32), fillPreWater(e, 0, 26), pushPreFloor(e + 104, 32, 3), pushPreFloor(e + 104, 0, 19), pushPreThing(Stone, e + 112, 80, 2, 3), pushPreThing(ScrollBlocker, e + 256, ceilmax), endCastleInsideFinal(e, t) } function endCastleInsideFinal(e, t) { var n = pushPreFuncCollider(e + 180, collideCastleNPC).object, x = { visibility: "hidden" }; t ? (pushPreThing(Peach, e + 194, 13).object, n.text = [pushPreText({ innerHTML: "THANK YOU " + window.player.title.toUpperCase() + "!", style: x }, e + 160, 66).object, pushPreText({ innerHTML: "YOUR QUEST IS OVER.
WE PRESENT YOU A NEW QUEST.
", style: x }, e + 148, 50).object, pushPreText({ innerHTML: "PRESS BUTTON B
TO SELECT A WORLD.
", style: x }, e + 148, 26).object]) : (pushPreThing(Toad, e + 194, 12).object, n.text = [pushPreText({ innerHTML: "THANK YOU " + window.player.title.toUpperCase() + "!", style: x }, e + 160, 66).object, pushPreText({ innerHTML: "BUT OUR PRINCESS IS IN
ANOTHER CASTLE!
", style: x }, e + 148, 50).object]) } function pushPreSectionPass(e, t, n, x, r) { var i = pushPreThing(Collider, e, t, [n, x], [sectionPass, sectionColliderInit]).object, a = (r = map.area.sections.current || 0, map.area.sections[r]); a.numpass ? ++a.numpass : a.numpass = 1, a.colliders ? a.colliders.push(i) : a.colliders = [i] } function pushPreSectionFail(e, t, n, x, r) { var i = pushPreThing(Collider, e, t, [n, x], [sectionFail, sectionColliderInit]).object, a = (r = map.area.sections.current || 0, map.area.sections[r]); a.colliders ? a.colliders.push(i) : a.colliders = [i] } function pushCastleDecider(e, t) { pushPreThing(castleDecider, e, ceilmax, e, t) } function sectionColliderInit(e) { e.sections = map.area.sections, e.parent = e.sections[e.sections.current], e.movement = !1 } function sectionPass(e, t) { if ("player" != e.type) return !1; t.nocollide = !0, --t.parent.numpass || activateSection(t.parent, !0) } function sectionFail(e, t) { if ("player" != e.type) return !1; t.nocollide = !0, activateSection(t.parent, !1) } function activateSection(e, t) { for (var n = e.colliders, x = n.length - 1; x >= 0; --x) killNormal(n[x]); e.activated = !0, e.passed = t } function pushPreTree(e, t, n) { pushPreThing(TreeTop, e, t, n); var x = DtB(t); pushPreScenerySolid("TreeTrunk", e + 8, t - x - 8, n - 2, x / 8) } function pushPreShroom(e, t, n) { pushPreThing(ShroomTop, e, t, n); var x = DtB(t - 4); pushPreScenery("ShroomTrunk", e + 4 * n - 4, t - x - 8, 1, x / 8) } function pushPrePipe(e, t, n, x, r, i) { isFinite(n) || (n = gamescreen.height, t -= gamescreen.height); var a = pushPreThing(Pipe, e, t + n, n / 8, r), o = a.object; return x && (o.pirhana = pushPreThing(Pirhana, e + 4, t + n + 12).object), i && (map.locs[i].entrything = o, map.locs[i].xloc = e), a } function pushPreCastle(e, t, n) { e = e || 0, t = t || 0, n ? pushPreCastleBig(e, t) : pushPreCastleSmall(e, t) } function pushPreCastleBig(e, t) { var n, x; for (pushPreCastleSmall(e + 16, t + 48), n = 0; n < 3; ++n) for (x = 0; x < 2; ++x) pushPreScenerySolid("BrickPlain", e + 16 + 16 * n, t + 24 + 8 * x); for (n = 0; n < 2; ++n) pushPreScenerySolid("CastleDoor", e + 24 + 16 * n, t + 24); for (n = 0; n < 5; ++n) { if (2 == n) continue; pushPreScenerySolid("BrickHalf", e + 16 + 8 * n, t + 48) } for (n = 0; n < 2; ++n) pushPreScenerySolid("CastleRailing", e + 8 * n, t + 44); for (n = 0; n < 5; ++n) pushPreScenerySolid("CastleRailingFilled", e + 16 + 8 * n, t + 44); for (n = 5; n < 7; ++n) pushPreScenerySolid("CastleRailing", e + 16 + 8 * n, t + 44); for (n = 0; n < 2; ++n) for (x = 0; x < 3; ++x) pushPreScenerySolid("BrickPlain", e + 24 + 16 * n, t + 8 * x); for (n = 0; n < 3; ++n) pushPreScenerySolid("CastleDoor", e + 16 + 16 * n, t); for (n = 0; n < 2; ++n) { for (x = 0; x < 5; ++x) pushPreScenerySolid("BrickPlain", e + 8 * n, t + 8 * x); pushPreScenerySolid("BrickHalf", e + 8 * n, t + 40) } for (n = 0; n < 2; ++n) { for (x = 0; x < 5; ++x) pushPreScenerySolid("BrickPlain", e + 56 + 8 * n, t + 8 * x); pushPreScenerySolid("BrickHalf", e + 56 + 8 * n, t + 40) } for (n = 0; n < 3; ++n) for (x = 0; x < 2; ++x) pushPreScenerySolid("BrickHalf", e + 16 + 16 * n, t + 20 + 20 * x) } function pushPreCastleSmall(e, t) { var n, x; for (n = 0; n < 3; ++n) pushPreScenerySolid("CastleRailing", e + 8 + 8 * n, t + 36); for (n = 0; n < 2; ++n) pushPreScenerySolid("CastleTop", e + 8 + 12 * n, t + 24); for (pushPreScenerySolid("CastleRailing", e, t + 20), n = 1; n <= 3; ++n) pushPreScenerySolid("CastleRailingFilled", e + 8 * n, t + 20); for (pushPreScenerySolid("CastleRailing", e + 32, t + 20), n = 0; n < 2; ++n) for (pushPreScenerySolid("BrickHalf", e + 8 * n, t), x = 0; x < 2; ++x) pushPreScenerySolid("BrickPlain", e + 8 * n, t + 4 + 8 * x); for (n = 0; n < 2; ++n) for (pushPreScenerySolid("BrickHalf", e + 24 + 8 * n, t), x = 0; x < 2; ++x) pushPreScenerySolid("BrickPlain", e + 24 + 8 * n, t + 4 + 8 * x); pushPreScenerySolid("CastleDoor", e + 16, t) } function pushPreFuncCollider(e, t) { return e instanceof Array ? (console.log("position", e), pushPreThing(FuncCollider, e[0], e[1], t, [e[2], e[3]])) : pushPreThing(FuncCollider, e, ceilmax + 40, t) } function pushPreFuncSpawner(e, t) { return pushPreThing(FuncSpawner, e, jumplev1, t) } function zoneEnableLakitu() { map.zone_lakitu = !0, enterLakitu() } function zoneDisableLakitu() { if (map.has_lakitu) { var e = map.has_lakitu; map.zone_lakitu = map.has_lakitu = !1, e.lookleft || (e.lookleft = !0, removeClass(e, "flipped")), e.movement = function(e) { e.xvel = max(e.xvel - unitsized32, -1 * unitsize) } } } function zoneStartCheeps(e) { pushPreFuncCollider(e, zoneEnableCheeps) } function zoneStopCheeps(e) { pushPreFuncCollider(e, zoneDisableCheeps) } function zoneEnableCheeps(e) { !map.zone_cheeps && e.player && startCheepSpawn() } function zoneDisableCheeps(e) { e.player && (map.zone_cheeps = !1) } function pushPrePattern(e, t, n, x) { var r, i, a, o = t, l = Scenery.patterns[e]; for (i = 0; i < x; ++i) { for (a in l)(r = l[a]) instanceof Array && pushPreScenery(r[0], o + r[1], n + r[2], r[3], r[4]); o += l.width } } function DtB(e, t) { return (e + botmax) / (t || 1) } function BlankMap(e) { e.locs = [new Location(0, entryBlank)], e.areas = [new Area("Overworld", (function() { setTimeout(refillCanvas, timer + 2) }))] } function World11(e) { e.locs = [new Location(0, !0), new Location(0, exitPipeVert), new Location(1)], e.areas = [new Area("Overworld", (function() { setLocationGeneration(0); pushPreText("

super

MARIO BROS.

©1985 NINTENDO

Move: Arrows/WASD
Fire/Sprint: Shift/CTRL
Pause/Mute: P/M

", 20, 91), pushPrePattern("backreg", 0, 0, 5), pushPreFloor(0, 0, 69), pushPreThing(Block, 128, jumplev1), pushPreThing(Brick, 160, jumplev1), pushPreThing(Block, 168, jumplev1, Mushroom), pushPreThing(Goomba, 176, 8), pushPreThing(Brick, 176, jumplev1), pushPreThing(Block, 176, jumplev2), pushPreThing(Block, 184, jumplev1), pushPreThing(Brick, 192, jumplev1), pushPrePipe(224, 0, 16, !1), pushPrePipe(304, 0, 24), pushPrePipe(368, 0, 32), pushPreThing(Goomba, 340, 8), pushPrePipe(368, 0, 32), pushPreThing(Goomba, 412, 8), pushPreThing(Goomba, 422, 8), pushPrePipe(456, 0, 32, !1, 2), pushPreThing(Block, 512, 40, [Mushroom, 1], !0), pushPreFloor(568, 0, 15), pushPreThing(Brick, 618, jumplev1), pushPreThing(Block, 626, jumplev1, Mushroom), pushPreThing(Brick, 634, jumplev1), pushPreThing(Brick, 640, jumplev2), pushPreThing(Goomba, 640, jumplev2 + 8), pushPreThing(Brick, 648, jumplev2), pushPreThing(Brick, 656, jumplev2), pushPreThing(Goomba, 656, jumplev2 + 8), pushPreThing(Brick, 664, jumplev2), pushPreThing(Brick, 672, jumplev2), pushPreThing(Brick, 680, jumplev2), pushPreThing(Brick, 688, jumplev2), pushPreThing(Brick, 696, jumplev2), pushPreFloor(712, 0, 64), pushPreThing(Brick, 728, jumplev2), pushPreThing(Brick, 736, jumplev2), pushPreThing(Brick, 744, jumplev2), pushPreThing(Brick, 752, jumplev1, Coin), pushPreThing(Block, 752, jumplev2), pushPreThing(Goomba, 776, 8), pushPreThing(Goomba, 788, 8), pushPreThing(Brick, 800, jumplev1), pushPreThing(Brick, 808, jumplev1, Star), pushPreThing(Block, 848, jumplev1), pushPreThing(Koopa, 856, 12), pushPreThing(Block, 872, jumplev1), pushPreThing(Block, 872, jumplev2, Mushroom), pushPreThing(Block, 896, jumplev1), pushPreThing(Goomba, 912, 8), pushPreThing(Goomba, 924, 8), pushPreThing(Brick, 944, jumplev1), pushPreThing(Brick, 968, jumplev2), pushPreThing(Brick, 976, jumplev2), pushPreThing(Brick, 984, jumplev2), pushPreThing(Goomba, 992, 8), pushPreThing(Goomba, 1004, 8), pushPreThing(Goomba, 1024, 8), pushPreThing(Goomba, 1036, 8), pushPreThing(Brick, 1024, jumplev2), pushPreThing(Brick, 1032, jumplev1), pushPreThing(Block, 1032, jumplev2), pushPreThing(Brick, 1040, jumplev1), pushPreThing(Block, 1040, jumplev2), pushPreThing(Brick, 1048, jumplev2), pushPreThing(Stone, 1072, 8), pushPreThing(Stone, 1080, 16, 1, 2), pushPreThing(Stone, 1088, 24, 1, 3), pushPreThing(Stone, 1096, 32, 1, 4), pushPreThing(Stone, 1120, 32, 1, 4), pushPreThing(Stone, 1128, 24, 1, 3), pushPreThing(Stone, 1136, 16, 1, 2), pushPreThing(Stone, 1144, 8), pushPreThing(Stone, 1184, 8), pushPreThing(Stone, 1192, 16, 1, 2), pushPreThing(Stone, 1200, 24, 1, 3), pushPreThing(Stone, 1208, 32, 1, 4), pushPreThing(Stone, 1216, 32, 1, 4), pushPreFloor(1240, 0, 69), pushPreThing(Stone, 1240, 32, 1, 4), pushPreThing(Stone, 1248, 24, 1, 3), pushPreThing(Stone, 1256, 16, 1, 2), pushPreThing(Stone, 1264, 8, 1, 1), pushPrePipe(1304, 0, 16, !1, !1, 1), pushPreThing(Brick, 1344, jumplev1), pushPreThing(Brick, 1352, jumplev1), pushPreThing(Block, 1360, jumplev1), pushPreThing(Brick, 1368, jumplev1), pushPreThing(Goomba, 1392, 8), pushPreThing(Goomba, 1404, 8), pushPrePipe(1432, 0, 16), pushPreThing(Stone, 1448, 8), pushPreThing(Stone, 1456, 16, 1, 2), pushPreThing(Stone, 1464, 24, 1, 3), pushPreThing(Stone, 1472, 32, 1, 4), pushPreThing(Stone, 1480, 40, 1, 5), pushPreThing(Stone, 1488, 48, 1, 6), pushPreThing(Stone, 1496, 56, 1, 7), pushPreThing(Stone, 1504, 64, 2, 8), endCastleOutside(1580, 0, 1) })), new Area("Underworld", (function() { setLocationGeneration(2), makeCeiling(32, 7), pushPreFloor(0, 0, 17), fillPreThing(Brick, 0, 8, 1, 11, 8, 8), fillPreThing(Brick, 32, 8, 7, 3, 8, 8), fillPreThing(Coin, 33, 31, 7, 2, 8, 16), fillPreThing(Coin, 41, 63, 5, 1, 8, 8), pushPreThing(PipeSide, 104, 16, 1), pushPreThing(PipeVertical, 120, 88, 88) }))] } function randMapType(e) { e.locs = [new Location(0, entryRandom)], e.areas = [new Area(e.areatype, (function() { setLocationGeneration(0), "Underwater" == e.randname && (goUnderWater(), pushPreScenery("Water", 0, ceilmax - 21, 8 * (e.startwidth + 1) / 3, 1), pushPreThing(WaterBlock, 0, ceilmax, 8 * (e.startwidth + 1))) }))], e.treefunc = randTrue(3) ? pushPreTree : pushPreShroom, e.treeheight = e.treelev = e.sincechange = 0 } function randDayNight() { return randTrue(3) ? "" : " Night" } function WorldRandomOverworld(e) { e.random = !0, e.randtype = pushRandomSectionOverworld, e.randname = "Overworld", e.areatype = "Overworld" + randDayNight(), e.firstRandomThings = function(e) { for (var t = 0; t < 10; ++t) randTrue() && pushRandomGroundScenery(8 * t) }, e.startwidth = 14, e.onlysmartkoopas = !1, randMapType(e) } function WorldRandomTrees(e) { e.random = !0, e.randtype = pushRandomSectionTrees, e.randname = "Overworld", e.areatype = "Overworld" + randDayNight(), e.firstRandomThings = function(e) { e.treefunc(100, 8 * (e.treelev = randTrue() + 2), randTrue() + 4), e.startwidth += 7 }, e.startwidth = 11, e.onlysmartkoopas = randTrue(), randMapType(e) } function WorldRandomUnderworld(e) { e.random = !0, e.randtype = pushRandomSectionUnderworld, e.randname = e.areatype = "Underworld", e.firstRandomThings = function(e) { fillPreThing(Brick, 0, 8, 1, 11, 8, 8) }, e.startwidth = randTrue(3) + 7, e.onlysmartkoopas = !0, e.respawndist = 42, e.entrancetype = "Up", randMapType(e) } function WorldRandomUnderwater(e) { e.random = !0, e.randtype = pushRandomSectionUnderwater, e.randname = "Underwater", e.areatype = "Underwater" + randDayNight(), e.firstRandomThings = function(e) {}, e.startwidth = randTrue(3) + 7, e.entrancetype = "Up", e.countCheep = e.countBlooper = 0, e.respawndist = 42, e.onlysmartkoopas = !0, randMapType(e) } function WorldRandomBridge(e) { e.random = !0, e.randtype = startRandomSectionBridge, e.randname = "Overworld", e.areatype = "Overworld" + randDayNight(), e.firstRandomThings = function(e) {}, e.startwidth = 14, randMapType(e) } function WorldRandomSky(e) { e.random = !0, e.randtype = startRandomSectionSky, e.randname = "Sky", e.areatype = "Sky" + randDayNight(), e.entrancetype = "Vine", e.firstRandomThings = function(e) { pushPreThing(Stone, 0, 0, 4) }, e.startwidth = 4, e.nofloor = !0, randMapType(e) } function WorldRandomCastle(e) { e.random = !0, e.randtype = startRandomSectionCastle, e.randname = e.areatype = e.entrancetype = "Castle", e.firstRandomThings = function(e) { startCastleInside(), startCastle() }, e.respawndist = 35, randMapType(e) } function FullScreenMario() { var e = Date.now(); ensureLocalStorage(), TonedJS(!0), window.body = document.body, window.bodystyle = body.style, window.verbosity = { Maps: !1, Sounds: !1 }, window.requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame || function(e) { setTimeout(e, timer) }, window.cancelAnimationFrame = window.cancelAnimationFrame || window.webkitCancelRequestAnimationFrame || window.mozCancelRequestAnimationFrame || window.oCancelRequestAnimationFrame || window.msCancelRequestAnimationFrame || clearTimeout, window.Uint8ClampedArray = window.Uint8ClampedArray || window.Uint8Array || Array, resetMeasurements(), resetLibrary(), resetEvents(), resetCanvas(), resetMaps(), resetScenery(), resetTriggers(), resetSeed(), resetSounds(), window.luigi = localStorage && "true" == localStorage.luigi, window.gameon = !0, setMap(1, 1), log("It took " + (Date.now() - e) + " milliseconds to start.") } function ensureLocalStorage() { var e = !1; try { window.hasOwnProperty("localStorage") || (window.localStorage = { crappy: !0 }), window.localStorage && (e = !0) } catch (t) { e = !1 } if (!e) throw document.body.innerText = "It seems your browser does not allow localStorage!" } function resetMeasurements() { resetUnitsize(4), resetTimer(1e3 / 60), window.jumplev1 = 32, window.jumplev2 = 64, window.ceillev = 88, window.ceilmax = 104, window.castlev = -48, window.paused = !0, resetGameScreen(), window.parentwindow || (window.parentwindow = !1) } function resetUnitsize(e) { window.unitsize = e; for (var t = 2; t <= 64; ++t) window["unitsizet" + t] = unitsize * t, window["unitsized" + t] = unitsize / t; window.scale = unitsized2, window.gravity = round(12 * unitsize) / 100 } function resetTimer(e) { e = roundDigit(e, .001), window.timer = window.timernorm = e, window.timert2 = 2 * e, window.timerd2 = e / 2, window.fps = window.fps_target = roundDigit(1e3 / e, .001), window.time_prev = Date.now() } function resetGameScreen() { window.gamescreen = new getGameScreen } function getGameScreen() { resetGameScreenPosition(this), this.middlex = (this.left + this.right) / 2, window.botmax = this.height - ceilmax, botmax < unitsize && (body.innerHTML = "

Your screen isn't high enough. Make it taller, then refresh.
"), this.deathheight = this.bottom + 48 } function resetGameScreenPosition(e) { (e = e || window.gamescreen).left = e.top = 0, e.bottom = innerHeight, e.right = innerWidth, e.height = innerHeight / unitsize, e.width = innerWidth / unitsize, e.unitheight = innerHeight, e.unitwidth = innerWidth } function resetEvents() { window.TimeHandler = new TimeHandlr({ onSpriteCycleStart: "onadding", doSpriteCycleStart: "placed", cycleCheckValidity: "alive", timingDefault: 9 }) } function resetSounds() { window.sounds = {}, window.theme = !1, window.muted = localStorage && "true" == localStorage.muted, window.AudioPlayer = new AudioPlayr({ directory: "Sounds", getVolumeLocal: function() { return .49 }, getThemeDefault: function() { return area.theme }, library: { Sounds: ["Bowser Falls", "Bowser Fires", "Break Block", "Bump", "Coin", "Ending", "Fireball", "Firework", "Flagpole", "Gain Life", "Game Over 2", "Game Over", "Hurry", "Into the Tunnel", "Jump Small", "Jump Super", "Kick", "Level Complete", "Player Dies", "Pause", "Pipe", "Power Down", "Powerup Appears", "Powerup", "Stage Clear", "Vine Emerging", "World Clear", "You Dead"], Themes: ["Castle", "Overworld", "Underwater", "Underworld", "Star", "Sky", "Hurry Castle", "Hurry Overworld", "Hurry Underwater", "Hurry Underworld", "Hurry Star", "Hurry Sky"] } }) } function resetQuadrants() { window.QuadsKeeper = new QuadsKeepr({ num_rows: 5, num_cols: 6, screen_width: window.innerWidth, screen_height: window.innerHeight, tolerance: unitsized2, onUpdate: spawnMap, onCollide: !1 }) } function resetGameState(e) { clearAllTimeouts(), resetData(), window.nokeys = window.spawning = window.spawnon = window.notime = window.editing = window.qcount = window.lastscroll = 0, window.paused = window.gameon = window.speed = 1, e || (window.gamecount = 0), resetQuadrants(), window.gamehistory = [], AudioPlayer.pause() } function scrollWindow(e, t) { var n = -(e = e || 0), x = -(t = t || 0); gamescreen.left += e, gamescreen.right += e, gamescreen.top += t, gamescreen.bottom += t, shiftAll(characters, n, x), shiftAll(solids, n, x), shiftAll(scenery, n, x), shiftAll(QuadsKeeper.getQuadrants(), n, x), shiftElements(texts, n, x), QuadsKeeper.updateQuadrants(n), window.playediting && scrollEditor(e, t) } function shiftAll(e, t, n) { for (var x = e.length - 1; x >= 0; --x) shiftBoth(e[x], t, n) } function shiftElements(e, t, n) { for (var x, r = e.length - 1; r >= 0; --r) x = e[r], elementShiftLeft(x, t), elementShiftTop(x, n) } function scrollPlayer(e, t, n) { var x = player.left, r = player.top; scrollWindow(e, t = t || 0), setLeft(player, x, n), setTop(player, r + t * unitsize, n), QuadsKeeper.updateQuadrants() } function mlog(e) { verbosity[e] && log.apply(console, arguments) } function resetCanvas() { window.canvas = getCanvas(innerWidth, innerHeight, !0), window.context = canvas.getContext("2d"), body.appendChild(canvas) } function spriteUnravel(e) { for (var t, n, x, r = getPaletteReferenceStarting(window.palette), i = window.digitsize, a = e.length, o = "", l = 0; l < a;) switch (e[l]) { case "x": for (x = e.indexOf(",", ++l), t = makeDigit(r[e.slice(l, l += i)], window.digitsize), n = Number(e.slice(l, x)); n--;) o += t; l = x + 1; break; case "p": "[" == e[++l] ? (x = e.indexOf("]"), r = getPaletteReference(e.slice(l + 1, x).split(",")), l = x + 1, i = 1) : (r = getPaletteReference(window.palette), i = window.digitsize); break; default: o += makeDigit(r[e.slice(l, l += i)], window.digitsize) } return o } function spriteExpand(e) { for (var t, n, x = "", r = e.length, i = 0; i < r;) for (t = e.slice(i, i += digitsize), n = 0; n < scale; ++n) x += t; return x } function spriteGetArray(e) { var t, n, x, r, i = e.length / digitsize, a = e.match(new RegExp(".{1," + digitsize + "}", "g")), o = new Uint8ClampedArray(4 * i); for (n = 0, x = 0; n < i; ++n) { for (t = palette[Number(a[n])], r = 0; r < 4; ++r) o[x + r] = t[r]; x += 4 } return o } function setThingSprite(e) { if (!e.hidden && e.title) { var t, n = library.cache, x = e.spritewidth, r = e.spriteheight; n[e.title + " " + e.className.split(/\s+/g).slice(1).sort()]; (t = getSpriteFromLibrary(e)) ? t.multiple ? (expandObtainedSpriteMultiple(t, e, x, r), e.sprite_type = t.type) : (expandObtainedSprite(t, e, x, r), e.sprite_type = "normal"): log("Could not get sprite from library on " + e.title) } } function getSpriteFromLibrary(e) { var t, n, x, r, i = library.cache, a = e.title, o = e.libtype, l = e.className.split(/\s+/g).slice(1).sort(), s = (map.area || window.defaultsetting).setting.split(" "); for (r in s) l.unshift(s[r]); if (n = i[t = a + " " + l]) x = n.raw; else { if (!(x = library.sprites[o][a]) || !x.constructor) return console.log("Error in checking for sprite of " + a + "."), void console.log("Title " + a, "\nLibtype " + o, "\n", e, "\n"); x.constructor != Uint8ClampedArray && (x = findSpriteInLibrary(e, x, l)), n = i[t] = { raw: x } } switch (String(Number(l.indexOf("flipped") >= 0)) + String(Number(l.indexOf("flip-vert") >= 0))) { case "11": x = n.flipboth ? n.flipboth : n.flipboth = flipSpriteArrayBoth(x); break; case "10": x = n.fliphoriz ? n.fliphoriz : n.fliphoriz = flipSpriteArrayHoriz(x, e); break; case "01": x = n.flipvert ? n.flipvert : n.flipvert = flipSpriteArrayVert(x, e); break; default: x = n.raw } return x } function expandObtainedSprite(e, t, n, x, r) { var i, a, o = new Uint8ClampedArray(e.length * scale), l = n * unitsizet4, s = x * scale, d = 0, u = 0; for (i = 0; i < s; ++i) { for (a = 0; a < scale; ++a) memcpyU8(e, o, d, u, l), u += l; d += l } return r || (t.num_sprites = 1, t.sprite = o, refillThingCanvas(t)), o } function expandObtainedSpriteMultiple(e, t, n, x) { var r, i, a = {}; for (i in t.num_sprites = 0, e)(r = e[i]).constructor == Uint8ClampedArray ? (++t.num_sprites, a[i] = expandObtainedSprite(r, t, n, x, !0)) : a[i] = "number" == typeof r ? r * scale : r; t.sprite = a.middle, t.sprites = a, refillThingCanvases(t, a) } function findSpriteInLibrary(e, t, n) { var x, r, i, a = t; if (t.multiple) return t; for (var o = 0; x = !0;) { for (i in ++o > 49 && (alert(e.title), console.log(e.title, n, t)), n) if (r = t[n[i]]) { t = r, n.splice(i, 1), x = !1; break } if (x) if (r = t.normal) switch (x = !1, r.constructor) { case Uint8ClampedArray: case SpriteMultiple: return r; case Object: t = r; break; default: t = t[r] } else x = !0; if (x || !t) return console.log("\nSprite not found! Title: " + e.title), console.log("Classname:", e.className), console.log("Remaining", n), console.log("Current", t), console.log("Prev", a), new Uint8ClampedArray(e.spritewidth * e.spriteheight); switch (t.constructor) { case Uint8ClampedArray: case SpriteMultiple: return t; case "Object": continue } } } function refillThingCanvas(e) { var t = e.canvas, n = e.context, x = n.getImageData(0, 0, t.width, t.height); memcpyU8(e.sprite, x.data), n.putImageData(x, 0, 0) } function refillThingCanvases(e, t) { var n, x, r, i, a, o = e.canvases = {}, l = e.spritewidthpixels, s = e.spriteheightpixels; for (a in e.num_sprites = 1, t)(n = t[a]) instanceof Uint8ClampedArray ? (++e.num_sprites, o[a] = r = { canvas: getCanvas(l, s) }, r.context = i = r.canvas.getContext("2d"), memcpyU8(n, (x = i.getImageData(0, 0, l, s)).data), i.putImageData(x, 0, 0)) : o[a] = n; r = o.middle, e.canvas = r.canvas, e.context = r.context } function refillCanvas() { var e, t = window.canvas, n = window.context; for (n.fillStyle = area.fillStyle, n.fillRect(0, 0, t.width, t.height), e = scenery.length - 1; e >= 0; --e) drawThingOnCanvas(n, scenery[e]); for (e = solids.length - 1; e >= 0; --e) drawThingOnCanvas(n, solids[e]); for (e = characters.length - 1; e >= 0; --e) drawThingOnCanvas(n, characters[e]) } function drawThingOnCanvas(e, t) { if (!t.hidden) { var n = t.left, x = t.top; n > innerWidth || (1 == t.num_sprites ? drawThingOnCanvasSingle(e, t.canvas, t, n, x) : drawThingOnCanvasMultiple(e, t.canvases, t.canvas, t, n, x)) } } function drawThingOnCanvasSingle(e, t, n, x, r) { n.repeat ? drawPatternOnCanvas(e, t, x, r, n.unitwidth, n.unitheight) : e.drawImage(t, x, r) } function drawThingOnCanvasMultiple(e, t, n, x, r, i) { var a, o, l = i, s = r, d = x.right, u = x.bottom, p = x.unitwidth, c = x.unitheight, m = x.spritewidthpixels, h = x.spriteheightpixels; "v" == x.sprite_type[0] ? ((o = t.bottom) && (a = t.bottomheight || x.spriteheightpixels, drawPatternOnCanvas(e, o.canvas, s, u - a, m, min(c, h)), u -= a, c -= a), (o = t.top) && (a = t.topheight || x.spriteheightpixels, drawPatternOnCanvas(e, o.canvas, s, l, m, min(c, h)), l += a, c -= a)) : "h" == x.sprite_type[0] && ((o = t.left) && (a = t.leftwidth || x.spritewidthpixels, drawPatternOnCanvas(e, o.canvas, s, l, min(p, m), h), s += a, p -= a), (o = t.right) && (a = t.rightwidth || x.spritewidthpixels, drawPatternOnCanvas(e, o.canvas, d - a, l, min(p, m), h), d -= a, p -= a)), l < u && s < d && drawPatternOnCanvas(e, n, s, l, p, c) } function getPaletteReferenceStarting(e) { for (var t = {}, n = 0; n < e.length; ++n) t[makeDigit(n, digitsize)] = makeDigit(n, digitsize); return t } function getPaletteReference(e) { for (var t = {}, n = getDigitSize(e), x = 0; x < e.length; ++x) t[makeDigit(x, n)] = makeDigit(e[x], n); return t } function flipSpriteArrayHoriz(e, t) { var n, x, r, i, a, o = e.length, l = t.spritewidth, s = (t.spriteheight, new Uint8ClampedArray(o)), d = l * unitsizet4; for (r = 0; r < o; r += d) for (n = r, x = r + d - 4, i = 0; i < d; i += 4) { for (a = 0; a < 4; ++a) s[n + a] = e[x + a]; n += 4, x -= 4 } return s } function flipSpriteArrayVert(e, t) { for (var n, x, r = e.length, i = t.spritewidth, a = (t.spriteheight, new Uint8ClampedArray(r)), o = i * unitsizet4, l = 0, s = r - o; l < r;) { for (n = 0; n < o; n += 4) for (x = 0; x < 4; ++x) a[l + n + x] = e[s + n + x]; l += o, s -= o } return a } function flipSpriteArrayBoth(e) { for (var t, n = e.length, x = new Uint8ClampedArray(n), r = e.length - 4, i = 0; i < n;) { for (t = 0; t < 4; ++t) x[i + t] = e[r + t]; i += 4, r -= 4 } return x } function drawPatternOnCanvas(e, t, n, x, r, i) { e.translate(n, x), e.fillStyle = e.createPattern(t, "repeat"), e.fillRect(0, 0, r, i), e.translate(-n, -x) } function clearAllSprites(e) { var t, n, x = [window.solids, window.characters, window.scenery]; for (t in x) for (n in t = x[t]) setThingSprite(t[n]); e && (library.cache = {}) } function memcpyU8(e, t, n, x, r) { if (!(!e || !t || n < 0 || x < 0 || r <= 0 || n >= e.length || x >= t.length)) { null == n && (n = 0), null == x && (x = 0), null == r && (r = max(0, min(e.length, t.length))); for (var i = r + 0, a = x + 0, o = n + 0; i--;) t[a++] = e[o++] } } function canvasDisableSmoothing(e, t) { (t = t || e.getContext("2d")).webkitImageSmoothingEnabled = !1, t.mozImageSmoothingEnabled = !1, t.imageSmoothingEnabled = !1 } function Thing(e) { if (0 != arguments.length && e) { var t = this === window ? new Thing : this, n = t.args = arrayMake(arguments); n[0] = t, e.apply(t, n), t.alive = !0, t.placed = this.outerok = 0, t.xvel = this.xvel || 0, t.yvel = this.yvel || 0, null == t.tolx && (t.tolx = 0), null == t.toly && (t.toly = unitsized8), t.collide = t.collide || function() {}, t.death = t.death || killNormal, t.animate = t.animate || emergeUp; var x, r = 4; (x = floor(t.width * unitsize / QuadsKeeper.getQuadWidth())) > 0 && (r += (x + 1) * r / 2), (x = floor(t.height * unitsize / QuadsKeeper.getQuadHeight())) > 0 && (r += (x + 1) * r / 2), t.maxquads = r, t.quadrants = new Array(t.maxquads), t.overlaps = [], t.title = t.title || e.name, t.spritewidth = t.spritewidth || t.width, t.spriteheight = t.spriteheight || t.height, t.sprite = ""; try { setContextStuff(t, t.spritewidth, t.spriteheight) } catch (e) { log("Thing context fail", e, t.title, t), setTimeout((function() { setContextStuff(t, t.spritewidth, t.spriteheight) }), 1) } return t } } function setContextStuff(e, t, n) { e.spritewidthpixels = e.spritewidth * unitsize, e.spriteheightpixels = e.spriteheight * unitsize, e.canvas = getCanvas(e.spritewidthpixels, e.spriteheightpixels), e.context = e.canvas.getContext("2d"), e.imageData = e.context.getImageData(0, 0, e.spritewidthpixels, e.spriteheightpixels), e.sprite_type = e.sprite_type || "neither", canvasDisableSmoothing(e, e.context) } function ThingCreate(e, t) { var n = new Thing; return Thing.apply(n, [e].concat(t)), n } function setCharacter(e, t) { e.type = t.split(" ")[0], e.resting = e.under = e.undermid = !1, e.alive = e.character = !0, e.libtype = "characters", setClassInitial(e, "character " + t) } function setSolid(e, t) { e.type = "solid", e.name = t, e.solid = e.alive = !0, e.speed = e.speed || 0, e.collide = e.collide || characterTouchedSolid, e.bottomBump = e.bottomBump || function() {}, e.action = e.action || function() {}, e.jump = e.jump || function() {}, e.spritewidth = e.spritewidth || 8, e.spriteheight = e.spriteheight || 8, e.libtype = "solids", setClassInitial(e, "solid " + t) } function setScenery(e, t) { setSolid(e, t), e.libtype = "scenery" } function addThing(e, t, n) { return e instanceof Function && (e = new Thing(e)), placeThing(e, t, n), window[e.libtype].push(e), e.placed = !0, e.onadding && e.onadding(), setThingSprite(e), window["last_" + (e.title || e.group || "unknown")] = e, e } function placeThing(e, t, n) { return setLeft(e, t), setTop(e, n), updateSize(e), e } function addText(e, t, n) { var x = createElement("div", { innerHTML: e, className: "text", left: t, top: n, onclick: body.onclick || canvas.onclick, style: { marginLeft: t + "px", marginTop: n + "px" } }); return body.appendChild(x), texts.push(x), x } function spawnText(e, t) { var n = e.element = addText("", e.left, e.top); "object" == typeof t ? proliferate(n, t) : n.innerHTML = t, e.movement = !1 } function checkTexts() { var e, t, n, x = QuadsKeeper.getDelX(); for (n = texts.length - 1; n >= 0; --n) t = texts[n], e = texts[n].element || t, t.right = t.left + e.clientWidth, t.right < x && (body.removeChild(e), killNormal(t), deleteThing(e, texts, n)) } function Mushroom(e, t) { e.group = "item", e.width = e.height = 8, e.speed = .42 * unitsize, e.animate = emergeUp, e.movement = moveSimple, e.collide = collideFriendly, e.jump = mushroomJump, e.death = killNormal, e.nofire = !0; var n = "mushroom"; switch (t) { case 1: e.action = gainLife, n += " gainlife"; break; case -1: e.action = killPlayer, n += " death"; break; default: e.action = playerShroom, n += " regular" } setCharacter(e, n) } function mushroomJump(e) { e.yvel -= 1.4 * unitsize, e.top -= unitsize, e.bottom -= unitsize, updatePosition(e) } function FireFlower(e) { e.group = "item", e.width = e.height = 8, e.animate = emergeUp, e.collide = collideFriendly, e.action = playerShroom, e.nofall = e.nofire = !0, e.movement = !1, setCharacter(e, "fireflower"), TimeHandler.addSpriteCycle(e, ["one", "two", "three", "four"]) } function FireBall(e, t) { e.group = "item", e.width = e.height = 4, e.speed = 1.75 * unitsize, e.gravity = 1.56 * gravity, e.jumpheight = 1.56 * unitsize, e.nofire = e.nostar = e.collide_primary = !0, e.moveleft = t, e.animate = emergeFire, e.movement = moveJumping, e.collide = fireEnemy, e.death = fireExplodes, setCharacter(e, "fireball"), TimeHandler.addSpriteCycle(e, ["one", "two", "three", "four"], 4) } function fireEnemy(e, t) { if (!(!t.alive || t.emerging || e.height <= unitsize)) { if (e.nofire) return e.nofire > 1 ? t.death(t) : void 0; e.solid ? AudioPlayer.playLocal("Bump", t.right) : (AudioPlayer.playLocal("Kick", t.right), e.death(e, 2), scoreEnemyFire(e)), t.death(t) } } function fireDeleted() { --player.numballs } function fireExplodes(e) { var t = new Thing(Firework); addThing(t, e.left - t.width / 2, e.top - t.height / 2), t.animate(), killNormal(e) } function Star(e) { e.group = "item", e.width = 7, e.height = 8, e.speed = .56 * unitsize, e.jumpheight = 1.17 * unitsize, e.gravity = gravity / 2.8, e.animate = emergeUp, e.movement = moveJumping, e.collide = collideFriendly, e.action = playerStar, e.death = killNormal, e.nofire = !0, setCharacter(e, "star item"), TimeHandler.addSpriteCycle(e, ["one", "two", "three", "four"], 0, 7) } function Shell(e, t) { e.width = 8, e.height = 7, e.group = "item", e.speed = unitsizet2, e.collide_primary = !0, e.moveleft = e.xvel = e.move = e.hitcount = e.peeking = e.counting = e.landing = e.enemyhitcount = 0, e.smart = t, e.movement = moveShell, e.collide = hitShell, e.death = killFlip, e.spawntype = Koopa, setCharacter(e, "shell" + (t ? " smart" : " dumb")) } function hitShell(e, t) { if ("shell" == e.type && t.type != e.type) return hitShell(t, e); switch (e.type) { case "solid": t.right < e.right ? (AudioPlayer.playLocal("Bump", e.left), setRight(t, e.left), t.xvel = -t.speed, t.moveleft = !0) : (AudioPlayer.playLocal("Bump", e.right), setLeft(t, e.right), t.xvel = t.speed, t.moveleft = !1); break; case "player": var n = objectToLeft(t, e), x = e.yvel > 0 && e.bottom <= t.top + unitsizet2; if (e.star) return scorePlayerShell(e, t), t.death(t, 2); if (t.landing) return void(t.shelltoleft == n ? (++t.landing, 1 == t.landing && scorePlayerShell(e, t), TimeHandler.addEvent((function(e) { --e.landing }), 2, t)) : player.death(player)); 0 == t.xvel || x ? (t.counting = 0, scorePlayerShell(e, t), t.peeking && (t.peeking = !1, removeClass(t, "peeking"), t.height -= unitsized8, updateSize(t)), 0 == t.xvel ? (n ? (t.moveleft = !0, t.xvel = -t.speed) : (t.moveleft = !1, t.xvel = t.speed), ++t.hitcount, TimeHandler.addEvent((function(e) { --e.hitcount }), 2, t)) : t.xvel = 0, x && (AudioPlayer.play("Kick"), t.xvel ? scorePlayerShell(e, t) : (jumpEnemy(e, t), e.yvel *= 2, scorePlayerShell(e, t), setBottom(e, t.top - unitsize, !0)), ++t.landing, t.shelltoleft = n, TimeHandler.addEvent((function(e) { --e.landing }), 2, t))) : !t.hitcount && (n && t.xvel < 0 || !n && t.xvel > 0) && e.death(e); break; case "shell": if (0 != e.xvel) if (0 != t.xvel) { var r = e.xvel; shiftHoriz(e, e.xvel = t.xvel), shiftHoriz(t, t.xvel = r) } else score(t, 500), t.death(t); else 0 != t.xvel && (score(e, 500), e.death(e)); break; default: switch (e.group) { case "enemy": if (t.xvel) { if ("koopa" == e.type.split(" ")[0]) { var i = new Thing(Shell, e.smart); addThing(i, e.left, e.bottom - i.height * unitsize), killFlip(i), killNormal(e) } else killFlip(e); AudioPlayer.play("Kick"), score(e, findScore(t.enemyhitcount), !0), ++t.enemyhitcount } else e.moveleft = objectToLeft(e, t); break; case "item": if ("shell" != e.type) return; t.xvel && killFlip(e), e.xvel && killFlip(t) } } } function moveShell(e) { if (0 == e.xvel) if (350 == ++e.counting) addClass(e, "peeking"), e.peeking = !0, e.height += unitsized8, updateSize(e); else if (490 == e.counting) { var t = new Thing(e.spawntype, e.smart); addThing(t, e.left, e.bottom - t.height * unitsize), killNormal(e) } } function collideFriendly(e, t) { "player" == e.type && (t.action && t.action(e), t.death(t)) } function jumpEnemy(e, t) { e.keys.up ? e.yvel = -1.4 * unitsize : e.yvel = -.7 * unitsize, e.xvel *= .91, AudioPlayer.play("Kick"), "item" == t.group && "shell" != t.type || score(t, findScore(e.jumpcount++ + e.jumpers), !0), ++e.jumpers, TimeHandler.addEvent((function(e) { --e.jumpers }), 1, e) } function Goomba(e) { e.width = e.height = 8, e.speed = .21 * unitsize, e.toly = unitsize, e.moveleft = e.noflip = !0, e.smart = !1, e.group = "enemy", e.movement = moveSimple, e.collide = collideEnemy, e.death = killGoomba, setCharacter(e, "goomba"), TimeHandler.addSpriteCycleSynched(e, [unflipHoriz, flipHoriz]) } function killGoomba(e, t) { if (e.alive) if (t) killFlip(e); else { var n = new Thing(DeadGoomba); addThing(n, e.left, e.bottom - n.height * unitsize), TimeHandler.addEvent(killNormal, 21, n), killNormal(e) } } function DeadGoomba(e) { e.width = 8, e.height = 4, e.movement = !1, e.nocollide = e.nocollide = !0, e.death = killNormal, setSolid(e, "deadGoomba") } function Koopa(e, t, n) { e.width = 8, e.height = 12, e.speed = e.xvel = .21 * unitsize, e.moveleft = e.skipoverlaps = !0, e.group = "enemy", e.smart = t; var x = "koopa"; x += e.smart ? " smart" : " dumb", e.smart && (x += " smart"), n ? (x += " flying", e.winged = !0, 1 == n ? (e.movement = moveJumping, e.jumpheight = 1.17 * unitsize, e.gravity = gravity / 2.8) : (e.movement = moveFloating, e.ytop = e.begin = n[0] * unitsize, e.ybot = e.end = n[1] * unitsize, e.nofall = e.fly = !0, e.changing = e.xvel = 0, e.yvel = e.maxvel = unitsized4)) : (x += " regular", e.smart ? e.movement = moveSmart : e.movement = moveSimple), e.collide = collideEnemy, e.death = killKoopa, setCharacter(e, x), TimeHandler.addSpriteCycleSynched(e, ["one", "two"]), e.toly = unitsizet2 } function killKoopa(e, t) { if (e.alive) { var n; if (n = t && 2 != t || e.winged ? new Thing(Koopa, e.smart) : new Thing(Shell, e.smart), TimeHandler.addEvent((function(e, t) { addThing(e, t.left, t.bottom - e.height * unitsize), e.moveleft = t.moveleft }), 0, n, e), killNormal(e), 2 != t) return n; killFlip(n) } } function Pirhana(e, t) { e.width = 8, e.height = 12, e.counter = 0, e.countermax = e.height * unitsize, e.dir = unitsized8, e.toly = unitsizet8, e.nofall = e.deadly = e.nocollidesolid = e.repeat = !0, e.group = "enemy", e.collide = collideEnemy, e.death = killNormal, e.movement = movePirhanaInit, e.death = killPirhana, setCharacter(e, "pirhana") } function movePirhanaInit(e) { e.hidden = !0; var t = e.visual_scenery = new Thing(Sprite, "Pirhana"); addThing(t, e.left, e.top), TimeHandler.addSpriteCycle(t, ["one", "two"]), e.movement = movePirhanaNew, movePirhanaNew(e, e.height * unitsize) } function movePirhanaNew(e, t) { t = t || e.dir, e.counter += t, shiftVert(e, t), shiftVert(e.visual_scenery, t), (e.counter <= 0 || e.counter >= e.countermax) && (e.movement = !1, e.dir *= -1, TimeHandler.addEvent(movePirhanaRestart, 35, e)) } function movePirhanaRestart(e) { var t = getMidX(player); e.counter >= e.countermax && t > e.left - unitsizet8 && t < e.right + unitsizet8 ? setTimeout(movePirhanaRestart, 7, e) : e.movement = movePirhanaNew } function killPirhana(e) { (e || (e = this)) && (killNormal(e), killNormal(e.visual_scenery)) } function playerAboveEnemy(e, t) { return e.bottom < t.top + t.toly } function collideEnemy(e, t) { if (characterIsAlive(e) && characterIsAlive(t) && !(e.nocollidechar && !t.player || t.nocollidechar && !e.player)) { if ("item" == e.group) return e.collide_primary ? e.collide(t, e) : void 0; if (!map.underwater && e.player && (e.star && !t.nostar || !t.deadly && objectOnTop(e, t))) { if (playerAboveEnemy(e, t)) return; e.player && !e.star ? TimeHandler.addEvent((function(e, t) { jumpEnemy(e, t) }), 0, e, t) : t.nocollide = !0; t.death(t, 2 * e.star); e.star ? scoreEnemyStar(t) : (scoreEnemyStomp(t), setBottom(e, min(e.bottom, t.top + unitsize))), addClass(e, "hopping"), removeClasses(e, "running skidding jumping one two three"), e.hopping = !0, 1 == player.power && setPlayerSizeSmall(e) } else e.player ? playerAboveEnemy(e, t) || e.death(e) : t.moveleft = !(e.moveleft = objectToLeft(e, t)) } } function Podoboo(e, t) { e.width = 7, e.height = 8, e.deadly = e.nofall = e.nocollidesolid = e.nofire = !0, e.gravity = map.gravity / 2.1, e.jumpheight = (t || 64) * unitsize, e.speed = -map.maxyvel, e.movement = movePodobooInit, e.collide = collideEnemy, e.betweentime = 70, setCharacter(e, "podoboo") } function movePodobooInit(e) { characterIsAlive(e) && (e.hidden = !0, e.heightnorm = e.top, e.heightfall = e.top - e.jumpheight, TimeHandler.addEvent(podobooJump, e.betweentime, e), e.movement = !1) } function podobooJump(e) { characterIsAlive(e) && (unflipVert(e), e.yvel = e.speed + e.gravity, e.movement = movePodobooUp, e.hidden = !1, setThingSprite(e)) } function movePodobooUp(e) { shiftVert(e, e.speed, !0), e.top - gamescreen.top > e.heightfall || (e.nofall = !1, e.movement = movePodobooSwitch) } function movePodobooSwitch(e) { e.yvel <= 0 || (flipVert(e), e.movement = movePodobooDown) } function movePodobooDown(e) { e.top < e.heightnorm || (setTop(e, e.heightnorm, !0), e.movement = !1, e.nofall = e.hidden = !0, e.heightfall = e.top - e.jumpheight, TimeHandler.addEvent(podobooJump, e.betweentime, e)) } function HammerBro(e) { e.width = 8, e.height = 12, e.group = "enemy", e.collide = collideEnemy, e.statex = e.counter = e.statey = e.counterx = e.countery = e.level = e.throwcount = 0, e.death = killFlip, e.movement = moveHammerBro, setCharacter(e, "hammerbro"), e.gravity = gravity / 2, TimeHandler.addSpriteCycle(e, ["one", "two"]), TimeHandler.addEvent(throwHammer, 35, e, 7), TimeHandler.addEventInterval(jumpHammerBro, 140, 1 / 0, e) } function moveHammerBro(e) { e.xvel = Math.sin(Math.PI * (e.counter += .007)) / 2.1, lookTowardPlayer(e), e.nocollidesolid = e.yvel < 0 || e.falling } function throwHammer(e, t) { !characterIsAlive(e) || e.nothrow || e.right < -unitsizet32 || (3 != t && switchClass(e, "thrown", "throwing"), TimeHandler.addEvent((function(e) { if (3 != t) { if (!characterIsAlive(e)) return; switchClass(e, "throwing", "thrown"), addThing(new Thing(Hammer, e.lookleft), e.left - unitsizet2, e.top - unitsizet2) } t > 0 ? TimeHandler.addEvent(throwHammer, 7, e, --t) : (TimeHandler.addEvent(throwHammer, 70, e, 7), removeClass(e, "thrown")) }), 14, e)) } function jumpHammerBro(e) { if (!characterIsAlive(e)) return !0; e.resting && (map.floor - e.bottom / unitsize >= jumplev1 - 2 && "floor" != e.resting.name && Math.floor(2 * Math.random()) ? (e.yvel = -.7 * unitsize, e.falling = !0, TimeHandler.addEvent((function(e) { e.falling = !1 }), 42, e)) : e.yvel = -2.1 * unitsize, e.resting = !1) } function Hammer(e, t) { e.width = e.height = 8, e.nocollidesolid = e.nocollidechar = e.deadly = e.nofire = !0, e.collide = collideEnemy, e.yvel = 1.4 * -unitsize, e.xvel = unitsize / 1.4, t && (e.xvel *= -1), e.gravity = gravity / 2.1, setCharacter(e, "hammer"), TimeHandler.addSpriteCycle(e, ["one", "two", "three", "four"], 3) } function Cannon(e, t, n) { e.width = 8, e.height = 8 * (t || 1), e.spriteheight = 16, n || (e.movement = moveCannonInit), e.timer = 117, e.repeat = !0, setSolid(e, "cannon") } function moveCannonInit(e) { TimeHandler.addEventInterval((function(e) { if (!(player.right > e.left - unitsizet8 && player.left < e.right + unitsizet8)) { var t = new Thing(BulletBill); objectToLeft(player, e) ? (addThing(t, e.left, e.top), t.direction = t.moveleft = !0, t.xvel *= -1, flipHoriz(t)) : addThing(t, e.left + e.width, e.top), AudioPlayer.playLocal("Bump", e.right) } }), 270, 1 / 0, e), e.movement = !1 } function BulletBill(e) { e.width = 8, e.height = 7, e.group = "enemy", e.nofall = e.nofire = e.nocollidesolid = e.nocollidechar = !0, e.speed = e.xvel = unitsized2, e.movement = moveSimple, e.collide = collideEnemy, e.death = killFlip, setCharacter(e, "bulletbill") } function Bowser(e, t) { e.width = e.height = 16, e.speed = .28 * unitsize, e.gravity = gravity / 2.8, e.deadly = e.dx = e.lookleft = e.nokillend = e.skipoverlaps = !0, e.moveleft = e.smart = e.movecount = e.jumpcount = e.firecount = e.deathcount = 0, e.killonend = freezeBowser, e.counter = -.7, e.group = "enemy", e.movement = moveBowserInit, e.collide = collideEnemy, e.death = killBowser, setCharacter(e, "bowser"), TimeHandler.addSpriteCycle(e, ["one", "two"]), t && TimeHandler.addEvent(throwHammer, 35, e, 7) } function moveBowserInit(e) { TimeHandler.addEventInterval(bowserJumps, 117, 1 / 0, e), TimeHandler.addEventInterval(bowserFires, 280, 1 / 0, e), TimeHandler.addEventInterval(bowserFires, 350, 1 / 0, e), TimeHandler.addEventInterval(bowserFires, 490, 1 / 0, e), e.movement = moveBowser } function moveBowser(e) { characterIsAlive(player) && (lookTowardPlayer(e), e.lookleft ? e.xvel = Math.sin(Math.PI * (e.counter += .007)) / 1.4 : e.xvel = min(e.xvel + .07, .84)) } function bowserJumps(e) { if (!characterIsAlive(e)) return !0; e.resting && e.lookleft && (e.yvel = -1.4 * unitsize, e.resting = !1, e.nocollidesolid = !0, TimeHandler.addEventInterval((function(e) { if (e.yvel > unitsize) return e.nocollidesolid = !1, !0 }), 3, 1 / 0, e)) } function bowserFires(e) { if (!characterIsAlive(e) || !characterIsAlive(player)) return !0; e.lookleft && (addClass(e, "firing"), AudioPlayer.playLocal("Bowser Fires", e.left), TimeHandler.addEvent((function(e) { var t = e.top + unitsizet4, n = new Thing(BowserFire, roundDigit(player.bottom, unitsizet8)); removeClass(e, "firing"), addThing(n, e.left - unitsizet8, t), AudioPlayer.play("Bowser Fires") }), 14, e)) } function killBowser(e, t) { if (t) return e.nofall = !1, killFlip(e); 5 == ++e.deathcount && (e.yvel = e.speed = e.movement = 0, killFlip(e, 350), score(e, 5e3)) } function freezeBowser(e) { e.movement = !1, thingStoreVelocity(e) } function BowserFire(e, t) { e.width = 12, e.height = 4, e.xvel = -.63 * unitsize, e.deadly = e.nofall = e.nocollidesolid = e.nofire = !0, e.collide = collideEnemy, t && (e.ylev = t, e.movement = moveFlying), setCharacter(e, "bowserfire"), TimeHandler.addSpriteCycle(e, [unflipVert, flipVert]) } function moveFlying(e) { round(e.bottom) != round(e.ylev) ? shiftVert(e, min(max(0, e.ylev - e.bottom), unitsize)) : e.movement = !1 } function WaterBlock(e, t) { e.height = 16, e.width = t, e.spritewidth = e.spriteheight = 1 / scale, e.repeat = !0, setSolid(e, "water-block") } function Blooper(e) { e.width = 8, e.height = 12, e.nocollidesolid = e.nofall = e.moveleft = 1, e.squeeze = e.counter = 0, e.speed = unitsized2, e.xvel = e.speedinv = -unitsized4, e.movement = moveBlooper, e.collide = collideEnemy, e.death = killFlip, setCharacter(e, "blooper") } function moveBlooper(e) { switch (e.counter) { case 56: e.squeeze = !0, ++e.counter; break; case 63: squeezeBlooper(e); break; default: ++e.counter } e.top < unitsizet16 + 10 && squeezeBlooper(e), e.squeeze ? e.yvel = max(e.yvel + .021, .7) : e.yvel = min(e.yvel - .035, -.7), shiftVert(e, e.yvel, !0), e.squeeze || (player.left > e.right + unitsizet8 ? e.xvel = min(e.speed, e.xvel + unitsized32) : player.right < e.left - unitsizet8 && (e.xvel = max(e.speedinv, e.xvel - unitsized32))) } function squeezeBlooper(e) { 2 != e.squeeze && addClass(e, "squeeze"), e.squeeze = 2, e.xvel /= 1.17, setHeight(e, 10, !0, !0), (e.top > player.bottom || e.bottom > 360) && unsqueezeBlooper(e) } function unsqueezeBlooper(e) { e.squeeze = !1, removeClass(e, "squeeze"), e.counter = 0, setHeight(e, 12, !0, !0) } function CheepCheep(e, t, n) { e.width = e.height = 8, e.group = "enemy"; var x = "cheepcheep " + (t ? "red" : ""); e.red = t, setCheepVelocities(e), n ? (x += " jumping", e.jumping = !0, e.movement = moveCheepJumping) : e.movement = moveCheepInit, e.nofall = e.nocollidesolid = e.nocollidechar = !0, e.death = killFlip, e.collide = collideEnemy, setCharacter(e, x), TimeHandler.addSpriteCycle(e, ["one", "two"]) } function setCheepVelocities(e) { e.red ? (e.xvel = -unitsized4, e.yvel = unitsize / -24) : (e.xvel = unitsize / -6, e.yvel = -unitsized32) } function moveCheepInit(e) { setCheepVelocities(e), e.top < player.top && (e.yvel *= -1), moveCheep(e), e.movement = moveCheep } function moveCheep(e) { shiftVert(e, e.yvel) } function moveCheepJumping(e) { shiftVert(e, e.yvel += unitsize / 14) } function startCheepSpawn() { return map.zone_cheeps = TimeHandler.addEventInterval((function() { if (!map.zone_cheeps) return !0; var e = new Thing(CheepCheep, !0, !0); addThing(e, Math.random() * player.left * player.maxspeed / unitsized2, gamescreen.height * unitsize), e.xvel = Math.random() * player.maxspeed, e.yvel = -2.33 * unitsize, flipHoriz(e), e.movement = function(e) { e.top < ceilmax ? e.movement = moveCheepJumping : shiftVert(e, e.yvel) } }), 21, 1 / 0) } function Bubble(e) { e.width = e.height = 2, e.nofall = e.nocollide = !0, e.movement = function(e) { e.top < unitsizet16 ? killNormal(e) : shiftVert(e, e.yvel) }, e.yvel = -unitsized4, setCharacter(e, "bubble") } function Lakitu(e, t) { e.width = 8, e.height = 12, e.nofall = e.noshiftx = e.nocollidesolid = !0, e.playerdiff = e.counter = 0, e.dir = -1, e.norepeat = t, e.playerdiff = unitsizet16, e.group = "enemy", e.collide = collideEnemy, e.movement = moveLakituInit, e.death = killLakitu, setCharacter(e, "lakitu out"), map.has_lakitu = e } function moveLakituInit(e) { if (map.has_lakitu && e.norepeat) return killNormal(e); TimeHandler.addEventInterval((function(e) { if (!e.alive) return !0; throwSpiny(e) }), 140, 1 / 0, e), e.movement = moveLakituInit2, moveLakituInit2(e), map.has_lakitu = e } function moveLakituInit2(e) { if (e.right < player.left) return moveLakitu(e), e.movement = moveLakitu, map.lakitu = e, !0; shiftHoriz(e, -unitsize) } function moveLakitu(e) { player.xvel > unitsized8 && player.left > gamescreen.width * unitsized2 ? e.left < player.right + unitsizet16 && (slideToXLoc(e, player.right + unitsizet32 + player.xvel, 1.4 * player.maxspeed), e.counter = 0) : (e.counter += .007, slideToXLoc(e, player.left + player.xvel + 117 * Math.sin(Math.PI * e.counter), .7 * player.maxspeed)) } function throwSpiny(e) { if (!characterIsAlive(e)) return !1; switchClass(e, "out", "hiding"), TimeHandler.addEvent((function(e) { if (e.dead) return !1; var t = new Thing(SpinyEgg); addThing(t, e.left, e.top), t.yvel = -2.1 * unitsize, switchClass(e, "hiding", "out") }), 21, e) } function killLakitu(e) { delete e.noscroll, killFlip(e) } function Spiny(e) { e.width = e.height = 8, e.group = "enemy", e.speed = .21 * unitsize, e.deadly = e.moveleft = !0, e.smart = !1, e.death = killFlip, e.collide = collideEnemy, e.movement = moveSimple, setCharacter(e, "spiny"), TimeHandler.addSpriteCycle(e, ["one", "two"]) } function SpinyEgg(e) { e.height = 8, e.width = 7, e.group = "enemy", e.deadly = !0, e.movement = moveSpinyEgg, e.spawntype = Spiny, e.spawner = e.death = createSpiny, e.collide = collideEnemy, setCharacter(e, "spinyegg"), TimeHandler.addSpriteCycle(e, ["one", "two"]) } function moveSpinyEgg(e) { e.resting && createSpiny(e) } function createSpiny(e) { var t = new Thing(Spiny); addThing(t, e.left, e.top), t.moveleft = objectToLeft(player, t), killNormal(e) } function Beetle(e) { e.width = e.height = 8, e.group = "enemy", e.speed = e.xvel = .21 * unitsize, e.nofire = 2, e.moveleft = !0, e.smart = !1, e.collide = collideEnemy, e.movement = moveSmart, e.death = killBeetle, setCharacter(e, "beetle"), TimeHandler.addSpriteCycleSynched(e, ["one", "two"]) } function killBeetle(e, t) { if (e.alive) { var n; if (n = new Thing(t && 2 != t ? Koopa : BeetleShell, e.smart), TimeHandler.addEvent((function(e, t) { addThing(e, t.left, t.bottom - e.height * unitsize), e.moveleft = t.moveleft }), 0, n, e), killNormal(e), 2 != t) return n; killFlip(n) } } function BeetleShell(e) { e.width = e.height = 8, e.nofire = !0, e.group = "item", e.speed = unitsizet2, e.moveleft = e.xvel = e.move = e.hitcount = e.peeking = e.counting = e.landing = e.enemyhitcount = 0, e.movement = moveShell, e.collide = hitShell, e.death = killFlip, e.spawntype = Beetle, setCharacter(e, "shell beetle") } function Coin(e, t) { e.group = "coin", e.width = 5, e.height = 7, e.nofall = e.coin = e.nofire = e.nocollidechar = e.nokillend = e.onlyupsolids = e.skipoverlaps = !0, e.tolx = 0, e.toly = unitsized2, e.collide = hitCoin, e.animate = coinEmerge, e.death = killNormal, setCharacter(e, "coin one"), TimeHandler.addSpriteCycleSynched(e, ["one", "two", "three", "two", "one"]), t && (e.movement = coinBecomesSolid) } function coinBecomesSolid(e) { switchContainers(e, characters, solids), e.movement = !1 } function hitCoin(e, t) { e.player && (AudioPlayer.play("Coin"), score(e, 200, !1), gainCoin(), killNormal(t)) } function gainCoin() { ++data.coins.amount >= 100 && (data.coins.amount = 0, gainLife()), updateDataElement(data.coins) } function coinEmerge(e, t) { AudioPlayer.play("Coin"), removeClass(e, "still"), switchContainers(e, characters, scenery), score(e, 200, !1), gainCoin(), e.nocollide = e.alive = e.nofall = e.emerging = !0, e.blockparent ? e.movement = coinEmergeMoveParent : e.movement = coinEmergeMove, e.yvel = -unitsize, TimeHandler.addEvent((function(e) { e.yvel *= -1 }), 25, e), TimeHandler.addEvent((function(e) { killNormal(e), deleteThing(e, scenery, scenery.indexOf(e)) }), 49, e), TimeHandler.addEventInterval(coinEmergeMovement, 1, 1 / 0, e, t), TimeHandler.clearClassCycle(e, 0), addClass(e, "anim"), TimeHandler.addSpriteCycle(e, ["anim1", "anim2", "anim3", "anim4", "anim3", "anim2"], 0, 5) } function coinEmergeMovement(e, t) { if (!e.alive) return !0; shiftVert(e, e.yvel) } function coinEmergeMove(e) { shiftVert(e, e.yvel, !0) } function coinEmergeMoveParent(e) { e.bottom >= e.blockparent.bottom ? killNormal(e) : shiftVert(e, e.yvel, !0) } function Player(e) { setPlayerSizeSmall(e), e.walkspeed = unitsized2, e.canjump = e.nofiredeath = e.nofire = e.player = e.nokillend = 1, e.numballs = e.moveleft = e.skidding = e.star = e.dying = e.nofall = e.maxvel = e.paddling = e.jumpers = e.landing = 0, e.running = "", e.power = data.playerpower, e.maxspeed = e.maxspeedsave = 1.35 * unitsize, e.scrollspeed = 1.75 * unitsize, e.keys = new Keys, e.fire = playerFires, e.movement = movePlayer, e.death = killPlayer, setCharacter(e, "player normal small still"), e.tolx = unitsizet2, e.toly = 0, e.gravity = map.gravity, map.underwater && (e.swimming = !0, TimeHandler.addSpriteCycle(e, ["swim1", "swim2"], "swimming", 5)) } function placePlayer(e, t) { clearOldPlayer(), window.player = new Thing(Player), window.luigi ? window.player.title = "Luigi" : window.player.title = "Mario"; var n = addThing(player, e || unitsizet16, t || (map.floor - player.height) * unitsize); return data.playerpower >= 2 && (playerGetsBig(player, !0), 3 == data.playerpower && playerGetsFire(player, !0)), n } function clearOldPlayer() { window.player && (player.alive = !1, player.dead = !0) } function Keys() { this.run = this.crouch = this.jump = this.jumplev = this.sprint = 0 } function thingStoreVelocity(e, t) { e.xvelOld = e.xvel || 0, e.yvelOld = e.yvel || 0, e.nofallOld = e.nofall || !1, e.nocollideOld = e.nocollide || !1, e.movementOld = e.movement || e.movementOld, e.nofall = e.nocollide = !0, e.xvel = e.yvel = !1, t || (e.movement = !1) } function thingRetrieveVelocity(e, t) { t || (e.xvel = e.xvelOld || 0, e.yvel = e.yvelOld || 0), e.movement = e.movementOld || e.movement, e.nofall = e.nofallOld || !1, e.nocollide = e.nocollideOld || !1 } function removeCrouch() { player.crouching = !1, player.toly = player.tolyold || 0, 1 != player.power && (removeClass(player, "crouching"), player.height = 16, updateBottom(player, 0), updateSize(player)) } function playerShroom(e) { e.shrooming || (AudioPlayer.play("Powerup"), score(e, 1e3, !0), 3 != e.power && (e.shrooming = !0, (2 == ++e.power ? playerGetsBig : playerGetsFire)(e), storePlayerStats())) } function playerGetsBig(e, t) { if (setPlayerSizeLarge(e), e.keys.down = 0, removeClasses(player, "crouching small"), updateBottom(e, 0), updateSize(e), t) addClass(e, "large"); else { addClass(player, "shrooming"); for (var n = [1, 2, 1, 2, 3, 2, 3], x = n.length - 1; x >= 0; --x) n[x] = "shrooming" + n[x]; thingStoreVelocity(player), n.push((function(e, t) { return e.shrooming = t.length = 0, addClass(e, "large"), removeClasses(e, "shrooming shrooming3"), thingRetrieveVelocity(player), !0 })), TimeHandler.addSpriteCycle(e, n, "shrooming", 6) } } function playerGetsSmall(e) { var t = player.bottom; e.keys.down = 0, thingStoreVelocity(e), addClass(e, "small"), flicker(e), removeClasses(player, "running skidding jumping fiery"), addClass(player, "paddling"), TimeHandler.addEvent((function(e) { removeClass(e, "large"), setPlayerSizeSmall(e), setBottom(e, t - unitsize) }), 21, player), TimeHandler.addEvent((function(e) { thingRetrieveVelocity(e, !1), e.nocollidechar = !0, removeClass(e, "paddling"), (e.running || e.xvel) && addClass(e, "running"), TimeHandler.addEvent(setThingSprite, 1, e) }), 42, player), TimeHandler.addEvent((function(e) { e.nocollidechar = !1 }), 70, player) } function playerGetsFire(e) { removeClass(e, "intofiery"), addClass(e, "fiery"), player.shrooming = !1 } function setPlayerSizeSmall(e) { setSize(e, 8, 8, !0), updateSize(e) } function setPlayerSizeLarge(e) { setSize(e, 8, 16, !0), updateSize(e) } function movePlayer(e) { if (e.keys.up) { if (e.keys.jump > 0 && (e.yvel <= 0 || map.underwater) && (map.underwater && playerPaddles(e), e.resting ? (e.resting.xvel && (e.xvel += e.resting.xvel), e.resting = !1) : (e.jumping || map.underwater || switchClass(e, "running skidding", "jumping"), e.jumping = !0), !map.underwater)) { var t = unitsize / pow(++e.keys.jumplev, map.jumpmod - .0014 * e.xvel); e.yvel = max(e.yvel - t, map.maxyvelinv) } } else e.keys.jump = 0; e.keys.crouch && !e.crouching && e.resting && (1 != e.power && (e.crouching = !0, addClass(e, "crouching"), e.height = 11, e.tolyold = e.toly, e.toly = unitsizet4, updateBottom(e, 0), updateSize(e)), e.resting.actionTop && e.resting.actionTop(e, e.resting, e.resting.transport)); var n = 0; if (0 == e.keys.run || e.crouching) e.xvel *= .98, n = .035; else { var x = e.keys.run * (.098 * ((e.keys.sprint && !map.underwater || 0) + 1)); e.xvel += x || 0, e.xvel *= .98, n = 7e-4, signBool(e.keys.run) == e.moveleft ? e.skidding || (addClass(e, "skidding"), e.skidding = !0) : e.skidding && (removeClass(e, "skidding"), e.skidding = !1) } e.xvel > n ? e.xvel -= n : e.xvel < -n ? e.xvel += n : 0 != e.xvel && (e.xvel = 0, window.nokeys || 0 != e.keys.run || (e.keys.left_down ? e.keys.run = -1 : e.keys.right_down && (e.keys.run = 1))), Math.abs(e.xvel) < .14 ? e.running && (e.running = !1, 1 == player.power && setPlayerSizeSmall(e), removeClasses(e, "running skidding one two three"), addClass(e, "still"), TimeHandler.clearClassCycle(e, "running")) : e.running || (e.running = !0, switchClass(e, "still", "running"), playerStartRunningCycle(e), 1 == e.power && setPlayerSizeSmall(e)), e.xvel > 0 ? (e.xvel = min(e.xvel, e.maxspeed), e.moveleft && (e.resting || map.underwater) && (unflipHoriz(e), e.moveleft = !1)) : e.xvel < 0 && (e.xvel = max(e.xvel, -1 * e.maxspeed), e.moveleft || !e.resting && !map.underwater || (flipHoriz(e), e.moveleft = !0)), e.resting && (e.hopping && (removeClass(e, "hopping"), e.xvel && addClass(e, "running"), e.hopping = !1), e.keys.jumplev = e.yvel = e.jumpcount = 0, e.jumping && (e.jumping = !1, removeClass(e, "jumping"), 1 == e.power && setPlayerSizeSmall(e), addClass(e, abs(e.xvel) < .14 ? "still" : "running")), e.paddling && (e.paddling = e.swimming = !1, removeClasses(e, "paddling swim1 swim2"), TimeHandler.clearClassCycle(e, "paddling"), addClass(e, "running"))), isNaN(e.xvel) } function playerStartRunningCycle(e) { e.running = TimeHandler.addSpriteCycle(e, ["one", "two", "three", "two"], "running", setPlayerRunningCycler) } function setPlayerRunningCycler(e) { e.timeout = 5 + ceil(player.maxspeedsave - abs(player.xvel)) } function playerPaddles(e) { e.paddling || (removeClasses(e, "skidding paddle1 paddle2 paddle3 paddle4 paddle5"), addClass(e, "paddling"), TimeHandler.clearClassCycle(e, "paddling_cycle"), TimeHandler.addSpriteCycle(e, ["paddle1", "paddle2", "paddle3", "paddle3", "paddle2", "paddle1", function() { return e.paddling = !1 }], "paddling_cycle", 5)), e.paddling = e.swimming = !0, e.yvel = -.84 * unitsize } function playerBubbles() { addThing(new Thing(Bubble), player.right, player.top) } function movePlayerVine(e) { var t = e.attached; if (e.bottom < t.top) return unattachPlayer(e); if (e.keys.run == e.attachoff) { for (; objectsTouch(e, t);) shiftHoriz(e, e.keys.run, !0); return unattachPlayer(e) } if (e.keys.up) e.animatednow = !0, shiftVert(e, -1 * unitsized4, !0); else if (e.keys.crouch) { if (e.animatednow = !0, shiftVert(e, unitsized2, !0), e.bottom > t.bottom - unitsizet4) return unattachPlayer(e) } else e.animatednow = !1; e.animatednow && !e.animated ? addClass(e, "animated") : !e.animatednow && e.animated && removeClass(e, "animated"), e.animated = e.animatednow, e.bottom < -16 && (locMovePreparations(e), !t.locnum && map.random ? goToTransport(["Random", "Sky", "Vine"]) : shiftToLocation(t.locnum)) } function unattachPlayer(e) { e.movement = movePlayer, removeClasses(e, "climbing", "animated"), TimeHandler.clearClassCycle(e, "climbing"), e.yvel = e.skipoverlaps = e.attachoff = e.nofall = e.climbing = e.attached = e.attached.attached = !1, e.xvel = e.keys.run } function playerHopsOff(e, t, n) { removeClasses(e, "climbing running"), addClass(e, "jumping"), e.piping = e.nocollide = e.nofall = e.climbing = !1, e.gravity = gravity / 4, e.xvel = 3.5, e.yvel = -3.5, TimeHandler.addEvent((function(e) { unflipHoriz(e), e.gravity = gravity, e.movement = movePlayer, e.attached = !1, n && (addClass(e, "running"), playerStartRunningCycle(e)) }), 21, e) } function playerFires() { if (!(player.numballs >= 2)) { ++player.numballs, addClass(player, "firing"); var e = new Thing(FireBall, player.moveleft, !0); e.yvel = unitsize, addThing(e, player.right + unitsized4, player.top + unitsizet8), player.moveleft && setRight(e, player.left - unitsized4, !0), e.animate(e), e.ondelete = fireDeleted, TimeHandler.addEvent((function(e) { removeClass(e, "firing") }), 7, player) } } function emergeFire(e) { AudioPlayer.play("Fireball") } function playerStar(e) { e.star || (++e.star, AudioPlayer.play("Powerup"), AudioPlayer.playTheme("Star", !0), TimeHandler.addEvent(playerRemoveStar, 560, e), switchClass(e, "normal", "star"), TimeHandler.addSpriteCycle(e, ["star1", "star2", "star3", "star4"], "star", 5)) } function playerRemoveStar(e) { e.star && (--e.star, removeClasses(e, "star star1 star2 star3 star4"), TimeHandler.clearClassCycle(e, "star"), addClass(e, "normal"), AudioPlayer.playTheme()) } function killPlayer(e, t) { if (e.alive && !e.flickering && !e.dying) { if (2 == t) notime = !0, e.dead = e.dying = !0; else { if (!t && e.power > 1) return AudioPlayer.play("Power Down"), e.power = 1, storePlayerStats(), playerGetsSmall(e); 2 != t && (TimeHandler.clearAllCycles(e), setSize(e, 7.5, 7, !0), updateSize(e), setClass(e, "character player dead"), nokeys = notime = e.dying = !0, thingStoreVelocity(e), containerForefront(e, characters), TimeHandler.addEvent((function(e) { thingRetrieveVelocity(e, !0), e.nocollide = !0, e.movement = e.resting = !1, e.gravity = gravity / 2.1, e.yvel = -1.4 * unitsize }), 7, e)) } AudioPlayer.pause(), window.editing || AudioPlayer.play("Player Dies"), e.nocollide = e.nomove = nokeys = 1, --data.lives.amount, map.random || (data.score.amount = data.scoreold), window.editing ? setTimeout((function() { editorSubmitGameFuncPlay(), editor.playing = editor.playediting = !0 }), 35 * timer) : !map.random || data.lives.amount <= 0 ? window.reset = setTimeout(data.lives.amount ? setMap : gameOver, 280 * timer) : (nokeys = notime = !1, updateDataElement(data.score), updateDataElement(data.lives), TimeHandler.addEvent((function() { playerDropsIn(), AudioPlayer.playTheme() }), 117)) } } function playerDropsIn() { clearOldPlayer(), placePlayer(unitsizet16, -1 * unitsizet8 + map.underwater * unitsize * 24), flicker(player), map.underwater ? player.gravity = gravity / 2.8 : (player.nocollide = !0, TimeHandler.addEvent((function() { player.nocollide = !1, addThing(new Thing(RestingStone), player.left, player.bottom + player.yvel) }), map.respawndist || 17)) } function gameOver() { gameon = !1, pause(), AudioPlayer.pauseTheme(), AudioPlayer.play("Game Over"); var e = "
GAME OVER
"; e += "

", body.className = "Night", body.innerHTML = e, window.gamecount = 1 / 0, clearPlayerStats(), setTimeout(gameRestart, 7e3) } function gameRestart() { seedlast = .007, body.style.visibility = "hidden", body.innerHTML = body.style.paddingTop = body.style.fontSize = "", body.appendChild(canvas), gameon = !0, map.random ? setMapRandom() : setMap(1, 1), TimeHandler.addEvent((function() { body.style.visibility = "" })), setLives(3) } function Floor(e, t, n) { e.width = 8 * (t || 1), e.height = 8 * n || unitsizet32, e.spritewidth = 8, e.spriteheight = 8, e.repeat = !0, setSolid(e, "floor") } function Clouds(e, t) { e.width = 8 * t, e.height = 8, setSolid(e, "clouds") } function Brick(e, t) { if (e.width = e.height = 8, e.used = !1, e.bottomBump = brickBump, t) if (t instanceof Array) for (e.contents = t; e.contents.length < 3;) e.contents.push(!1); else e.contents = [t, !1, !1]; else e.contents = !1; e.death = killNormal, setSolid(e, "brick unused"), e.tolx = 1 } function brickBump(e, t) { if (!e.up && "player" == t.type && (AudioPlayer.play("Bump"), !e.used)) { if (e.up = t, t.power > 1 && !e.contents) return TimeHandler.addEvent(brickBreak, 2, e, t); blockBumpMovement(e), e.contents && (player.power > 1 && e.contents[0] == Mushroom && !e.contents[1] && (e.contents[0] = FireFlower), TimeHandler.addEvent((function(e) { var t = e.contents, n = new Thing(t[0], t[1], t[2]); addThing(n, e.left, e.top), setMidXObj(n, e, !0), n.blockparent = e, n.animate(n, e), e.contents[0] == Coin ? (e.lastcoin && makeUsedBlock(e), TimeHandler.addEvent((function(e) { e.lastcoin = !0 }), 245, e)) : makeUsedBlock(e) }), 7, e)) } } function makeUsedBlock(e) { e.used = !0, switchClass(e, "unused", "used") } function brickBreak(e, t) { AudioPlayer.play("Break Block"), score(e, 50), e.up = t, TimeHandler.addEvent(placeShards, 1, e), killNormal(e) } function placeShards(e) { for (var t, n = 0; n < 4; ++n) addThing(t = new Thing(BrickShard), e.left + (n < 2) * e.width * unitsize - unitsizet2, e.top + n % 2 * e.height * unitsize - unitsizet2), t.xvel = unitsized2 - unitsize * (n > 1), t.yvel = -1.4 * unitsize + n % 2, TimeHandler.addEvent(killNormal, 350, t) } function BrickShard(e) { e.width = e.height = 4, e.nocollide = !0, e.death = killNormal, setCharacter(e, "brickshard"), TimeHandler.addSpriteCycle(e, [unflipHoriz, flipHoriz]) } function attachEmerge(e, t) { e.animate = setInterval((function() { setBottom(e, t.top, !0), t.up || (clearInterval(e.animate), e.animate = !1) }), timer) } function Block(e, t, n) { if (e.width = e.height = 8, e.used = !1, e.bottomBump = blockBump, t) if (t instanceof Array) for (e.contents = t; e.contents.length < 3;) e.contents.push(!1); else e.contents = [t, !1, !1]; else e.contents = [Coin]; e.death = killNormal, setSolid(e, "Block unused"), e.hidden = !!n && (e.hidden = e.skipoverlaps = !0), e.tolx = 1, TimeHandler.addSpriteCycleSynched(e, ["one", "two", "three", "two", "one"]) } function blockBump(e, t) { "player" == t.type && (e.used ? AudioPlayer.play("Bump") : (e.used = 1, e.hidden = e.hidden = e.skipoverlaps = !1, e.up = t, blockBumpMovement(e), removeClass(e, "hidden"), switchClass(e, "unused", "used"), player.power > 1 && e.contents[0] == Mushroom && !e.contents[1] && (e.contents[0] = FireFlower), TimeHandler.addEvent(blockContentsEmerge, 7, e))) } function blockContentsEmerge(e) { var t = new Thing(e.contents[0], e.contents[1], e.contents[2]); addThing(t, e.left, e.top), setMidXObj(t, e, !0), t.blockparent = e, t.animate(t, e) } function Pipe(e, t, n) { e.width = e.spritewidth = 16, e.height = 8 * (t || 1), !1 !== n && (e.actionTop = intoPipeVert, e.transport = n), setSolid(e, "pipe") } function PipeSide(e, t, n) { e.width = e.spritewidth = n ? 8 : 19.5, e.height = e.spriteheight = 16, t && (e.actionLeft = intoPipeHoriz, e.transport = t), setSolid(e, "pipe side " + (n ? "small" : "")) } function PipeVertical(e, t) { e.spritewidth = e.width = 16, e.spriteheight = e.repeat = 1, e.height = t, setSolid(e, "pipe vertical") } function Vine(e, t) { e.width = e.spriteheight = 7, e.height = 0, e.locnum = t, e.nocollide = e.nofall = e.repeat = !0, e.animate = vineEmerge, e.movement = vineMovement, setCharacter(e, "vine") } function vineEmerge(e, t) { AudioPlayer.play("Vine Emerging"), setHeight(e, 0), e.movement = vineMovement, TimeHandler.addEvent(vineEnable, 14, e), TimeHandler.addEventInterval(vineStay, 1, 14, e, t) } function vineStay(e, t) { setBottom(e, t.top) } function vineEnable(e) { e.nocollide = !1, e.collide = touchVine } function vineMovement(e) { increaseHeightTop(e, unitsized4), e.attached && shiftVert(e.attached, -unitsized4, !0) } function touchVine(e, t) { !e.player || e.attached || e.climbing || e.bottom > t.bottom + unitsizet2 || (t.attached = e, e.attached = t, e.nofall = e.skipoverlaps = !0, e.xvel = e.yvel = e.resting = e.jumping = e.jumpcount = e.running = 0, e.attachleft = !objectToLeft(e, t), e.attachoff = 2 * e.attachleft - 1, e.movementsave = e.movement, e.movement = movePlayerVine, e.keys = new Keys, TimeHandler.clearClassCycle(e, "running"), removeClass(e, "running skidding"), unflipHoriz(e), e.attachleft && flipHoriz(e), addClass(e, "climbing"), e.climbing = TimeHandler.addSpriteCycle(e, ["one", "two"], "climbing"), lookTowardThing(e, t), e.attachleft ? setLeft(e, t.right - unitsizet4) : setRight(e, t.left + unitsizet4)) } function Springboard(e) { e.width = 8, e.height = e.heightnorm = 14.5, e.tension = e.tensionsave = 0, e.dir = 1, e.collide = collideSpring, setSolid(e, "springboard") } function collideSpring(e, t) { return e.yvel >= 0 && e.player && !t.tension && characterOnSolid(e, t) ? springPlayerInit(t, e) : characterTouchedSolid(e, t) } function springPlayerInit(e, t) { e.tension = e.tensionsave = max(.77 * t.yvel, unitsize), t.movement = movePlayerSpringDown, t.spring = e, t.xvel /= 2.8 } function movePlayerSpringDown(e) { return objectsTouch(e, e.spring) ? e.spring.height < 2.5 * unitsize || e.spring.tension < unitsized32 ? (e.movement = movePlayerSpringUp, void(e.spring.movement = moveSpringUp)) : ((e.left < e.spring.left + unitsizet2 || e.right > e.spring.right - unitsizet2) && (e.xvel /= 1.4), reduceSpringHeight(e.spring, e.spring.tension), setBottom(e, e.spring.top, !0), e.spring.tension /= 2, void updateSize(e.spring)) : (e.movement = movePlayer, e.spring.movement = moveSpringUp, void(e.spring = !1)) } function movePlayerSpringUp(e) { if (!e.spring || !objectsTouch(e, e.spring)) return e.spring = !1, void(e.movement = movePlayer) } function moveSpringUp(e) { reduceSpringHeight(e, -e.tension), e.tension *= 2, e == player.spring && setBottom(player, e.top, !0), e.height > e.heightnorm && (e == player.spring && (player.yvel = max(-unitsizet2, -.98 * e.tensionsave), player.resting = player.spring = !1), reduceSpringHeight(e, (e.height - e.heightnorm) * unitsize), e.tension = e.tensionsave = e.movement = !1) } function reduceSpringHeight(e, t) { reduceHeight(e, t, !0) } function Stone(e, t, n) { e.width = 8 * t || 8, e.height = 8 * n || 8, e.repeat = !0, setSolid(e, "Stone") } function GenericStone(e, t, n) { return Stone(e, t, n) } function RestingStone(e) { e.width = e.height = 8, e.used = !1, e.movement = RestingStoneUnused, setSolid(e, "Stone hidden"), e.title = "Stone" } function RestingStoneUnused(e) { if (player.resting) { if (player.resting != e) return killNormal(e); e.movement = RestingStoneUsed, removeClass(e, "hidden"), setThingSprite(player) } } function RestingStoneUsed(e) { if (!player.resting) return killNormal(e) } function CastleBlock(e, t, n) { e.width = e.height = 8; var x, r, i = !1; t instanceof Array ? (x = t[0], r = t[1], i = n) : (x = t, r = n), setSolid(e, i ? "castleblockinvis" : "castleblock"), x && (e.balls = new Array(x), e.dt = .07 * (r ? 1 : -1), e.timeout = round(7 / (abs(r) || 1)), e.movement = castleBlockSpawn, e.timer = e.counter = 0, e.angle = .25, e.spawn_as_char = !0) } function castleBlockSpawn(e) { for (var t = 0; t < e.balls.length; ++t) { spawn = new Thing(CastleFireBall, 4 * t); var n = e.width * unitsized4, x = e.left + n, r = e.top + n; e.balls[t] = addThing(spawn, x + t * unitsize * 3, r + t * unitsize * 3) } e.movement = !1; abs(e.dt); TimeHandler.addEventInterval(castleBlockEvent, e.timeout, 1 / 0, e) } function castleBlockEvent(e) { e.midx = e.left, e.midy = e.top, e.counter = 0, e.angle += e.dt; for (var t = 1; t < e.balls.length; ++t) setMidX(e.balls[t], e.midx + t * unitsizet4 * Math.cos(e.angle * Math.PI), !0), setMidY(e.balls[t], e.midy + t * unitsizet4 * Math.sin(e.angle * Math.PI), !0) } function CastleFireBall(e, t) { e.width = e.height = 4, e.deadly = e.nofire = e.nocollidechar = e.nocollidesolid = e.nofall = e.nostar = e.outerok = e.skipoverlaps = !0, e.movement = !1, e.collide = collideEnemy, setCharacter(e, "fireball castle"), TimeHandler.addSpriteCycle(e, ["one", "two", "three", "four"], 4) } function CastleBridge(e, t) { e.height = 8, e.width = 8 * t || 4, e.spritewidth = 4, e.repeat = !0, setSolid(e, "CastleBridge") } function CastleChain(e) { e.height = 8, e.width = e.spritewidth = 7.5, e.nocollide = !0, setSolid(e, "castlechain") } function CastleAxe(e) { e.width = e.height = 8, e.spritewidth = e.spriteheight = 8, e.nocollide = !0, setSolid(e, "castleaxe"), TimeHandler.addSpriteCycle(e, ["one", "two", "three", "two"]) } function CastleAxeFalls(e, t) { var n = t.axe; !e.player || e.right < n.left + unitsize || e.bottom > n.bottom - unitsize || (killNormal(n), killNormal(t), notime = nokeys = !0, thingStoreVelocity(e), killOtherCharacters(), TimeHandler.addEvent(killNormal, 7, n.chain), TimeHandler.addEvent(CastleAxeKillsBridge, 14, n.bridge, n), AudioPlayer.pauseTheme(), AudioPlayer.playTheme("World Clear", !1, !1)) } function CastleAxeKillsBridge(e, t) { e.width -= 2, e.right -= unitsizet2, e.width > 0 ? TimeHandler.addEvent(CastleAxeKillsBridge, 1, e, t) : (e.width = 0, TimeHandler.addEvent(CastleAxeKillsBowser, 1, t.bowser)), setWidth(e, e.width) } function CastleAxeKillsBowser(e) { e.nofall = !1, e.nothrow = !0, ++player.star, TimeHandler.addEvent(CastleAxeContinues, 35, player) } function CastleAxeContinues(e) { map.canscroll = !0, startWalking(e) } function Toad(e) { e.width = 16, e.height = e.spriteheight = 12, e.group = "toad", setSolid(e, "toad npc") } function Peach(e) { e.width = 16, e.height = e.spriteheight = 12, e.group = "peach", setSolid(e, "peach npc") } function collideCastleNPC(e, t) { killNormal(t), e.keys.run = 0, TimeHandler.addEvent((function(e) { var t; for (t = 0; t < e.length; ++t) TimeHandler.addEvent(proliferate, 70 * t, e[t].element, { style: { visibility: "visible" } }); TimeHandler.addEvent(endLevel, 70 * (t + 3)) }), 21, t.text) } function TreeTop(e, t) { e.width = 8 * t, e.height = 8, e.repeat = !0, setSolid(e, "treetop") } function ShroomTop(e, t) { e.width = 8 * t, e.height = 8, e.repeat = !0, setSolid(e, "shroomtop") } function Platform(e, t, n) { e.width = 4 * (t || 4), e.height = 4, e.spritewidth = 4, e.moving = 0, e.repeat = e.killonend = !0, "function" == typeof n && (n = [n]), n instanceof Array && (e.movement = n[0], e.begin = n[1] * unitsize, e.end = n[2] * unitsize, e.maxvel = (n[3] || 1.5) * unitsized4, e.movement == moveFloating || e.movement == movePlatformSpawn ? e.yvel = e.maxvel : e.xvel = e.maxvel, e.changing = 0), e.movement == collideTransport && (e.movement = !1, e.collide = collideTransport), setSolid(e, "platform") } function PlatformGenerator(e, t, n) { e.width = 4 * t, e.interval = 35, e.height = 6 * e.interval, e.dir = n, e.nocollide = e.hidden = !0, e.movement = PlatformGeneratorInit, setSolid(e, "platformgenerator") } function PlatformGeneratorInit(e) { for (var t = 0, n = e.interval, x = e.height; t < x; t += n) e.platlast = new Thing(Platform, e.width / 4, [movePlatformSpawn, 0, 0, 1.5]), e.platlast.yvel *= e.dir, 1 == e.dir ? addThing(e.platlast, e.left, e.top + t * unitsize) : addThing(e.platlast, e.left, e.bottom - t * unitsize), e.platlast.parent = e, t += e.interval; e.movement = !1 } function movePlatformSpawn(e) { e.bottom < e.parent.top ? (setBottom(e, e.parent.bottom), detachPlayer(e)) : e.top > e.parent.bottom ? (setTop(e, e.parent.top), detachPlayer(e)) : movePlatformNorm(e) } function movePlatformNorm(e) { shiftHoriz(e, e.xvel), shiftVert(e, e.yvel), e == player.resting && e.alive && (setBottom(player, e.top), shiftHoriz(player, e.xvel), player.right > innerWidth && setRight(player, innerWidth)) } function detachPlayer(e) { player.resting == e && (player.resting = !1) } function Scale(e, t, n) { e.height = 5, e.width = 4 * t, e.spritewidth = e.spriteheight = 5, e.repeat = e.nocollide = !0, setSolid(e, "scale") } function Flag(e) { e.width = e.height = 8, e.nocollide = !0, setSolid(e, "flag") } function FlagPole(e) { e.width = 1, e.height = 72, e.nocollide = e.repeat = !0, setSolid(e, "flagpole") } function FlagTop(e) { e.spritewidth = e.spriteheight = e.width = e.height = 4, e.nocollide = !0, setSolid(e, "flagtop") } function FlagDetector(e) { e.width = 2, e.height = 100, e.collide = FlagCollision, setSolid(e, "flagdetector"), e.hidden = !0 } function CastleDoorDetector(e) { e.width = e.height = 4, e.collide = endLevelPoints, setSolid(e, "castledoor"), e.hidden = !0 } function FlagCollision(e, t) { if (!e || !e.player) return killNormal(e); window.detector = t, AudioPlayer.pause(), AudioPlayer.play("Flagpole"), killOtherCharacters(), nokeys = notime = player.nofall = 1, player.xvel = player.yvel = player.keys.up = player.keys.jump = map.canscroll = map.ending = player.movement = 0, player.nocollidechar = !0, setRight(e, t.pole.left, !0), removeClasses(e, "running jumping skidding"), addClass(e, "climbing animated"), updateSize(e), TimeHandler.addSpriteCycle(e, ["one", "two"], "climbing"), playerRemoveStar(player); var n = !1, x = !1, r = (t.stone.top - e.bottom) / unitsize, i = setInterval((function() { n || (e.bottom >= t.stone.top ? (scorePlayerFlag(r, t.stone), n = !0, setBottom(e, t.stone.top, !0), removeClass(player, "animated"), TimeHandler.clearClassCycle(player, "climbing")) : shiftVert(e, unitsize, !0)), x || (t.flag.bottom >= t.stone.top ? (x = !0, setBottom(t.flag, t.stone.top, !0)) : shiftVert(t.flag, unitsize, !0)), n && x && (setBottom(e, t.stone.top, !0), clearInterval(i), setTimeout((function() { FlagOff(e, t.pole) }), 21 * timer)), refillCanvas() }), timer) } function scorePlayerFlag(e, t) { var n; n = e < 28 ? e < 8 ? 100 : 400 : e < 40 ? 800 : e < 62 ? 2e3 : 5e3, score(player, n, !0) } function FlagOff(e, t) { player.keys.run = notime = nokeys = 1, player.maxspeed = player.walkspeed, flipHoriz(e), TimeHandler.clearClassCycle(e, "climbing"), setLeft(e, t.right, !0), setTimeout((function() { AudioPlayer.play("Stage Clear"), playerHopsOff(e, t, !0) }), 14 * timer) } function endLevelPoints(e, t) { if (e && e.player) { notime = nokeys = !0, killNormal(t), killNormal(e); var n = parseInt(getLast(String(data.time.amount))); 1 != n && 3 != n && 6 != n && (n = 0); var x = setInterval((function() { --data.time.amount, data.score.amount += 50, updateDataElement(data.score), updateDataElement(data.time), AudioPlayer.play("Coin"), data.time.amount <= 0 && (clearInterval(x), setTimeout((function() { endLevelFireworks(e, n, t) }), 49 * timer)) }), timer) } } function endLevelFireworks(e, t, n) { var x, r, i = 0; if (t) { for (var a = n.left + 32 * unitsized2; i < t;) explodeFirework(++i, a); x = timer * (i + 2) * 42 } else x = 0; r = function() { setTimeout((function() { endLevel() }), x) }, AudioPlayer.addEventImmediate("Stage Clear", "ended", (function() { TimeHandler.addEvent(r, 35) })) } function explodeFirework(e, t) { setTimeout((function() { var n = new Thing(Firework, e); addThing(n, t + n.locs[0] - 6 * unitsize, unitsizet16 + n.locs[1]), n.animate() }), timer * e * 42) } function Firework(e, t) { if (e.width = e.height = 8, e.nocollide = e.nofire = e.nofall = !0, t) switch (t) { case 1: e.locs = [unitsizet16, unitsizet16]; break; case 2: e.locs = [-unitsizet16, unitsizet16]; break; case 3: e.locs = [2 * unitsizet16, 2 * unitsizet16]; break; case 4: e.locs = [-2 * unitsizet16, 2 * unitsizet16]; break; case 5: e.locs = [0, 1.5 * unitsizet16]; break; default: e.locs = [0, 0] } e.animate = function() { var t = e.className + " n"; e.locs && AudioPlayer.play("Firework"), TimeHandler.addEvent((function(e) { setClass(e, t + 1) }), 0, e), TimeHandler.addEvent((function(e) { setClass(e, t + 2) }), 7, e), TimeHandler.addEvent((function(e) { setClass(e, t + 3) }), 14, e), TimeHandler.addEvent((function(e) { killNormal(e) }), 21, e) }, setCharacter(e, "firework"), score(e, 500) } function Coral(e, t) { e.width = 8, e.height = 8 * t, e.repeat = !0, setSolid(e, "coral") } function BridgeBase(e, t) { e.height = 4, e.spritewidth = 4, e.width = 8 * t, e.repeat = !0, setSolid(e, "bridge-base") } function WarpWorld(e) { e.width = 106, e.height = 88, e.movement = setWarpWorldInit, e.collide = enableWarpWorldText, e.pirhanas = [], e.pipes = [], e.texts = [], e.hidden = !0, setSolid(e, "warpworld") } function setWarpWorldInit(e) { shiftHoriz(e, e.width * unitsized2), e.width /= 2, updateSize(e), e.movement = !1 } function enableWarpWorldText(e, t) { var n, x = t.pirhanas, r = t.texts; for (n in x) x[n].death(); for (n in r) r[n].element.style.visibility = ""; killNormal(t) } function resetScenery() { window.Scenery = { sprites: { BrickHalf: [8, 4], BrickPlain: [8, 8], Bush1: [16, 8], Bush2: [24, 8], Bush3: [32, 8], Castle: [75, 88], CastleDoor: [8, 20], CastleRailing: [8, 4], CastleRailingFilled: [8, 4], CastleTop: [12, 12], CastleWall: [8, 48], Cloud1: [16, 12], Cloud2: [24, 12], Cloud3: [32, 12], HillSmall: [24, 9.5], HillLarge: [40, 17.5], Fence: [8, 8], Pirhana: [8, 12], pirhana: [8, 12], PlantSmall: [7, 15], PlantLarge: [8, 23], Railing: [4, 4], ShroomTrunk: [8, 8], String: [1, 1], TreeTrunk: [8, 8], Water: { 0: 4, 1: 5, spriteCycle: ["one", "two", "three", "four"] }, WaterFill: [4, 5] }, patterns: { backreg: [ ["HillLarge", 0, 0], ["Cloud1", 68, 68], ["Bush3", 92, 0], ["HillSmall", 128, 0], ["Cloud1", 156, 76], ["Bush1", 188, 0], ["Cloud3", 220, 68], ["Cloud2", 292, 76], ["Bush2", 332, 0], ["Blank", 384] ], backcloud: [ ["Cloud2", 28, 64], ["Cloud1", 76, 32], ["Cloud2", 148, 72], ["Cloud1", 228, 0], ["Cloud1", 284, 32], ["Cloud1", 308, 40], ["Cloud1", 372, 0], ["Blank", 384] ], backcloudmin: [ ["Cloud1", 68, 68], ["Cloud1", 156, 76], ["Cloud3", 220, 68], ["Cloud2", 292, 76], ["Blank", 384] ], backfence: [ ["PlantSmall", 88, 0], ["PlantLarge", 104, 0], ["Fence", 112, 0, 4], ["Cloud1", 148, 68], ["PlantLarge", 168, 0], ["PlantSmall", 184, 0], ["PlantSmall", 192, 0], ["Cloud1", 220, 76], ["Cloud2", 244, 68], ["Fence", 304, 0, 2], ["PlantSmall", 320, 0], ["Fence", 328, 0], ["PlantLarge", 344, 0], ["Cloud1", 364, 76], ["Cloud2", 388, 68], ["Blank", 384] ], backfencemin: [ ["PlantLarge", 104, 0], ["Fence", 112, 0, 4], ["Cloud1", 148, 68], ["PlantLarge", 168, 0], ["PlantSmall", 184, 0], ["PlantSmall", 192, 0], ["Cloud1", 220, 76], ["Cloud2", 244, 68], ["Fence", 304, 0, 2], ["PlantSmall", 320, 0], ["Fence", 328, 0], ["Cloud1", 364, 76], ["Cloud2", 388, 68], ["Blank", 384] ], backfencemin2: [ ["Cloud2", 4, 68], ["PlantSmall", 88, 0], ["PlantLarge", 104, 0], ["Fence", 112, 0, 1], ["Fence", 128, 0, 2], ["Cloud1", 148, 68], ["PlantSmall", 184, 0], ["PlantSmall", 192, 0], ["Cloud1", 220, 76], ["Cloud2", 244, 68], ["Fence", 304, 0, 2], ["PlantSmall", 320, 0], ["Fence", 328, 0], ["PlantLarge", 344, 0], ["Cloud1", 364, 76], ["Cloud2", 388, 68], ["Blank", 384] ], backfencemin3: [ ["Cloud2", 4, 68], ["PlantSmall", 88, 0], ["PlantLarge", 104, 0], ["Fence", 112, 0, 4], ["Cloud1", 148, 68], ["PlantSmall", 184, 0], ["PlantSmall", 192, 0], ["Cloud1", 220, 76], ["Cloud2", 244, 68], ["Cloud1", 364, 76], ["Cloud2", 388, 68], ["Blank", 384] ] } }, processSceneryPatterns(Scenery.patterns) } function processSceneryPatterns(e) { var t, n; for (n in e)(t = e[n]).length && (t.width = t[t.length - 1][1], t.pop()) } function SceneryBlocker(e, t, n) { e.width = t || 8, e.height = n || 8, e.nocollide = e.hidden = !0, setSolid(e, "sceneryblocker") } function Sprite(e, t, n) { n || (n = [1, 1]); var x = e.template = Scenery.sprites[t]; x ? (e.width = (e.spritewidth = x[0]) * (n[0] || 1), e.height = (e.spriteheight = x[1]) * (n[1] || 1), e.unitwidth = e.spritewidth * unitsize, e.unitheight = e.spriteheight * unitsize, e.nocollide = e.maxquads = 1, e.repeat = !0, setScenery(e, "scenery " + t), e.title = t, x.spriteCycleTimer && TimeHandler.addSpriteCycle(e, spriteCycleTimer, spriteCycleTimer || void 0)) : log("No sprite template found for", t) } function LocationShifter(e, t, n) { e.loc = t, e.width = n[0], e.height = n[1], e.collide = collideLocationShifter, e.hidden = !0, setSolid(e, "blue") } function collideLocationShifter(e, t) { e.player && (t.nocollide = player.piping = !0, TimeHandler.addEvent((function(e) { shiftToLocation(t.loc), map.random && entryRandom(e) }), 1, e)) } function ScrollBlocker(e, t) { e.width = 40, e.height = 140, e.nocollide = e.hidden = !0, e.big = t, e.movement = function() { e.left - player.xvel <= gamescreen.right - gamescreen.left && (map.canscroll = e.movement = !1, map.noscroll = e.big) }, setSolid(e, "scrollblocker") } function ScrollEnabler(e) { e.width = 40, e.height = 140, e.hidden = !0, e.collide = function() { e.left - player.xvel <= gamescreen.right - gamescreen.left && (map.canscroll = e.nocollide = !0) }, setSolid(e, "scrollenabler") } function zoneToggler(e, t) { e.width = 40, e.height = 140, e.func = t, e.hidden = !0, e.collide = function(e, t) { t.func(), t.nocollide = !0 }, setSolid(e, "zonetoggler " + t.name) } function GenerationStarter(e, t, n) { e.width = 8, e.height = gamescreen.height + 20, e.func = t, e.arg = n, e.collide = function(e, t) { if ("player" != e.type) return !1; spawnMap(), killNormal(t) }, e.movement = function(e) { e.movement = !1, addClass(e, "used"), e.func((gamescreen.left + e.right) / unitsize, e.arg) }, setSolid(e, "generationstarter"), e.hidden = !0 } function castleDecider(e, t, n) { e.height = ceilmax, e.width = 10, e.nocollide = !0, e.xloc = t, e.section = map.area.sections[n], e.next = map.area.sections[n + 1], e.movement = function(e) { if (!(e.left > gamescreen.right - gamescreen.left) && e.section.activated) { var t = e.section; t.numpass = t.colliders.length = 0, t.passed ? (++map.area.sections.current, e.next(e.xloc)) : t(e.xloc), t.activated = t.passed = !1, spawnMap(), killNormal(e) } }, setSolid(e, "decider blue " + n), e.hidden = !0 } function FuncCollider(e, t, n) { n ? (e.width = n[0], e.height = n[1]) : (e.width = 8, e.height = ceilmax + 40), e.collide = t, e.hidden = !0, setSolid(e, "funccollider blue " + t.name) } function FuncSpawner(e, t, n) { e.width = 8, e.height = 8, e.movement = function() { t(e, n) }, e.argument = n, e.nocollide = e.hidden = !0, setSolid(e, "funccollider blue " + t.name) } function Collider(e, t, n) { e.width = t[0], e.height = t[1], n instanceof Array ? (e.func = n[0] || function() {}, e.movement = n[1] || function() {}) : (e.func = n || function() {}, e.movement = !1), e.collide = function(e, t) { if (!e.player) return !1; t.func(e, t) }, setSolid(e, "collider blue " + e.func.name), e.hidden = !0 } function TonedJS(e) { var t = { giveSup: function(e, t) { for (var n in t = t || {}, e) t[n] = e[n]; return t }, giveSub: function(e, t) { for (var n in t = t || {}, e) t.hasOwnProperty(n) || (t[n] = e[n]); return t }, proliferate: function(e, t, n) { var x, r; for (r in t) n && e.hasOwnProperty(r) || ("object" == typeof(x = t[r]) && null != x ? (e.hasOwnProperty(r) || (e[r] = x instanceof Array ? [] : {}), proliferate(e[r], x, n)) : e[r] = x); return e }, getFirst: function(e, t) { for (var n in e) return t ? n : e[n] }, getLast: function(e, t) { for (var n in e); return t ? n : e[n] }, followPath: function(e, t, n) { return null != t[n] && null != e[t[n]] ? followPath(e[t[n]], t, ++n) : e }, createElement: function(e) { for (var t = document.createElement(e || "div"), n = arguments.length; --n > 0;) proliferate(t, arguments[n]); return t }, classAdd: function(e, t) { e.className += " " + t }, classRemove: function(e, t) { e.className = e.className.replace(new RegExp(" " + t, "gm"), "") }, elementSetPosition: function(e, t, n) { null == t && (t = e.left), null == n && (n = e.top), proliferate(e, { left: t, top: n, style: { marginLeft: t + "px", marginTop: n + "px" } }) }, elementShiftLeft: function(e, t) { e.left || (e.left = Number(e.style.marginLeft.replace("px", ""))), e.style.marginLeft = round(e.left += t) + "px" }, elementShiftTop: function(e, t) { e.top || (e.top = Number(e.style.marginLeft.replace("px", ""))), e.style.marginTop = round(e.top += t) + "px" }, removeChildSafe: function(e, t) { e && (t = t || document.body).contains(e) && t.removeChild(e) }, findParentOfType: function(e, t) { var n = e.parentElement; return n && n.nodeName != t ? findParentType(n, t) : n }, clearAllTimeouts: function() { for (var e = setTimeout((function() {})); e--;) clearTimeout(e) }, stringTrim: function(e) { return e.replace(/^\s+|\s+$/g, "") }, stringOf: function(e, t) { return 0 == t ? "" : new Array(1 + (t || 1)).join(e) }, stringHas: function(e, t) { return -1 != e.indexOf(t) }, stringHasI: function(e, t) { return -1 != e.toLowerCase().indexOf(t.toLowerCase()) }, capitalizeFirst: function(e, t) { return t = t || 1, e.substr(0, t).toUpperCase() + e.substr(t).toLowerCase() }, ArrayD: function(e) { if (1 == arguments.length) return new Array(e); var t, n = arrayMake(arguments), x = new Array(e); for (n.shift(), t = e - 1; t >= 0; --t) x[t] = ArrayD.apply(this, n); return x }, arrayOf: function(e, t) { t = t || 1; for (var n = new Array(t); t--;) n[t] = e; return n }, arrayMake: function(e) { return Array.prototype.slice.call(e) }, arrayRange: function(e, t) { for (var n = 1 + t - e, x = new Array(n), r = e, i = 0; i < n;) x[i++] = r++; return x }, arrayShuffle: function(e, t, n) { t = t || 0, n = n || e.length; for (var x, r, i = t; i <= n; ++i) r = randInt(i + 1), x = e[i], e[i] = e[r], e[r] = x; return e }, removeDuplicates: function(e) { var t, n, x, r, i, a = []; for (r = 0, x = e.length; r < x; ++r) { for (t = e[r], n = !1, i = 0; i < r; ++i) if (e[i] == t) { n = !0; break } n || a.push(t) } return a }, makeDigit: function(e, t, n) { return e = String(e), stringOf(n || 0, max(0, t - e.length)) + e }, roundDigit: function(e, t) { return Number(t ? ~~(.5 + e / t) * t : round(e)) }, sign: function(e) { return e ? e < 0 ? -1 : 1 : 0 }, round: function(e) { return ~~(.5 + e) }, max: Math.max, min: Math.min, abs: Math.abs, pow: Math.pow, ceil: Math.ceil, floor: Math.floor, random: Math.random, randInt: function(e) { return floor(Math.random() * (e || 1)) }, signBool: function(e) { return e > 0 }, log: console.log.bind(console), now: Date.now }; return e && t.giveSub(t, window), t } function resetTriggers() { window.controls = new Controls({ left: [37, 65, "AXIS_LEFT", "DPAD_LEFT"], right: [39, 68, "AXIS_RIGHT", "DPAD_RIGHT"], up: [38, 87, 32, "FACE_1", "DPAD_UP", "LEFT_BOTTOM_SHOULDER"], down: [40, 83, "AXIS_DOWN", "DPAD_DOWN"], sprint: [16, 17, "FACE_1"], pause: [80, "START_FORWARD"], mute: [77], q: [81], l: [76] }), window.gamepad = new Gamepad, gamepad.bind(Gamepad.Event.BUTTON_DOWN, ControlsPipe("keydown", !0)), gamepad.bind(Gamepad.Event.BUTTON_UP, ControlsPipe("keyup", !1)), gamepad.bind(Gamepad.Event.AXIS_CHANGED, (function(e) { var t = e.value, n = abs(t); if (!(n < .1)) switch (e.axis) { case "LEFT_STICK_Y": case "RIGHT_STICK_Y": n > .5 ? keydown(t > 0 ? "DPAD_DOWN" : "DPAD_UP") : (keyup("DPAD_UP"), keyup("DPAD_DOWN")); break; case "LEFT_STICK_X": case "RIGHT_STICK_X": n > .5 ? keydown(t < 0 ? "DPAD_LEFT" : "DPAD_RIGHT") : (keyup("DPAD_UP"), keyup("DPAD_DOWN")) } })), gamepad.init(), proliferate(body, { onkeydown: ControlsPipe("keydown", !0), onkeyup: ControlsPipe("keyup", !1), oncontextmenu: contextmenu, onmousedown: mousedown }), setMessageTriggers() } function Controls(e, t) { this.pipes = e; var n, x, r, i, a = this.keydown = { left: function(e) { e.run = -1, e.left_down = !0 }, right: function(e) { e.run = 1, e.right_down = !0 }, up: function(e) { e.up = !0, player.canjump && (player.resting || map.underwater) && (e.jump = 1, player.canjump = e.jumplev = 0, AudioPlayer.play(player.power > 1 ? "Jump Super" : "Jump Small"), map.underwater && setTimeout((function() { player.jumping = e.jump = !1 }), 14 * timer)) }, down: function(e) { e.crouch = !0 }, sprint: function(e) { 3 != player.power || 0 != e.sprint || e.crouch || player.fire(), e.sprint = 1 }, pause: function(e) { paused || window.editing && !editor.playing || setTimeout((function() { pause(!0) }), 140) }, mute: function(e) { AudioPlayer.toggleMute() }, q: function(e) { switch (++qcount > 28 && maxlulz(), qcount) { case 7: lulz(); break; case 14: superlulz(); break; case 21: hyperlulz() } }, l: function(e) { toggleLuigi() } }, o = this.keyup = { left: function(e) { e.run = 0, e.left_down = !1 }, right: function(e) { e.run = 0, e.right_down = !1 }, up: function(e) { map.underwater || (e.jump = e.up = 0), player.canjump = !0 }, down: function(e) { e.crouch = 0, removeCrouch() }, sprint: function(e) { e.sprint = 0 }, pause: function(e) { unpause(!0) } }; for (n in e) for (i in x = e[n]) a[r = x[i]] = a[n], o[r] = o[n] } function ControlsPipe(e, t) { var n = controls[e]; return function(x) { t && (player && player.dead || window.paused) || window.nokeys || (("number" != typeof x || x.which || x.control) && (x = x.which || x.control), n[x] ? n[x](player.keys) : mlog(e, "Could not", e, x), window.gamehistory[gamecount] = [keydown, x]) } } function keydown(e) { if (!(player && player.dead || window.paused || window.nokeys)) { var t = controls.keydown; ("object" == typeof e || e.which) && (e = e.which), t[e] && t[e](player.keys), window.gamehistory[gamecount] = [keydown, e] } } function keyup(e) { if (!window.nokeys) { var t = controls.keyup; ("object" == typeof e || e.which) && (e = e.which), t[e] && t[e](player.keys), window.gamehistory[gamecount] = [keyup, e] } } function contextmenu(e) { e.preventDefault && e.preventDefault() } function mousedown(e) { 3 == e.which && (paused ? unpause() : window.editor && (editing || editor.playing) || pause(!0), e.preventDefault && e.preventDefault()) } function scriptKeys(e) { var t, n; for (t in e) n = e[t], TimeHandler.addEvent(n[0], t, n[1]), TimeHandler.addEvent((function() { alert(n[0].name + ", " + n[1]) }), t) } function lulz(e, t) { player.star = !0, e = e || [Goomba], t = t || 7, TimeHandler.addEventInterval((function() { if (!(characters.length > 210)) { var t = new Thing(e[randInt(e.length)], randBoolJS(), randBoolJS()); t.yvel = random() * -unitsizet4, t.xvel = t.speed = random() * unitsizet2 * randSign(), addThing(t, (32 * random() + 128) * unitsize, 88 * random() * unitsize) } }), t, 1 / 0) } function superlulz() { lulz([Goomba, Koopa, Beetle, HammerBro, Lakitu, Podoboo, Blooper]) } function hyperlulz() { lulz([Bowser], 21) } function maxlulz() { TimeHandler.addEventInterval((function(e) { setAreaSetting(e[randInt(e.length)]) }), 7, 1 / 0, ["Overworld", "Underworld", "Underwater", "Sky", "Castle"]) } function mapKeyToControl(e, t) { if (-1 == window.controls.pipes[e].indexOf(t)) { window.controls.pipes[e].push(t); var n = window.controls.pipes; window.controls = new Controls(n), proliferate(body, { onkeydown: ControlsPipe("keydown", !0), onkeyup: ControlsPipe("keyup", !1), oncontextmenu: contextmenu, onmousedown: mousedown }) } } function setMessageTriggers() { var e = { setMap: triggerSetMap, startEditor: function() { loadEditor() }, toggleOption: function(e) { var t = "toggle" + e.option; console.log(t, window[t]), window[t] ? window[t]() : log("Could not toggle", t) }, setKey: function(e) { mapKeyToControl(e.action, e.keyCode) } }; window.addEventListener("message", (function(t) { var n = t.data, x = n.type; e[x] ? e[x](n) : console.log("Unknown event type received:", x, ".\n", n) })) } function triggerSetMap(e) { clearPlayerStats(), setMap.apply(this, e.map || []), setLives(3) } function upkeep() { if (!window.paused) { window.nextupk = setTimeout(upkeep, timer); for (var e = window.speed; e > 0; --e) adjustFPS(), QuadsKeeper.determineAllQuadrants(solids), maintainSolids(), maintainCharacters(), maintainPlayer(), texts.length && maintainTexts(), TimeHandler.handleEvents(), refillCanvas() } } function adjustFPS() { window.time_now = now(); var e = time_now - time_prev, t = roundDigit(1e3 / e, .001); window.fps = roundDigit(.7 * fps + .3 * t, .01), window.realtime = fps_target / fps, window.time_prev = time_now } function pause(e) { paused && !window.nextupk || (cancelAnimationFrame(nextupk), AudioPlayer.pause(), paused = !0, e && AudioPlayer.play("Pause")) } function unpause() { paused && (window.nextupk = requestAnimationFrame(upkeep), paused = !1, AudioPlayer.resume()) } function maintainSolids(e) { for (var t, n = 0; n < solids.length; ++n)(t = solids[n]).alive && t.movement && t.movement(t), (!t.alive || t.right < QuadsKeeper.getDelX()) && deleteThing(t, solids, n) } function maintainCharacters(e) { var t, n, x = gamescreen.right + QuadsKeeper.getOutDifference(); for (n = 0; n < characters.length; ++n)(t = characters[n]).resting ? t.yvel = 0 : (t.nofall || (t.yvel += t.gravity || map.gravity), t.yvel = min(t.yvel, map.maxyvel)), updatePosition(t), QuadsKeeper.determineThingQuadrants(t), t.under = t.undermid = !1, determineThingCollisions(t), t.resting && (characterOnResting(t, t.resting) ? (t.yvel = !1, setBottom(t, t.resting.top)) : t.resting = !1), t.alive ? "player" == t.type || map.shifting || !(0 == t.numquads || t.left > x) || t.outerok ? !t.nomove && t.movement && t.movement(t) : deleteThing(t, characters, n) : map.shifting || deleteThing(t, characters, n) } function maintainPlayer(e) { if (player.alive) { if (player.yvel > 0 && (map.underwater || (player.keys.jump = 0), player.jumping || (map.underwater ? player.paddling || (switchClass(player, "paddling", "paddling"), player.padding = !0) : (addClass(player, "jumping"), player.jumping = !0)), !player.piping && !player.dying && player.top > gamescreen.deathheight)) { if (map.exitloc) return map.random ? (goToTransport(["Random", "Overworld", "Down"]), void playerDropsIn()) : shiftToLocation(map.exitloc); clearPlayerStats(), killPlayer(player, 2) } player.xvel > 0 ? player.right > gamescreen.middlex && player.right > gamescreen.right - gamescreen.left && (player.xvel = min(0, player.xvel)) : player.left < 0 && (player.xvel = max(0, player.xvel)), player.under && (player.jumpcount = 0), window.scrolloffset = map.canscroll * (player.right - gamescreen.middlex), scrolloffset > 0 && !map.shifting ? scrollWindow(lastscroll = round(min(player.scrollspeed, scrolloffset))) : lastscroll = 0 } } function maintainTexts() { var e, t, n; for (n = texts.length - 1; n >= 0; --n) e = (t = texts[n]).element || t, t.xvel && elementShiftLeft(e, t.xvel), t.yvel && elementShiftTop(e, t.yvel) } function followPath(e, t, n) { return null != t[n] && null != e[t[n]] ? followPath(e[t[n]], t, ++n) : e } function clearAllTimeouts() { for (var e = setTimeout((function() {})); e--;) clearTimeout(e) } function getCanvas(e, t, n) { var x = createElement("canvas", { width: e, height: t }); return n && (n = n || unitsize, proliferate(x.style, { width: e * n + "px", height: t * n + "px" })), x.getContext("2d").webkitImageSmoothingEnabled = !1, x } function step(e) { unpause(), upkeep(), pause(), e > 0 && step(e - 1) } function fastforward(e) { window.speed = max(0, parseInt(e || 0)) + 1 } function toggleFastFWD(e) { window.fastforwarding ? (fastforward(0), window.fastforwarding = !1) : (fastforward(2), window.fastforwarding = !0) } function specifyTimer(e) { timer = e, requestAnimationFrame = function(e) { window.setTimeout(e, timer) } } function changeUnitsize(e) { function t(e) { for (i in e) updateSize(e[i]), updatePosition(e[i]) } e && (resetUnitsize(e), t(solids), t(characters)) } function randTrue(e) { return floor(getSeed() * ((e || 1) + 1)) } function randSign(e) { return 2 * randTrue(e) - 1 } function randBoolJS(e) { return floor(2 * random()) } function updatePosition(e) { e.nomove || shiftHoriz(e, e.xvel), e.nofall || shiftVert(e, e.yvel) } function updateSize(e) { var t; e.unitwidth = e.width * unitsize, e.unitheight = e.height * unitsize, e.spritewidthpixels = e.spritewidth * unitsize, e.spriteheightpixels = e.spriteheight * unitsize, (t = e.canvas) && (t.width = e.spritewidthpixels, t.height = e.spriteheightpixels, refillThingCanvas(e)) } function reduceHeight(e, t, n) { e.top += t, e.height -= t / unitsize, n && updateSize(e) } function shiftBoth(e, t, n) { e.noshiftx || shiftHoriz(e, t), e.noshifty || shiftVert(e, n) } function shiftHoriz(e, t) { e.left += t, e.right += t } function shiftVert(e, t) { e.top += t, e.bottom += t } function setLeft(e, t) { e.left = t, e.right = e.left + e.width * unitsize } function setRight(e, t) { e.right = t, e.left = e.right - e.width * unitsize } function setTop(e, t) { e.top = t, e.bottom = e.top + e.height * unitsize } function setBottom(e, t) { e.bottom = t, e.top = e.bottom - e.height * unitsize } function setWidth(e, t, n, x) { e.width = t, e.unitwidth = t * unitsize, n && (e.spritewidth = t, e.spritewidthpixels = t * unitsize), x && (updateSize(e), setThingSprite(e)) } function setHeight(e, t, n, x) { e.height = t, e.unitheight = t * unitsize, n && (e.spriteheight = t, e.spriteheightpixels = t * unitsize), x && (updateSize(e), setThingSprite(e)) } function setSize(e, t, n, x, r) { t && setWidth(e, t, x), n && setHeight(e, n, x), r && (updateSize(e), setThingSprite(e)) } function setMidX(e, t, n) { setLeft(e, t + e.width * unitsized2, n) } function getMidX(e) { return e.left + e.width * unitsized2 } function setMidY(e, t, n) { setTop(e, t + e.height * unitsized2, n) } function setMidXObj(e, t, n) { setLeft(e, t.left + t.width * unitsized2 - e.width * unitsized2, n) } function slideToXLoc(e, t, n, x) { n = n || 1 / 0; var r = getMidX(e); shiftHoriz(e, r < t ? min(n, t - r) : max(-n, t - r), x) } function updateLeft(e, t) { e.left += t, e.right = e.left + e.width * unitsize } function updateRight(e, t) { e.right += t, e.left = e.right - e.width * unitsize } function updateTop(e, t) { e.top += t, e.bottom = e.top + e.height * unitsize } function updateBottom(e, t) { e.bottom += t, e.top = e.bottom - e.height * unitsize } function increaseHeightTop(e, t, n) { e.top -= t, e.height += t / unitsize, e.unitheight = e.height * unitsize } function determineThingCollisions(e) { if (!e.nocollide) { var t, n, x, r, i, a, o; for (e.resting && 0 != e.resting.yvel || (e.resting = !1), e.skipoverlaps || checkOverlap(e), r = 0, a = e.numquads; r < a; ++r) for (n = (t = e.quadrants[r]).things, i = 0, o = t.numthings; i < o && e != (x = n[i]); ++i) !x.alive || x.scenery || x.nocollide || !objectsTouch(e, x) || !e.player && x.hidden && x.visual_scenery && x.visual_scenery.hidden && !solidOnCharacter(x, e) || (x.character ? objectsCollided(e, x) : e.nocollidesolid || (objectsCollided(e, x), e.skipoverlaps || x.skipoverlaps || !characterOverlapsSolid(e, x) || e.overlaps.push(x))); e.undermid ? e.undermid.bottomBump(e.undermid, e) : e.under instanceof Thing && e.under.bottomBump(e.under, e) } } function checkOverlap(e) { if (e.overlapdir) e.overlapdir < 0 && e.right <= e.ocheck.left + unitsizet2 || e.left >= e.ocheck.right - unitsizet2 ? (e.overlapdir = 0, e.overlaps = []) : shiftHoriz(e, e.overlapdir, !0); else if (e.overlaps.length > 0) { var t, n, x = e.overlaps, r = { right: -1 / 0 }, i = { left: 1 / 0 }, a = 0; for (n in e.overlapfix = !0, x) a += getMidX(t = x[n]), t.right > r.right && (r = t), t.left < i.left && (i = t); a /= x.length, getMidX(e) >= a - unitsized16 ? (e.overlapdir = unitsize, e.ocheck = r) : (e.overlapdir = -unitsize, e.ocheck = i) } } function characterOverlapsSolid(e, t) { return e.top <= t.top && e.bottom > t.bottom } function objectsTouch(e, t) { return e.right - unitsize > t.left && e.left + unitsize < t.right && e.bottom >= t.top && e.top <= t.bottom } function charactersTouch(e, t) { return !(e.bottom <= t.top + unitsizet2 || e.top + unitsizet2 >= t.bottom) } function objectInQuadrant(e, t) { return e.right + unitsize >= t.left && e.left - unitsize <= t.right && e.bottom + unitsize >= t.top && e.top - unitsize <= t.bottom } function objectsCollided(e, t) { return e.solid && !t.solid ? objectsCollided(t, e) : t.up && e != t.up ? characterTouchesUp(e, t) : void(t.solid || e.player ? t.collide(e, t) : e.collide(t, e)) } function objectToLeft(e, t) { return (e.left + e.right) / 2 < (t.left + t.right) / 2 } function objectOnTop(e, t) { return !("solid" == e.type && t.yvel > 0) && (!(e.yvel < t.yvel && "solid" != t.type) && (!!(e.player && e.bottom < t.bottom && "enemy" == t.group) || e.left + unitsize < t.right && e.right - unitsize > t.left && (e.bottom - t.yvel <= t.top + t.toly || e.bottom <= t.top + t.toly + abs(e.yvel - t.yvel)))) } function objectOnSolid(e, t) { return e.left + unitsize < t.right && e.right - unitsize > t.left && (e.bottom - e.yvel <= t.top + t.toly || e.bottom <= t.top + t.toly + abs(e.yvel - t.yvel)) } function solidOnCharacter(e, t) { return !(t.yvel >= 0) && (t.midx = getMidX(t), t.midx > e.left && t.midx < e.right && e.bottom - e.yvel <= t.top + t.toly - t.yvel) } function characterOnSolid(e, t) { return e.resting == t || objectOnSolid(e, t) && e.yvel >= 0 && e.left + e.xvel + unitsize != t.right && e.right - e.xvel - unitsize != t.left } function characterOnResting(e, t) { return objectOnSolid(e, t) && e.left + e.xvel + unitsize != t.right && e.right - e.xvel - unitsize != t.left } function characterTouchedSolid(e, t) { if (t.up != e) { if (characterOnSolid(e, t)) { if (t.hidden) return; e.resting = t, e.player && map.underwater && removeClass(e, "paddling") } else if (solidOnCharacter(t, e)) { var n = e.left + e.width * unitsize / 2; if (n > t.left && n < t.right) e.undermid = t; else if (t.hidden) return; e.under ? e.under.push(t) : e.under = [t], e.player && setTop(e, t.bottom - e.toly + t.yvel, !0), e.yvel = t.yvel, e.player && (e.keys.jump = 0) } t.hidden || characterNotBumping(e, t) || objectOnTop(e, t) || objectOnTop(t, e) || e.under || e == t.up || (e.right <= t.right ? (e.xvel = min(e.xvel, 0), shiftHoriz(e, max(t.left + unitsize - e.right, -unitsized2), !0)) : e.left >= t.left && (e.xvel = max(e.xvel, 0), shiftHoriz(e, min(t.right - unitsize - e.left, unitsized2), !0)), e.player ? t.actionLeft && t.actionLeft(e, t, t.transport) : (e.moveleft = !e.moveleft, "item" == e.group && e.collide(t, e))) } } function characterNotBumping(e, t) { return e.top + e.toly + abs(e.yvel) > t.bottom } function characterTouchesUp(e, t) { switch (e.group) { case "item": e.moveleft = getMidX(e) <= getMidX(t) + unitsized2, characterHops(e); break; case "coin": e.animate(e); break; default: e.death(e, 2), scoreEnemyBelow(e) } } function characterHops(e) { e.yvel = -1.4 * unitsize, e.resting = !1 } function characterIsAlive(e) { return !(!e || e.dead || !e.alive) } function scorePlayerShell(e, t) { return e.star ? score(t, 200, !0) : t.resting ? t.peeking ? score(t, 1e3, !0) : score(t, 100, !0) : score(t, 8e3, !0) } function scoreEnemyStomp(e) { switch (e.type.split(" ")[0]) { case "koopa": e.fly ? 400 : 100; break; case "bulletbill": case "cheepcheep": 200; break; case "hammerbro": 1e3; break; case "lakitu": 800; break; default: 100 } } function scoreEnemyFire(e) { var t = 200; switch (e.type.split(" ")[0]) { case "goomba": t = 100; break; case "hammerbro": t = 1e3; break; case "bowser": t = 5e3; break; default: t = 200 } scoreEnemyFin(e, t) } function scoreEnemyStar(e) { var t = 200; switch (e.type.split(" ")[0]) { case "goomba": t = 100; break; case "hammerbro": t = 1e3; break; default: t = 200 } scoreEnemyFin(e, t), AudioPlayer.play("Kick") } function scoreEnemyBelow(e) { var t = 100; switch (e.type.split(" ")[0]) { case "hammerbro": t = 1e3; break; default: t = 100 } scoreEnemyFin(e, t) } function scoreEnemyFin(e, t) { score(e, t, !0) } function moveSimple(e) { e.direction != e.moveleft && (e.moveleft ? (e.xvel = -e.speed, e.noflip || unflipHoriz(e)) : (e.noflip || flipHoriz(e), e.xvel = e.speed), e.direction = e.moveleft) } function moveSmart(e) { moveSimple(e), 0 != e.yvel || e.resting && !offResting(e) || (e.moveleft ? shiftHoriz(e, unitsize, !0) : shiftHoriz(e, -unitsize, !0), e.moveleft = !e.moveleft) } function offResting(e) { return e.moveleft ? e.right - unitsize < e.resting.left : e.left + unitsize > e.resting.right } function moveJumping(e) { moveSimple(e), e.resting && (e.yvel = -abs(e.jumpheight), e.resting = !1) } function moveFloating(e) { setPlatformEndpoints(e), e.begin = map.floor * unitsize - e.begin, e.end = map.floor * unitsize - e.end, (e.movement = moveFloatingReal)(e) } function moveFloatingReal(e) { e.top < e.end ? e.yvel = min(e.yvel + unitsized32, e.maxvel) : e.bottom > e.begin && (e.yvel = max(e.yvel - unitsized32, -e.maxvel)), movePlatformNorm(e) } function moveSliding(e) { setPlatformEndpoints(e), (e.movement = moveSlidingReal)(e) } function moveSlidingReal(e) { gamescreen.left + e.left < e.begin ? e.xvel = min(e.xvel + unitsized32, e.maxvel) : gamescreen.left + e.right > e.end && (e.xvel = max(e.xvel - unitsized32, -e.maxvel)), movePlatformNorm(e) } function setPlatformEndpoints(e) { if (e.begin > e.end) { var t = e.begin; e.begin = e.end, e.end = t } } function collideTransport(e, t) { characterTouchedSolid(e, t), t == e.resting && (t.movement = movePlatformNorm, t.collide = characterTouchedSolid, t.xvel = unitsized2) } function moveFalling(e) { if (e != player.resting) return e.yvel = 0; shiftVert(e, e.yvel += unitsized8), setBottom(player, e.top), e.yvel >= 2.8 * unitsize && (e.freefall = !0, e.movement = moveFreeFalling) } function moveFallingScale(e) { player.resting == e ? (shiftScaleStringVert(e, e.string, e.yvel += unitsized16), shiftScaleStringVert(e.partner, e.partner.string, -e.yvel), e.tension += e.yvel, e.partner.tension -= e.yvel) : e.yvel > 0 && (shiftScaleStringVert(e, e.string, e.yvel -= unitsized32), shiftScaleStringVert(e.partner, e.partner.string, -e.yvel), e.tension -= e.yvel, e.partner.tension += e.yvel), e.partner.tension <= 0 && (e.collide = e.partner.collide = characterTouchedSolid, e.movement = e.partner.movement = moveFreeFalling) } function moveFreeFalling(e) { shiftVert(e, e.yvel += unitsized16), e.yvel > unitsizet2 && (e.movement = function(e) { shiftVert(e, e.yvel) }) } function shiftScaleStringVert(e, t, n) { shiftVert(e, n), t.bottom = e.top, t.height = (t.bottom - t.top) / unitsize, updateSize(t) } function setClass(e, t) { e.className = t, setThingSprite(e) } function setClassInitial(e, t) { e.className = t } function addClass(e, t) { e.className += " " + t, setThingSprite(e) } function removeClass(e, t) { e.className = e.className.replace(new RegExp(" " + t, "gm"), ""), setThingSprite(e) } function switchClass(e, t, n) { removeClass(e, t), addClass(e, n) } function removeClasses(e) { var t, n, x; for (n = 1; n < arguments.length; ++n) for ((t = arguments[n]) instanceof Array || (t = t.split(" ")), x = t.length - 1; x >= 0; --x) removeClass(e, t[x]) } function addClasses(e, t) { for (var n = t instanceof Array ? t : t.split(" "), x = n.length - 1; x >= 0; --x) addClass(e, n[x]) } function addElementClass(e, t) { e.className += " " + t } function removeElementClass(e, t) { e.className = e.className.replace(new RegExp(" " + t, "gm"), "") } function flipHoriz(e) { addClass(e, "flipped") } function flipVert(e) { addClass(e, "flip-vert") } function unflipHoriz(e) { removeClass(e, "flipped") } function unflipVert(e) { removeClass(e, "flip-vert") } function deleteThing(e, t, n) { t.splice(n, 1), e.ondelete && e.ondelete() } function switchContainers(e, t, n) { t.splice(t.indexOf(e), 1), n.push(e) } function containerForefront(e, t) { t.splice(t.indexOf(e), 1), t.unshift(e) } function killNormal(e) { e && (e.hidden = e.dead = !0, e.alive = e.resting = e.movement = !1, TimeHandler.clearAllCycles(e)) } function killFlip(e, t) { flipVert(e), e.bottomBump = function() {}, e.nocollide = e.dead = !0, e.resting = e.movement = e.speed = e.xvel = e.nofall = !1, e.yvel = -unitsize, TimeHandler.addEvent((function(e) { killNormal(e) }), 70 + (t || 0)) } function generalMovement(e, t, n, x) { var r = setInterval((function() { shiftVert(e, n), shiftHoriz(e, t) }), timer); setTimeout((function() { clearInterval(r) }), x) } function blockBumpMovement(e) { var t = -3, n = setInterval((function() { shiftVert(e, t), 3.5 == (t += .5) && (clearInterval(n), e.up = !1), determineThingCollisions(e) }), timer) } function emergeUp(e, t) { AudioPlayer.play("Powerup Appears"), flipHoriz(e), e.nomove = e.nocollide = e.alive = e.nofall = e.emerging = !0, switchContainers(e, characters, scenery); var n = setInterval((function() { shiftVert(e, -unitsized8), e.bottom <= t.top && (clearInterval(n), switchContainers(e, scenery, characters), e.nocollide = e.nomove = e.moveleft = e.nofall = e.emerging = !1, e.emergeOut && e.emergeOut(e, t), e.movement && (e.movementsave = e.movement, e.movement = moveSimple, e.moving = TimeHandler.addEventInterval((function(e, t) { if (e.resting != t) return TimeHandler.addEvent((function(e) { e.movement = e.movementsave }), 1, e), !0 }), 1, 1 / 0, e, t))) }), timer) } function flicker(e, t, n) { t = round(t) || 49, n = round(n) || 3; e.flickering = !0, TimeHandler.addEventInterval((function(e) { e.hidden = !e.hidden }), n, t, e), TimeHandler.addEvent((function(e) { e.flickering = e.hidden = !1 }), t * n + 1, e) } function killOtherCharacters() { var e, t; if (window.characters) for (t = characters.length - 1; t >= 0; --t)(e = characters[t]).nokillend ? e.killonend && e.killonend(e) : deleteThing(e, characters, t); if (window.solids) for (t = solids.length - 1; t >= 0; --t) solids[t].killonend && deleteThing(solids[t], solids, t) } function lookTowardPlayer(e, t) { player.right <= e.left ? e.lookleft && !t || (e.lookleft = !0, e.moveleft = !1, unflipHoriz(e)) : player.left >= e.right && (e.lookleft || t) && (e.lookleft = !1, e.moveleft = !0, flipHoriz(e)) } function lookTowardThing(e, t) { t.right <= e.left ? (e.lookleft = !0, e.moveleft = !1, unflipHoriz(e)) : t.left >= e.right && (e.lookleft = !1, e.moveleft = !0, flipHoriz(e)) } function playCurrentThemeHurry(e) { AudioPlayer.playTheme("Hurry " + (e || area.theme)) }! function(e) { "use strict"; var t = function() {}, n = { getType: function() { return "null" }, isSupported: function() { return !1 }, update: t }, x = function(e) { var n = this, x = window; this.update = t, this.requestAnimationFrame = e || x.requestAnimationFrame || x.webkitRequestAnimationFrame || x.mozRequestAnimationFrame, this.tickFunction = function() { n.update(), n.startTicker() }, this.startTicker = function() { n.requestAnimationFrame.apply(x, [n.tickFunction]) } }; x.prototype.start = function(e) { this.update = e || t, this.startTicker() }; var r = function() {}; r.prototype.update = t, r.prototype.start = function(e) { this.update = e || t }; var i = function(e, t) { this.listener = e, this.gamepadGetter = t, this.knownGamepads = [] }; i.factory = function(e) { var t = n, x = window && window.navigator; return x && (void 0 !== x.webkitGamepads ? t = new i(e, (function() { return x.webkitGamepads })) : void 0 !== x.webkitGetGamepads && (t = new i(e, (function() { return x.webkitGetGamepads() })))), t }, i.getType = function() { return "WebKit" }, i.prototype.getType = function() { return i.getType() }, i.prototype.isSupported = function() { return !0 }, i.prototype.update = function() { var e, t, n = this, x = Array.prototype.slice.call(this.gamepadGetter(), 0); for (t = this.knownGamepads.length - 1; t >= 0; t--) e = this.knownGamepads[t], x.indexOf(e) < 0 && (this.knownGamepads.splice(t, 1), this.listener._disconnect(e)); for (t = 0; t < x.length; t++)(e = x[t]) && n.knownGamepads.indexOf(e) < 0 && (n.knownGamepads.push(e), n.listener._connect(e)) }; var a = function(e) { this.listener = e, window.addEventListener("gamepadconnected", (function(t) { e._connect(t.gamepad) })), window.addEventListener("gamepaddisconnected", (function(t) { e._disconnect(t.gamepad) })) }; a.factory = function(e) { var t = n; return window && void 0 !== window.addEventListener && (t = new a(e)), t }, a.getType = function() { return "Firefox" }, a.prototype.getType = function() { return a.getType() }, a.prototype.isSupported = function() { return !0 }, a.prototype.update = t; var o = function(e) { this.updateStrategy = e || new x, this.gamepads = [], this.listeners = {}, this.platform = n, this.deadzone = .03, this.maximizeThreshold = .97 }; o.UpdateStrategies = { AnimFrameUpdateStrategy: x, ManualUpdateStrategy: r }, o.PlatformFactories = [i.factory, a.factory], o.Type = { PLAYSTATION: "playstation", LOGITECH: "logitech", XBOX: "xbox", UNKNOWN: "unknown" }, o.Event = { CONNECTED: "connected", UNSUPPORTED: "unsupported", DISCONNECTED: "disconnected", TICK: "tick", BUTTON_DOWN: "button-down", BUTTON_UP: "button-up", AXIS_CHANGED: "axis-changed" }, o.StandardButtons = ["FACE_1", "FACE_2", "FACE_3", "FACE_4", "LEFT_TOP_SHOULDER", "RIGHT_TOP_SHOULDER", "LEFT_BOTTOM_SHOULDER", "RIGHT_BOTTOM_SHOULDER", "SELECT_BACK", "START_FORWARD", "LEFT_STICK", "RIGHT_STICK", "DPAD_UP", "DPAD_DOWN", "DPAD_LEFT", "DPAD_RIGHT", "HOME"], o.StandardAxes = ["LEFT_STICK_X", "LEFT_STICK_Y", "RIGHT_STICK_X", "RIGHT_STICK_Y"]; var l, s = function(e, t, n) { return t < e.length ? e[t] : n + (t - e.length + 1) }; o.StandardMapping = { env: {}, buttons: { byButton: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16] }, axes: { byAxis: [0, 1, 2, 3] } }, o.Mappings = [{ env: { platform: a.getType(), type: o.Type.PLAYSTATION }, buttons: { byButton: [14, 13, 15, 12, 10, 11, 8, 9, 0, 3, 1, 2, 4, 6, 7, 5, 16] }, axes: { byAxis: [0, 1, 2, 3] } }, { env: { platform: i.getType(), type: o.Type.LOGITECH }, buttons: { byButton: [1, 2, 0, 3, 4, 5, 6, 7, 8, 9, 10, 11, 11, 12, 13, 14, 10] }, axes: { byAxis: [0, 1, 2, 3] } }, { env: { platform: a.getType(), type: o.Type.LOGITECH }, buttons: { byButton: [0, 1, 2, 3, 4, 5, -1, -1, 6, 7, 8, 9, 11, 12, 13, 14, 10], byAxis: [-1, -1, -1, -1, -1, -1, [2, 0, 1], [2, 0, -1] ] }, axes: { byAxis: [0, 1, 3, 4] } }], o.prototype.init = function() { var e = o.resolvePlatform(this), t = this; return this.platform = e, this.updateStrategy.start((function() { t._update() })), e.isSupported() }, o.prototype.bind = function(e, t) { return void 0 === this.listeners[e] && (this.listeners[e] = []), this.listeners[e].push(t), this }, o.prototype.unbind = function(e, t) { if (void 0 !== e) { if (void 0 !== t) { if (void 0 === this.listeners[e]) return !1; for (var n = 0; n < this.listeners[e].length; n++) if (this.listeners[e][n] === t) return this.listeners[e].splice(n, 1), !0; return !1 } this.listeners[e] = [] } else this.listeners = {} }, o.prototype.count = function() { return this.gamepads.length }, o.prototype._fire = function(e, t) { if (void 0 !== this.listeners[e]) for (var n = 0; n < this.listeners[e].length; n++) this.listeners[e][n].apply(this.listeners[e][n], [t]) }, o.getNullPlatform = function() { return Object.create(n) }, o.resolvePlatform = function(e) { var t, x = n; for (t = 0; !x.isSupported() && t < o.PlatformFactories.length; t++) x = o.PlatformFactories[t](e); return x }, o.prototype._connect = function(e) { var t, n, x = this._resolveMapping(e); for (e.state = {}, e.lastState = {}, e.updater = [], t = x.buttons.byButton.length, n = 0; n < t; n++) this._addButtonUpdater(e, x, n); for (t = x.axes.byAxis.length, n = 0; n < t; n++) this._addAxisUpdater(e, x, n); this.gamepads[e.index] = e, this._fire(o.Event.CONNECTED, e) }, o.prototype._addButtonUpdater = function(e, t, n) { var x, r = s(o.StandardButtons, n, "EXTRA_BUTTON_"), i = this._createButtonGetter(e, t.buttons, n), a = this, l = { gamepad: e, control: r }; e.state[r] = 0, e.lastState[r] = 0, x = function() { var t = i(), n = e.lastState[r], x = t > .5, s = n > .5; e.state[r] = t, x && !s ? a._fire(o.Event.BUTTON_DOWN, Object.create(l)) : !x && s && a._fire(o.Event.BUTTON_UP, Object.create(l)), 0 !== t && 1 !== t && t !== n && a._fireAxisChangedEvent(e, r, t), e.lastState[r] = t }, e.updater.push(x) }, o.prototype._addAxisUpdater = function(e, t, n) { var x, r = s(o.StandardAxes, n, "EXTRA_AXIS_"), i = this._createAxisGetter(e, t.axes, n), a = this; e.state[r] = 0, e.lastState[r] = 0, x = function() { var t = i(), n = e.lastState[r]; e.state[r] = t, t !== n && a._fireAxisChangedEvent(e, r, t), e.lastState[r] = t }, e.updater.push(x) }, o.prototype._fireAxisChangedEvent = function(e, t, n) { var x = { gamepad: e, axis: t, value: n }; this._fire(o.Event.AXIS_CHANGED, x) }, o.prototype._createButtonGetter = (l = function() { return 0 }, function(e, t, n) { var x, r, i = l, a = this; return -1 !== (x = t.byButton[n]) ? "number" == typeof x && x < e.buttons.length && (i = function() { return e.buttons[x] }) : t.byAxis && n < t.byAxis.length && (x = t.byAxis[n], r = x, "[object Array]" === Object.prototype.toString.call(r) && 3 == x.length && x[0] < e.axes.length && (i = function(e, t, n) { var x = l; return t < n ? x = function() { var x = n - t, r = e(); return (r = (r - t) / x) < 0 ? 0 : r } : n < t && (x = function() { var x = t - n, r = e(); return (r = (r - n) / x) > 1 ? 0 : 1 - r }), x }(i = function() { var t = e.axes[x[0]]; return a._applyDeadzoneMaximize(t) }, x[1], x[2]))), i }), o.prototype._createAxisGetter = function() { var e = function() { return 0 }; return function(t, n, x) { var r, i = e, a = this; return -1 !== (r = n.byAxis[x]) && "number" == typeof r && r < t.axes.length && (i = function() { var e = t.axes[r]; return a._applyDeadzoneMaximize(e) }), i } }(), o.prototype._disconnect = function(e) { var t, n = []; for (void 0 !== this.gamepads[e.index] && delete this.gamepads[e.index], t = 0; t < this.gamepads.length; t++) void 0 !== this.gamepads[t] && (n[t] = this.gamepads[t]); this.gamepads = n, this._fire(o.Event.DISCONNECTED, e) }, o.prototype._resolveControllerType = function(e) { return -1 !== (e = e.toLowerCase()).indexOf("playstation") ? o.Type.PLAYSTATION : -1 !== e.indexOf("logitech") || -1 !== e.indexOf("wireless gamepad") ? o.Type.LOGITECH : -1 !== e.indexOf("xbox") || -1 !== e.indexOf("360") ? o.Type.XBOX : o.Type.UNKNOWN }, o.prototype._resolveMapping = function(e) { var t, n, x = o.Mappings, r = null, i = { platform: this.platform.getType(), type: this._resolveControllerType(e.id) }; for (t = 0; !r && t < x.length; t++) n = x[t], o.envMatchesFilter(n.env, i) && (r = n); return r || o.StandardMapping }, o.envMatchesFilter = function(e, t) { var n, x = !0; for (n in e) e[n] !== t[n] && (x = !1); return x }, o.prototype._update = function() { this.platform.update(), this.gamepads.forEach((function(e) { e && e.updater.forEach((function(e) { e() })) })), this.gamepads.length > 0 && this._fire(o.Event.TICK, this.gamepads) }, o.prototype._applyDeadzoneMaximize = function(e, t, n) { return t = void 0 !== t ? t : this.deadzone, n = void 0 !== n ? n : this.maximizeThreshold, e >= 0 ? e < t ? e = 0 : e > n && (e = 1) : e > -t ? e = 0 : e < -n && (e = -1), e }, e.Gamepad = o }("undefined" != typeof module && module.exports || window); var customMute = !0; function AudioPlayr(e) { "use strict"; var t, n, x, r, i, a, o, l, s, d, u = this.play = function(e) { var n = x[e]; if (!n) { if (!(n = t[e])) return console.log("Unknown sound: '" + e + "'"), n; x[e] = n } return n.name_raw = e, c(n), n.volume = !i, customMute || n.play(), n.used++ || n.addEventListener("ended", (function() { ! function(e, t) { x[t] && delete x[t] }(0, e) })), n }; function p(e) { customMute || e.play() } function c(e) { e && e.pause && (e.pause(), e.readyState && (e.currentTime = 0)) } function m(e, t) { var x, r, i = document.createElement("Audio"); for (r in h(i, d), n) x = n[r], i.appendChild(h(document.createElement("Source"), { type: "audio/" + x, src: a + "/" + t + "/" + x + "/" + e + "." + x })); return customMute || i.play(), i } function h(e, t) { var n, x; for (x in t) "object" == typeof(n = t[x]) ? (e[x] || (e[x] = {}), h(e[x], n)) : e[x] = n; return e } this.playLocal = function(e, t) { var n, x = u(e); if (!x) return x; switch (l.constructor) { case Function: n = l(t); break; case Number: n = l; break; default: n = Number(n) || 1 } return x.volume = x.volume_real = n = 0, x }, this.playTheme = function(e, t, n) { if (n = void 0 === n || n, !e) switch (s.constructor) { case Function: e = s(); break; case String: e = s }(i = r) && (c(i), r = void 0, delete x[i.name_raw]); var i = r = u(e); return i.loop = n, t || (i.used = !1), 1 == i.used && i.addEventListener("ended", this.playTheme), i }, this.addEventListener = function(e, t, n) { var r = x[e]; r && r.addEventListenever(t, n) }, this.addEventImmediate = function(e, t, n) { var r = x[e]; r && !r.paused ? r.addEventListener(t, n) : n() }, this.toggleMute = function() { for (var e in i = !i, x) x[e].volume = i ? 0 : x[e].volume_real || 1; o && (localStorage[o] = i) }, this.pause = function() { for (var e in x) x[e] && x[e].pause() }, this.resume = function() { for (var e in x) x[e] && !customMute && p(x[e]) }, this.pauseTheme = function() { r && r.pause() }, this.resumeTheme = function() { r && r.play() }, this.clear = function() { this.pause(), x = {}, this.theme = void 0 }, this.getLibrary = function() { return t }, this.getSounds = function() { return x }, function(e) { t = e.library || {}, n = e.filetypes || ["mp3", "ogg"], i = e.muted || !1, a = e.directory || "", o = e.localStorageMuted || "", l = e.getVolumeLocal || 1, s = e.getThemeDefault || "Theme"; var r = e.soundSettings || {}; d = e.soundSettings || { preload: r.preload || "auto", used: 0, volume: 0 }, x = {}, o && (i = localStorage[o]), function() { var e, n, x, r; for (x in t) for (r in e = t[x]) n = e[r], t[n] = m(n, x) }() }(e || {}) } function TimeHandlr(e) { "use strict"; var t, n, x, r, i, a, o, l, s; this.getTime = function() { return t }, this.getEvents = function() { return n }; var d = this.addEvent = function(e, n) { if (!(e instanceof Function)) return console.warn("Attempting to add an event that isn't a function."), console.log(arguments), !1; n = n || 1; var x = g(arguments); x.splice(0, 2); var r = { func: e, time_exec: t + n, time_repeat: n, args: x, repeat: 1 }; return c(r, r.time_exec), r }, u = this.addEventInterval = function(e, n, x) { if (!(e instanceof Function)) return console.warn("Attempting to add an event that isn't a function."), console.log(arguments), !1; n = n || 1, x = x || 1; var r = g(arguments); r.splice(0, 3); var i = { func: e, time_exec: t + n, time_repeat: n, args: r, repeat: x }; return e.event = i, c(i, i.time_exec), i }, p = this.addEventIntervalSynched = function(e, n, x, r, i) { var a = n * i.length, o = w(t / a) * a, l = this, s = function(e, n, x) { return x.startcount = t, u.apply(e, n) }; if (n = n || 1, x = x || 1, o == t) return s(l, arguments, r); var p = o - t; d(s, p, l, arguments, r) }; function c(e, t) { return n[t] ? (n[t].push(e), n[t]) : n[t] = [e] } this.clearEvent = function(e) { e && (e.repeat = 0) }, this.clearAllEvents = function() { n = {} }; var m = this.clearClassCycle = function(e, t) { if (e[x] && e[x][t]) { var n = e[x][t]; n[0] = !1, n.length = !1, delete e[x][t] } }; this.clearAllCycles = function(e) { var t, n, x = e[x]; for (t in x)(n = x[t])[0] = !1, n.length = 1, delete x[t] }, this.addSpriteCycle = function(e, t, n, r) { e[x] || (e[x] = {}), m(e, n); var i = "function" == typeof r; n = n || 0; var a = e[x][n] = h(e, t, i ? 0 : r); return a.event && i && (a.event.count_changer = r), f(e, t), a }, this.addSpriteCycleSynched = function(e, t, n, r) { e[x] || (e[x] = {}), m(e, n), n = n || 0; var i = e[x][n] = h(e, t, r, !0); return f(e, t), i }; function h(e, t, n, x) { t.loc = t.oldclass = -1; var a = x ? p : u; return e[r] = function() { a(f, n || o, 1 / 0, e, t) }, e[i] && e[r](), t } function f(e, t) { if (!e || !t || !t.length) return !0; if (null != a && !e[a]) return !0; - 1 != t.oldclass && "" !== t.oldclass && s(e, t.oldclass), t.loc = ++t.loc % t.length; var n = t[t.loc]; if (n) { var x = n instanceof Function ? n(e, t) : n; return "string" == typeof x ? (t.oldclass = x, l(e, x), !1) : !1 === x } return !1 === n } function g(e) { return Array.prototype.slice.call(e) } function v(e, t) { e.className += " " + t } function y(e, t) { e.className = e.className.replace(new RegExp(" " + t, "gm"), "") } this.handleEvents = function() { ++t; var e = n[t]; if (e) { var x, r, i; for (i = 0, r = e.length; i < r; ++i)(x = e[i]).repeat > 0 && !x.func.apply(this, x.args) && (x.count_changer && x.count_changer(x), x.repeat instanceof Function ? x.repeat.bind(x)() && (x.count += x.time_repeat, c(x, x.time_exec)) : --x.repeat > 0 && (x.time_exec += x.time_repeat, c(x, x.time_exec))); delete n[t] } }; var w = Math.ceil; ! function(e) { t = e.time || 0, n = e.events || {}, x = e.cycles || "cycles", e.className || "className", r = e.onSpriteCycleStart || "onSpriteCycleStart", i = e.doSpriteCycleStart || "doSpriteCycleStart", a = e.cycleCheckValidity, o = e.timingDefault || 7, l = e.addClass || window.addClass || v, s = e.removeClass || window.removeClass || y }(e || {}) } function QuadsKeepr(e) { "use strict"; var t, n, x, r, i, a, o, l, s, d, u, p, c, m, h, f, g, v, y, w, T, S; this.getQuadrants = function() { return t }, this.getNumQuads = function() { return x }, this.getNumRows = function() { return r }, this.getNumCols = function() { return i }, this.getQuadWidth = function() { return l }, this.getQuadHeight = function() { return s }, this.getDelX = function() { return u }, this.getOutDifference = function() { return p }; var P = this.resetQuadrants = function() { t.length = 0, n.length = 0; for (var e = 0; e < i; ++e) C((e - 2) * l); c = t[0] }; function b(e, t) { this.left = t, this.top = (e - 1) * s, this.right = this.left + l, this.bottom = this.top + s, this.things = [], this.numobjects = this.tolx = this.toly = 0 } function C(e) { for (var x = [], i = 0; i < r; ++i) m = new b(i, e), x.push(m), t.push(m); n.push(x) } function k() { n.shift(); for (var e = 0; e < r; ++e) t.shift(); c = t[0], p = l } function z(e) { for (var t = 0, n = e.length; t < n; ++t) E(e[t]) } this.updateQuadrants = function(e) { for (p += e = e || 0; c.left <= u;) k(), C(m.right), S && S() }, this.determineAllQuadrants = function() { var e, n; for (e = 0; e < x; ++e) t[e].numthings = 0; for (e = 0, n = arguments.length; e < n; ++e) z(arguments[e]) }; var E = this.determineThingQuadrants = function(e) { e[y] = 0; for (var n = 0; n < x; ++n) if (A(e, t[n]) && (B(e, t[n], n), e[y] > e[w])) return }; function B(e, t, n) { e[T][e[y]] = t, ++e[y], t.things[t.numthings] = e, ++t.numthings } function A(e, t) { return e[g] + d >= t.left && e[h] - d <= t.right && e[v] + d >= t.top && e[f] - d <= t.bottom }! function(e) { t = [], n = [], x = e.num_quads, r = e.num_rows, i = e.num_cols, x ? (r && (i = x / r), i && (r = x / i)) : (r || (r = 2), i || (i = 2), x = r * i), a = e.screen_width || 640, o = e.screen_height || 480, l = a / (i - 3), s = o / (r - 2), d = e.tolerance || 0, u = e.delx || -2 * l, p = l, h = e.thing_left || "left", g = e.thing_right || "right", f = e.thing_top || "top", v = e.thing_bottom || "bottom", y = e.thing_num_quads || "numquads", w = e.thing_max_quads || "maxquads", T = e.thing_quadrants || "quadrants", S = e.onUpdate, e.onCollide, P() }(e || {}) }