export default class Plugin extends Patch{ name = "Disable Animations" version = "22.03.16" description = "Turn off most of the animated elements in the game" author = "Katie Frogs" disabledAnimations = { "title screen proceed": true, "highlight": true, "dropzone fade": true, "loading gif": true, // song select "song select background": true, "song select background fade": true, "song select move": true, "song select fade in": true, "song select ura fade": true, "song select ura arrow": true, // in-game "pause don": true, "don background": true, "song background": true, "taiko pressed keys": true, "taiko pressed keys fade": true, "combo change": true, "bar pressed keys": true, "judge score jump": true, "judge score fade": false, "note faces": true, "note explosion": true, "pause note explosion": true, "note shadow": true, "note shadow fade out": true, "flying notes": true, "flying note fade": true, "go go time fire fade": true, "pause go go time fire": true, "go go time fireworks": true, "pause go go time fireworks": true, "branch bar change": false, "branch text change": true, // results "results fade in": true, "results object fade in": true, "results crown": true, "results countup": true, "results tetsuo and hana": true, "results mikoshi": true, "results flowers": true, "results fade out": true, } load(){ var d = this.disabledAnimations this.addEdits( new EditFunction(SongSelect.prototype, "init").load(str => { if(d["song select move"]) str = plugins.strReplace(str, 'speed: 400', `speed: 0`) return str }), new EditFunction(SongSelect.prototype, "redraw").load(str => { if(d["song select move"]){ str = plugins.strReplace(str, '(key === "right" || key === "left") ? 20', `(key === "right" || key === "left") ? 150`) str = plugins.insertBefore(str, `resize && `, 'this.state.moveMS && ms < this.state.moveMS + changeSpeed') str = plugins.insertAfter(str, 'var elapsed = ms - this.state.moveMS', ` if(this.state.move){ this.state.waitPreview = ms + 400 if(this.previewing !== null){ this.endPreview() } }`) } if(d["song select fade in"]){ str = plugins.strReplace(str, 'if(screen === "titleFadeIn"){', `if(false){`) } if(d["song select ura fade"]) str = plugins.insertBefore(str, `alphaFade = alphaFade < 0.5 ? 0 : 1 `, 'this.draw.alpha(alphaFade, ctx, ctx => {') if(d["song select ura arrow"]) str = plugins.strReplace(str, '((ms - this.state.screenMS) % 1200) / 1200', `0`) if(d["highlight"]){ str = plugins.strReplace(str, 'highlight = 1', `highlight = 2`, 6) str = plugins.insertBefore(str, `false && `, '!p2.session && screen === "song"){') str = plugins.strReplace(str, 'highlight: highlight,', `highlight: highlight ? 1 : 0,`, 3) } return str }), new EditFunction(View.prototype, "refresh").load(str => { if(d["highlight"]) str = plugins.strReplace(str, 'highlight = 1', `highlight = 2`, 2) if(d["combo change"]) str = plugins.insertBefore(str, `comboScale = 0 `, 'var glyphW = 51') if(d["taiko pressed keys"]) str = plugins.strReplace(str, 'for(var i = 0; i < keys.length; i++){', `for(var i = 0; i < 0; i++){`) if(d["taiko pressed keys fade"]) str = plugins.strReplace(str, 'keyMS > 70 && !this.touchEnabled', `false`) if(d["judge score jump"]) str = plugins.insertAfter(str, 'var fadeOut = scoreMS > 250 && !this.touchEnabled', ` yOffset = 0`) if(d["judge score fade"]) str = plugins.insertAfter(str, 'var fadeOut = scoreMS > 250 && !this.touchEnabled', ` fadeOut = 0`) if(d["branch bar change"]) str = plugins.strReplace(str, 'this.branchAnimate && ms <= this.branchAnimate.ms + 300', `false`) if(d["branch text change"]) str = plugins.strReplace(str, 'this.branchAnimate && ms - this.branchAnimate.ms < 310 && ms >= this.branchAnimate.ms', `false`) if(d["bar pressed keys"]) str = plugins.strReplace(str, 'keyTime[sound] > ms - 130', `false`) if(d["note explosion"]) str = plugins.strReplace(str, 'this.assets.drawAssets("notes")', ``) if(d["note shadow"]) str = plugins.strReplace(str, 'scoreMS < 300 && this.currentScore.type', `false`) if(d["note shadow fade out"]) str = plugins.strReplace(str, 'scoreMS > 120 && !this.touchEnabled', `false`) if(d["go go time fireworks"]) str = plugins.strReplace(str, '!this.touchEnabled && !this.portrait && !this.multiplayer', `false`) return str }), new EditFunction(View.prototype, "drawAnimatedCircles").load(str => { if(d["flying notes"]){ str = plugins.insertAfter(str, `if(circle.fixedPos`, ' || typeof circle.fixedPos === "undefined"') str = plugins.insertBefore(str, `else{ continue }`, 'var animPoint = (ms - animT) / 490') str = plugins.insertAfter(str, 'if(ms < animT + 810){', ` continue;`) } if(d["flying notes"] || d["flying note fade"]){ str = plugins.strReplace(str, 'circle.animationEnded = true', ``) } return str }), new EditFunction(View.prototype, "updateNoteFaces").load(str => { if(d["note faces"]) str = plugins.strReplace(str, 'this.controller.getCombo() >= 50', `false`) return str }), new EditFunction(View.prototype, "updateCombo").load(str => { if(d["pause don"]) str = `return;` + str return str }), new EditFunction(ViewAssets.prototype, "init").load(str => { if(d["pause don"]) str = plugins.insertAfter(str, '"background", frame => {', ` frame = 0`) if(d["pause note explosion"]) str = plugins.insertAfter(str, '"notes", frame => {', ` frame = 0`) if(d["go go time fire fade"]){ str = plugins.strReplace(str, '3 - Math.min(200, elapsed) / 100', `1`) str = plugins.strReplace(str, 'Math.min(200, elapsed) / 200', `1`) str = plugins.strReplace(str, '1 - Math.min(100, elapsed) / 100', `0`) } if(d["pause go go time fire"]) str = plugins.insertAfter(str, '"bar", frame => {', ` frame = 0`) if(d["pause go go time fireworks"]) str = plugins.insertAfter(str, '"foreground", frame => {', ` frame = 0`) return str }), new EditFunction(Scoresheet.prototype, "redraw").load(str => { if(d["results fade in"]) str = plugins.insertBefore(str, `bgOffset = (bgOffset < winH / 4) ? 0 : winH / 2 `, 'if(bgOffset){') if(d["results object fade in"]){ str = plugins.insertAfter(str, 'this.draw.alpha(Math.min(1, elapsed / 400)', ` < 0.5 ? 0 : 1`) str = plugins.insertAfter(str, 'this.draw.alpha(Math.min(1, (elapsed - 800) / 500)', ` < 0.5 ? 0 : 1`) str = plugins.strReplace(str, 'ctx.globalAlpha = Math.min(1, Math.max(0, (elapsed - (3100 + failedOffset)) / 500)) * 0.5', `ctx.globalAlpha = 0.5`) } if(d["results crown"]){ str = plugins.strReplace(str, 'Math.min(1, (elapsed - 1200) / 450)', `1`) str = plugins.insertBefore(str, `crownScale = 1 shine = 0 `, 'if(this.state.screen === "fadeIn" && elapsed >= 1200') } return str }), new EditFunction(Scoresheet.prototype, "getNumber").load(str => { if(d["results countup"]) str = plugins.strReplace(str, 'this.numbers[numberPos % 30]', `"."`) return str }), new EditFunction(Account.prototype, "accountForm").load(str => { if(d["pause don"]) str = plugins.strReplace(str, 'matchMedia("(prefers-reduced-motion: reduce)").matches', `true`) return str }) ) if(d["loading gif"]){ var image = assets.image["dancing-don"] var canvas = document.createElement("canvas") canvas.width = image.width canvas.height = image.height var ctx = canvas.getContext("2d") ctx.drawImage(image, 0, 0) var promise = new Promise(resolve => { try{ canvas.toBlob(resolve) }catch(e){ resolve() } }).then(blob => { if(blob){ var image = document.createElement("img") var promise = pageEvents.load(image) image.id = "dancing-don2.gif" image.src = URL.createObjectURL(blob) return promise.then(() => { loader.assetsDiv.appendChild(image) this.newDancingDon = image this.addEdits( new EditValue(assets.image, "dancing-don").load(() => this.newDancingDon) ) }, () => Promise.resolve()) } }) }else{ var promise = Promise.resolve() } return promise.then(() => { var css = [] var playState = [] if(d["song select background"]) playState.push("#song-select") if(d["don background"]) playState.push(".donbg>div") if(d["song background"]) playState.push("#layer2") if(d["title screen proceed"]) playState.push("#title-proceed") if(d["results tetsuo and hana"]) playState.push("#tetsuo", "#tetsuo-in", "#hana", "#hana-in") if(d["results mikoshi"]) playState.push("#mikoshi", "#mikoshi-in") if(playState.length) css.push(loader.cssRuleset({ [playState.join(", ")]: { "animation-play-state": "paused !important" } })) var animation = [] if(d["highlight"]) animation.push(".setting-box", ".setting-value") if(d["results mikoshi"]) animation.push("#mikoshi-out") if(d["results flowers"]) animation.push("#flowers1-in", "#flowers2-in") if(animation.length) css.push(loader.cssRuleset({ [animation.join(", ")]: { "animation": "none !important" } })) var transition = [] if(d["song select background fade"]) transition.push("#song-select") if(d["dropzone fade"]) transition.push("#dropzone") if(d["results tetsuo and hana"]) transition.push("#tetsuo", "#hana") if(d["results flowers"]) transition.push("#flowers1", "#flowers2") if(transition.length){ css.push(loader.cssRuleset({ [transition.join(", ")]: { "transition": "none !important" } })) } if(d["highlight"]) css.push(loader.cssRuleset({ ".view-content:not(:hover) .setting-box.selected, .setting-box:hover": { "border-color": "#ff0" }, ".setting-value.selected": { "border-color": "#e29e06" } })) if(d["results flowers"]) css.push(loader.cssRuleset({ "#tetsuohana.dance #flowers1-in, #tetsuohana.dance #flowers2-in": { "background-position-y": "calc(-318px * var(--scale)) !important" } })) if(d["results fade out"]) css.push(loader.cssRuleset({ "#fade-screen": { "display": "none" } })) if(d["loading gif"]) css.push(loader.cssRuleset({ "#loading-don": { "background-image": this.newDancingDon ? `url("${this.newDancingDon.src}")` : "none" } })) if(css.length){ this.style = document.createElement("style") this.style.appendChild(document.createTextNode(css.join("\n"))) } }) } start(){ if(this.style){ document.head.appendChild(this.style) } } stop(){ if(this.style && this.style.parentNode){ this.style.parentNode.removeChild(this.style) } } unload(){ if(this.newDancingDon && this.newDancingDon.parentNode){ URL.revokeObjectURL(this.newDancingDon.src) this.newDancingDon.parentNode.removeChild(this.newDancingDon) } delete this.newDancingDon delete this.style } }