From 5bebbaa8de567197861aa012456044edae2e6df0 Mon Sep 17 00:00:00 2001 From: JordanSantiagoYT Date: Wed, 20 Nov 2024 16:20:29 -0500 Subject: [PATCH 1/4] dumb fix but it works closes #757 --- source/options/VisualsUISubState.hx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/options/VisualsUISubState.hx b/source/options/VisualsUISubState.hx index 4396df55690..488ca2a99d4 100644 --- a/source/options/VisualsUISubState.hx +++ b/source/options/VisualsUISubState.hx @@ -590,7 +590,7 @@ class VisualsUISubState extends BaseOptionsMenu { var note:StrumNote = notes.members[i]; if(notesTween[i] != null) notesTween[i].cancel(); - if(curSelected == noteOptionID) + if(optionsArray[curSelected].name == 'Note Skins:') notesTween[i] = FlxTween.tween(note, {y: noteY}, Math.abs(note.y / (200 + noteY)) / 3, {ease: FlxEase.quadInOut}); else notesTween[i] = FlxTween.tween(note, {y: -200}, Math.abs(note.y / (200 + noteY)) / 3, {ease: FlxEase.quadInOut}); From 1a63ab7bb0cab19d838372d2be9f597b229a4a3a Mon Sep 17 00:00:00 2001 From: JordanSantiagoYT Date: Sat, 30 Nov 2024 22:47:09 -0500 Subject: [PATCH 2/4] 1.39.0 shadowdrop lol --- source/ClientPrefs.hx | 1 + source/MainMenuState.hx | 2 +- source/PlayState.hx | 255 ++++++++++++++-------------- source/options/VisualsUISubState.hx | 8 + 4 files changed, 141 insertions(+), 125 deletions(-) diff --git a/source/ClientPrefs.hx b/source/ClientPrefs.hx index b7325b328d6..88c369b1073 100644 --- a/source/ClientPrefs.hx +++ b/source/ClientPrefs.hx @@ -45,6 +45,7 @@ class ClientPrefs { //default settings if it can't find a save file containing y public static var oldSusStyle:Bool = false; public static var showRendered:Bool = false; public static var showcaseMode:Bool = false; + public static var showcaseST:String = 'JS'; public static var timeBounce:Bool = true; public static var lengthIntro:Bool = true; public static var timebarShowSpeed:Bool = false; diff --git a/source/MainMenuState.hx b/source/MainMenuState.hx index 94df304930f..930b2e304a8 100644 --- a/source/MainMenuState.hx +++ b/source/MainMenuState.hx @@ -23,7 +23,7 @@ using StringTools; class MainMenuState extends MusicBeatState { - public static var psychEngineJSVersion:String = '1.38.1'; //This is also used for Discord RPC + public static var psychEngineJSVersion:String = '1.39.0'; //This is also used for Discord RPC public static var psychEngineVersion:String = '0.6.3'; //This is also used for Discord RPC public static var curSelected:Int = 0; diff --git a/source/PlayState.hx b/source/PlayState.hx index 6694433d61d..cfadf42c4d2 100644 --- a/source/PlayState.hx +++ b/source/PlayState.hx @@ -1280,7 +1280,7 @@ class PlayState extends MusicBeatState healthBarBG.y = FlxG.height * 0.89; healthBarBG.screenCenter(X); healthBarBG.scrollFactor.set(); - healthBarBG.visible = !ClientPrefs.hideHud || !ClientPrefs.showcaseMode; + healthBarBG.visible = !ClientPrefs.hideHud; healthBarBG.xAdd = -4; healthBarBG.yAdd = -4; add(healthBarBG); @@ -1289,20 +1289,20 @@ class PlayState extends MusicBeatState healthBar = new FlxBar(healthBarBG.x + 4, healthBarBG.y + 4, RIGHT_TO_LEFT, Std.int(healthBarBG.width - 8), Std.int(healthBarBG.height - 8), this, 'displayedHealth', 0, maxHealth); healthBar.scrollFactor.set(); - healthBar.visible = !ClientPrefs.hideHud || !ClientPrefs.showcaseMode; + healthBar.visible = !ClientPrefs.hideHud; healthBar.alpha = ClientPrefs.healthBarAlpha; insert(members.indexOf(healthBarBG), healthBar); healthBarBG.sprTracker = healthBar; iconP1 = new HealthIcon(boyfriend.healthIcon, true); iconP1.y = healthBar.y - 75; - iconP1.visible = !ClientPrefs.hideHud || !ClientPrefs.showcaseMode; + iconP1.visible = !ClientPrefs.hideHud; iconP1.alpha = ClientPrefs.healthBarAlpha; add(iconP1); iconP2 = new HealthIcon(dad.healthIcon, false); iconP2.y = healthBar.y - 75; - iconP2.visible = !ClientPrefs.hideHud || !ClientPrefs.showcaseMode; + iconP2.visible = !ClientPrefs.hideHud; iconP2.alpha = ClientPrefs.healthBarAlpha; add(iconP2); reloadHealthBarColors(dad.healthColorArray, boyfriend.healthColorArray); @@ -1373,7 +1373,7 @@ class PlayState extends MusicBeatState scoreTxt.setFormat(Paths.font("vcr.ttf"), 16, FlxColor.WHITE, CENTER, OUTLINE,FlxColor.BLACK); scoreTxt.scrollFactor.set(); scoreTxt.borderSize = 1; - scoreTxt.visible = !ClientPrefs.hideHud || !ClientPrefs.showcaseMode; + scoreTxt.visible = !ClientPrefs.hideHud; add(scoreTxt); var style:String = ClientPrefs.scoreStyle; @@ -1405,14 +1405,14 @@ class PlayState extends MusicBeatState } style = null; if (ClientPrefs.showcaseMode) { - scoreTxt.visible = false; - healthBarBG.visible = false; - healthBar.visible = false; - iconP2.visible = iconP1.visible = false; + var items = [scoreTxt, botplayTxt, healthBarBG, healthBar, iconP1, iconP2]; + if (ClientPrefs.showcaseST == 'AMZ') + items = [scoreTxt, botplayTxt, timeBarBG, timeBar, timeTxt]; + for (i in items) + if (i != null) i.visible = false; } if (ClientPrefs.hideHud) { - scoreTxt.visible = false; - final daArray:Array = [botplayTxt, healthBarBG, healthBar, iconP2, iconP1, timeBarBG, timeBar, timeTxt]; + final daArray:Array = [scoreTxt, botplayTxt, healthBarBG, healthBar, iconP2, iconP1, timeBarBG, timeBar, timeTxt]; for (i in daArray){ if (i != null) i.visible = false; @@ -1504,7 +1504,7 @@ class PlayState extends MusicBeatState botplayTxt.text = 'Practice Mode'; botplayTxt.visible = true; } - if (ClientPrefs.showcaseMode) { + if (ClientPrefs.showcaseMode && ClientPrefs.showcaseST != 'AMZ') { botplayTxt.y += (!ClientPrefs.downScroll ? 60 : -60); botplayTxt.text = 'NPS: $nps/$maxNPS\nOpp NPS: $oppNPS/$maxOppNPS'; botplayTxt.visible = true; @@ -1960,7 +1960,8 @@ class PlayState extends MusicBeatState else{ videoCutscene.finishCallback = function() { - videoCutscene.dispose(); + try { videoCutscene.dispose(); } + catch(e) {videoCutscene.finishVideo(); } startAndEnd(); if (heyStopTrying) openfl.system.System.exit(0); return; @@ -1972,7 +1973,8 @@ class PlayState extends MusicBeatState videoCutscene.onEndReached.add(callback); else{ videoCutscene.onEndReached.add(function(){ - videoCutscene.dispose(); + try { videoCutscene.dispose(); } + catch(e) {videoCutscene.finishVideo(); } startAndEnd(); if (heyStopTrying) openfl.system.System.exit(0); return; @@ -3391,6 +3393,7 @@ class PlayState extends MusicBeatState } callOnLuas('onUpdate', [elapsed]); + super.update(elapsed); if (tankmanAscend && curStep > 895 && curStep < 1151) { @@ -3693,117 +3696,41 @@ class PlayState extends MusicBeatState } } - if (iconP1.visible || iconP2.visible) - { - if (ClientPrefs.iconBounceType == 'Old Psych') { - iconP1.setGraphicSize(Std.int(FlxMath.lerp(iconP1.frameWidth, iconP1.width, CoolUtil.boundTo(1 - (elapsed * 30 * playbackRate), 0, 1))), - Std.int(FlxMath.lerp(iconP1.frameHeight, iconP1.height, CoolUtil.boundTo(1 - (elapsed * 30 * playbackRate), 0, 1)))); - iconP2.setGraphicSize(Std.int(FlxMath.lerp(iconP2.frameWidth, iconP2.width, CoolUtil.boundTo(1 - (elapsed * 30 * playbackRate), 0, 1))), - Std.int(FlxMath.lerp(iconP2.frameHeight, iconP2.height, CoolUtil.boundTo(1 - (elapsed * 30 * playbackRate), 0, 1)))); - } - if (ClientPrefs.iconBounceType == 'Strident Crisis') { - iconP1.setGraphicSize(Std.int(FlxMath.lerp(iconP1.frameWidth, iconP1.width, 0.50 / playbackRate)), - Std.int(FlxMath.lerp(iconP1.frameHeight, iconP1.height, 0.50 / playbackRate))); - iconP2.setGraphicSize(Std.int(FlxMath.lerp(iconP2.frameWidth, iconP2.width, 0.50 / playbackRate)), - Std.int(FlxMath.lerp(iconP2.frameHeight, iconP1.height, 0.50 / playbackRate))); - iconP1.updateHitbox(); - iconP2.updateHitbox(); - } - if (ClientPrefs.iconBounceType == 'Dave and Bambi') { - iconP1.setGraphicSize(Std.int(FlxMath.lerp(iconP1.frameWidth, iconP1.width, 0.8 / playbackRate)), - Std.int(FlxMath.lerp(iconP1.frameHeight, iconP1.height, 0.8 / playbackRate))); - iconP2.setGraphicSize(Std.int(FlxMath.lerp(iconP2.frameWidth, iconP2.width, 0.8 / playbackRate)), - Std.int(FlxMath.lerp(iconP2.frameHeight, iconP2.height, 0.8 / playbackRate))); - } - if (ClientPrefs.iconBounceType == 'Plank Engine') { - final funnyBeat = (Conductor.songPosition / 1000) * (Conductor.bpm / 60); - - iconP1.offset.y = Math.abs(Math.sin(funnyBeat * Math.PI)) * 16 - 4; - iconP2.offset.y = Math.abs(Math.sin(funnyBeat * Math.PI)) * 16 - 4; - } - if (ClientPrefs.iconBounceType == 'New Psych' || ClientPrefs.iconBounceType == 'SB Engine' || ClientPrefs.iconBounceType == 'VS Steve') { - final mult:Float = FlxMath.lerp(1, iconP1.scale.x, CoolUtil.boundTo(1 - (elapsed * 9 * playbackRate), 0, 1)); - iconP1.scale.set(mult, mult); - iconP1.updateHitbox(); - final mult:Float = FlxMath.lerp(1, iconP2.scale.x, CoolUtil.boundTo(1 - (elapsed * 9 * playbackRate), 0, 1)); - iconP2.scale.set(mult, mult); - iconP2.updateHitbox(); - } - - if (ClientPrefs.iconBounceType == 'Golden Apple') { - iconP1.centerOffsets(); - iconP2.centerOffsets(); - } - //you're welcome Stefan2008 :) - if (ClientPrefs.iconBounceType == 'SB Engine') { - if (iconP1.angle >= 0) { - if (iconP1.angle != 0) { - iconP1.angle -= 1 * playbackRate; - } - } else { - if (iconP1.angle != 0) { - iconP1.angle += 1 * playbackRate; - } - } - if (iconP2.angle >= 0) { - if (iconP2.angle != 0) { - iconP2.angle -= 1 * playbackRate; - } - } else { - if (iconP2.angle != 0) { - iconP2.angle += 1 * playbackRate; - } - } - } - iconP1.updateHitbox(); - iconP2.updateHitbox(); - - if (ClientPrefs.smoothHealth) - { - final percent:Float = 1 - (ClientPrefs.smoothHPBug ? (displayedHealth / maxHealth) : (FlxMath.bound(displayedHealth, 0, maxHealth) / maxHealth)); - - iconP1.x = 0 + healthBar.x + (healthBar.width * percent) + (150 * iconP1.scale.x - 150) / 2 - iconOffset; - iconP2.x = 0 + healthBar.x + (healthBar.width * percent) - (150 * iconP2.scale.x) / 2 - iconOffset * 2; - } - else //mb forgot to include this - { - final center:Float = healthBar.x + (healthBar.width * (FlxMath.remapToRange(healthBar.percent, 0, 100, 100, 0) * 0.01)); - iconP1.x = center + (150 * iconP1.scale.x - 150) / 2 - iconOffset; - iconP2.x = center - (150 * iconP2.scale.x) / 2 - iconOffset * 2; - } - if (iconP1.animation.numFrames == 3) { - if (healthBar.percent < 20) - iconP1.animation.curAnim.curFrame = 1; - else if (healthBar.percent > 80) - iconP1.animation.curAnim.curFrame = 2; - else - iconP1.animation.curAnim.curFrame = 0; - } - else { - if (healthBar.percent < 20) - iconP1.animation.curAnim.curFrame = 1; - else - iconP1.animation.curAnim.curFrame = 0; - } - if (iconP2.animation.numFrames == 3) { - if (healthBar.percent > 80) - iconP2.animation.curAnim.curFrame = 1; - else if (healthBar.percent < 20) - iconP2.animation.curAnim.curFrame = 2; - else - iconP2.animation.curAnim.curFrame = 0; - } else { - if (healthBar.percent > 80) - iconP2.animation.curAnim.curFrame = 1; - else - iconP2.animation.curAnim.curFrame = 0; - } + if (iconP1.animation.numFrames == 3) { + if (healthBar.percent < 20) + iconP1.animation.curAnim.curFrame = 1; + else if (healthBar.percent > 80) + iconP1.animation.curAnim.curFrame = 2; + else + iconP1.animation.curAnim.curFrame = 0; + } + else { + if (healthBar.percent < 20) + iconP1.animation.curAnim.curFrame = 1; + else + iconP1.animation.curAnim.curFrame = 0; + } + if (iconP2.animation.numFrames == 3) { + if (healthBar.percent > 80) + iconP2.animation.curAnim.curFrame = 1; + else if (healthBar.percent < 20) + iconP2.animation.curAnim.curFrame = 2; + else + iconP2.animation.curAnim.curFrame = 0; + } else { + if (healthBar.percent > 80) + iconP2.animation.curAnim.curFrame = 1; + else + iconP2.animation.curAnim.curFrame = 0; } if (health > maxHealth) health = maxHealth; + updateIconsScale(elapsed); + updateIconsPosition(); + if (FlxG.keys.anyJustPressed(debugKeysCharacter) && !endingSong && !inCutscene) { persistentUpdate = false; paused = true; @@ -4015,7 +3942,6 @@ class PlayState extends MusicBeatState for (i in shaderUpdates){ i(elapsed); } - super.update(elapsed); if (ffmpegMode) { @@ -4057,6 +3983,91 @@ class PlayState extends MusicBeatState takenTime = haxe.Timer.stamp(); } + // Health icon updaters + public dynamic function updateIconsScale(elapsed:Float) + { + if (ClientPrefs.iconBounceType == 'Old Psych') { + iconP1.setGraphicSize(Std.int(FlxMath.lerp(iconP1.frameWidth, iconP1.width, CoolUtil.boundTo(1 - (elapsed * 30 * playbackRate), 0, 1))), + Std.int(FlxMath.lerp(iconP1.frameHeight, iconP1.height, CoolUtil.boundTo(1 - (elapsed * 30 * playbackRate), 0, 1)))); + iconP2.setGraphicSize(Std.int(FlxMath.lerp(iconP2.frameWidth, iconP2.width, CoolUtil.boundTo(1 - (elapsed * 30 * playbackRate), 0, 1))), + Std.int(FlxMath.lerp(iconP2.frameHeight, iconP2.height, CoolUtil.boundTo(1 - (elapsed * 30 * playbackRate), 0, 1)))); + } + if (ClientPrefs.iconBounceType == 'Strident Crisis') { + iconP1.setGraphicSize(Std.int(FlxMath.lerp(iconP1.frameWidth, iconP1.width, 0.50 / playbackRate)), + Std.int(FlxMath.lerp(iconP1.frameHeight, iconP1.height, 0.50 / playbackRate))); + iconP2.setGraphicSize(Std.int(FlxMath.lerp(iconP2.frameWidth, iconP2.width, 0.50 / playbackRate)), + Std.int(FlxMath.lerp(iconP2.frameHeight, iconP1.height, 0.50 / playbackRate))); + iconP1.updateHitbox(); + iconP2.updateHitbox(); + } + if (ClientPrefs.iconBounceType == 'Dave and Bambi') { + iconP1.setGraphicSize(Std.int(FlxMath.lerp(iconP1.frameWidth, iconP1.width, 0.8 / playbackRate)), + Std.int(FlxMath.lerp(iconP1.frameHeight, iconP1.height, 0.8 / playbackRate))); + iconP2.setGraphicSize(Std.int(FlxMath.lerp(iconP2.frameWidth, iconP2.width, 0.8 / playbackRate)), + Std.int(FlxMath.lerp(iconP2.frameHeight, iconP2.height, 0.8 / playbackRate))); + } + if (ClientPrefs.iconBounceType == 'Plank Engine') { + final funnyBeat = (Conductor.songPosition / 1000) * (Conductor.bpm / 60); + + iconP1.offset.y = Math.abs(Math.sin(funnyBeat * Math.PI)) * 16 - 4; + iconP2.offset.y = Math.abs(Math.sin(funnyBeat * Math.PI)) * 16 - 4; + } + if (ClientPrefs.iconBounceType == 'New Psych' || ClientPrefs.iconBounceType == 'SB Engine' || ClientPrefs.iconBounceType == 'VS Steve') { + final mult:Float = FlxMath.lerp(1, iconP1.scale.x, CoolUtil.boundTo(1 - (elapsed * 9 * playbackRate), 0, 1)); + iconP1.scale.set(mult, mult); + iconP1.updateHitbox(); + + final mult:Float = FlxMath.lerp(1, iconP2.scale.x, CoolUtil.boundTo(1 - (elapsed * 9 * playbackRate), 0, 1)); + iconP2.scale.set(mult, mult); + iconP2.updateHitbox(); + } + + if (ClientPrefs.iconBounceType == 'Golden Apple') { + iconP1.centerOffsets(); + iconP2.centerOffsets(); + } + //you're welcome Stefan2008 :) + if (ClientPrefs.iconBounceType == 'SB Engine') { + if (iconP1.angle >= 0) { + if (iconP1.angle != 0) { + iconP1.angle -= 1 * playbackRate; + } + } else { + if (iconP1.angle != 0) { + iconP1.angle += 1 * playbackRate; + } + } + if (iconP2.angle >= 0) { + if (iconP2.angle != 0) { + iconP2.angle -= 1 * playbackRate; + } + } else { + if (iconP2.angle != 0) { + iconP2.angle += 1 * playbackRate; + } + } + } + iconP1.updateHitbox(); + iconP2.updateHitbox(); + } + + public dynamic function updateIconsPosition() + { + if (ClientPrefs.smoothHealth) + { + final percent:Float = 1 - (ClientPrefs.smoothHPBug ? (displayedHealth / maxHealth) : (FlxMath.bound(displayedHealth, 0, maxHealth) / maxHealth)); + + iconP1.x = 0 + healthBar.x + (healthBar.width * percent) + (150 * iconP1.scale.x - 150) / 2 - iconOffset; + iconP2.x = 0 + healthBar.x + (healthBar.width * percent) - (150 * iconP2.scale.x) / 2 - iconOffset * 2; + } + else //mb forgot to include this + { + final center:Float = healthBar.x + (healthBar.width * (FlxMath.remapToRange(healthBar.percent, 0, 100, 100, 0) * 0.01)); + iconP1.x = center + (150 * iconP1.scale.x - 150) / 2 - iconOffset; + iconP2.x = center - (150 * iconP2.scale.x) / 2 - iconOffset * 2; + } + } + function openPauseMenu() { persistentUpdate = false; @@ -6254,11 +6265,7 @@ class PlayState extends MusicBeatState } if (ClientPrefs.iconBopWhen == 'Every Beat' && (iconP1.visible || iconP2.visible)) - { bopIcons(); - } - iconP1.updateHitbox(); - iconP2.updateHitbox(); if (ClientPrefs.charsAndBG) characterBopper(curBeat); lastBeatHit = curBeat; diff --git a/source/options/VisualsUISubState.hx b/source/options/VisualsUISubState.hx index 488ca2a99d4..3f37194237a 100644 --- a/source/options/VisualsUISubState.hx +++ b/source/options/VisualsUISubState.hx @@ -168,6 +168,14 @@ class VisualsUISubState extends BaseOptionsMenu false); addOption(option); + var option:Option = new Option('Showcase Style: ', + "In what format would you like your showcase?", + 'showcaseST', + 'string', + 'JS', + ['JS', 'AMZ']); + addOption(option); + var option:Option = new Option('Time Text Bounce', 'If checked, the time bar text will bounce on every beat hit.', 'timeBounce', From 87590c44c3be7c25755c536deda58ffcc356dbb9 Mon Sep 17 00:00:00 2001 From: JordanSantiagoYT Date: Sat, 30 Nov 2024 22:53:16 -0500 Subject: [PATCH 3/4] yeah ok --- source/PlayState.hx | 4 ---- 1 file changed, 4 deletions(-) diff --git a/source/PlayState.hx b/source/PlayState.hx index cfadf42c4d2..7178f64d6b2 100644 --- a/source/PlayState.hx +++ b/source/PlayState.hx @@ -1960,8 +1960,6 @@ class PlayState extends MusicBeatState else{ videoCutscene.finishCallback = function() { - try { videoCutscene.dispose(); } - catch(e) {videoCutscene.finishVideo(); } startAndEnd(); if (heyStopTrying) openfl.system.System.exit(0); return; @@ -1973,8 +1971,6 @@ class PlayState extends MusicBeatState videoCutscene.onEndReached.add(callback); else{ videoCutscene.onEndReached.add(function(){ - try { videoCutscene.dispose(); } - catch(e) {videoCutscene.finishVideo(); } startAndEnd(); if (heyStopTrying) openfl.system.System.exit(0); return; From ecf4d69f8e92330219b22519a33f1ff3a1a86383 Mon Sep 17 00:00:00 2001 From: JordanSantiagoYT Date: Sat, 30 Nov 2024 23:21:14 -0500 Subject: [PATCH 4/4] Update THECHANGELOG.md --- THECHANGELOG.md | 29 ++++++----------------------- 1 file changed, 6 insertions(+), 23 deletions(-) diff --git a/THECHANGELOG.md b/THECHANGELOG.md index 01903c84e88..5fbc431f992 100644 --- a/THECHANGELOG.md +++ b/THECHANGELOG.md @@ -1,24 +1,7 @@ -1.38.1; +1.39.0; -Fixed Popups not disappearing correctly if Combo Stacking was turned on -Opponent note hits no longer count twice. -Alt Animations (or notes with an anim suffix) now work -When strums are spawning, they will now always spawn quickly enough before the song starts. - -1.38.0; - -(!) Weekend 1 has been added! (WIP + there's some issues) -Added the Vanilla-styled scoreTxt from 0.5.0 and up. It might be slightly inaccurate but it's as close as possible to the original. -funnyTips now has 2 new default tips -The functionality of the "JS Engine Recharts" option was refactored -All future updates will now have a 5-second wait when running update.bat. This should fix the problem with updates not installing going forward! -The engine can now originally tell if you played a song in Freeplay and had the "Always Play Cutscenes" option enabled! -The Rating Popup spawning was reworked a bit, and now no longer causes lag when too many popups are spawned at once. -The speed of the popups disappearing is no longer reliant on BPM. -(WIP) The engine will now automatically auto-save charts. -Turning on "Instakill on Miss" will stop the game from showing you your miss count. -renderlol.bat will now ask you for the video framerate. -Sustain Splashes will no longer last longer than they should after a BPM change -The infamous "0-2147483648:0-2147483648:0-2147483648 remaining" glitch when an update finishes downloading has finally been patched... hopefully -Fixed Sustain Notes not having their color updated if the Change Character event was called while using Char-Based note colors -Fixed a random Week 4 crash \ No newline at end of file +The Autosave timer in the Editor will now reset if you save the chart before the timer is done. +The "Load Songs" optimization option has been removed +Fixed the notes being shown on screen if you hovered over the first V&UI option no matter what your search query was +New Visual Option: Showcase Style - Choose 2 different ways of showcasing your charts! +THE ICON BOUNCE VISUAL GLITCH HAS BEEN FIXED!! \ No newline at end of file