diff --git a/assets/songs/spookeez/Inst.mp3 b/assets/songs/spookeez/Inst.mp3 index ee4577a..0a111e8 100644 Binary files a/assets/songs/spookeez/Inst.mp3 and b/assets/songs/spookeez/Inst.mp3 differ diff --git a/assets/songs/spookeez/Inst.ogg b/assets/songs/spookeez/Inst.ogg index e14fd8b..b8d7b70 100644 Binary files a/assets/songs/spookeez/Inst.ogg and b/assets/songs/spookeez/Inst.ogg differ diff --git a/assets/songs/spookeez/Voices.mp3 b/assets/songs/spookeez/Voices.mp3 index 854301d..481a7f3 100644 Binary files a/assets/songs/spookeez/Voices.mp3 and b/assets/songs/spookeez/Voices.mp3 differ diff --git a/assets/songs/spookeez/Voices.ogg b/assets/songs/spookeez/Voices.ogg index 1429044..1a8c30e 100644 Binary files a/assets/songs/spookeez/Voices.ogg and b/assets/songs/spookeez/Voices.ogg differ diff --git a/source/Alphabet.hx b/source/Alphabet.hx index 56d07e2..a92b5d1 100644 --- a/source/Alphabet.hx +++ b/source/Alphabet.hx @@ -44,8 +44,14 @@ class Alphabet extends FlxSpriteGroup var isBold:Bool = false; + var pastX:Float = 0; + var pastY:Float = 0; + public function new(x:Float, y:Float, text:String = "", ?bold:Bool = false, typed:Bool = false, shouldMove:Bool = false) { + pastX = x; + pastY = y; + super(x, y); _finalText = text; @@ -66,6 +72,24 @@ class Alphabet extends FlxSpriteGroup } } + public function reType(text) + { + for (i in listOAlphabets) + remove(i); + _finalText = text; + this.text = text; + + lastSprite = null; + + updateHitbox(); + + listOAlphabets.clear(); + x = pastX; + y = pastY; + + addText(); + } + public function addText() { doSplitWords(); diff --git a/source/HitGraph.hx b/source/HitGraph.hx index 7b1d383..169d823 100644 --- a/source/HitGraph.hx +++ b/source/HitGraph.hx @@ -237,7 +237,7 @@ class HitGraph extends Sprite /*if (i == 0) gfx.moveTo(graphX, _axis.y + pointY);*/ - gfx.drawRect(graphX + fitX(history[i][2]), pointY,4,4); + gfx.drawRect(fitX(history[i][2]), pointY,4,4); gfx.endFill(); } diff --git a/source/KadeEngineData.hx b/source/KadeEngineData.hx index 1ad2516..e386474 100644 --- a/source/KadeEngineData.hx +++ b/source/KadeEngineData.hx @@ -93,6 +93,9 @@ class KadeEngineData if (FlxG.save.data.inputShow == null) FlxG.save.data.inputShow = false; + if (FlxG.save.data.optimize == null) + FlxG.save.data.optimize = false; + Conductor.recalculateTimings(); PlayerSettings.player1.controls.loadKeyBinds(); KeyBinds.keyCheck(); diff --git a/source/Main.hx b/source/Main.hx index e04c2f5..6efcae3 100644 --- a/source/Main.hx +++ b/source/Main.hx @@ -82,7 +82,7 @@ class Main extends Sprite game = new FlxGame(gameWidth, gameHeight, initialState, zoom, framerate, framerate, skipSplash, startFullscreen); addChild(game); - + #if !mobile fpsCounter = new FPS(10, 3, 0xFFFFFF); addChild(fpsCounter); diff --git a/source/Options.hx b/source/Options.hx index 58f770f..fce3fd1 100644 --- a/source/Options.hx +++ b/source/Options.hx @@ -312,7 +312,7 @@ class Judgement extends Option FlxG.save.data.frames = Conductor.safeFrames; Conductor.recalculateTimings(); - return true; + return false; } override function getValue():String { @@ -370,6 +370,7 @@ class ScoreScreen extends Option public override function press():Bool { FlxG.save.data.scoreScreen = !FlxG.save.data.scoreScreen; + display = updateDisplay(); return true; } @@ -503,6 +504,27 @@ class RainbowFPSOption extends Option } } +class Optimization extends Option +{ + public function new(desc:String) + { + super(); + description = desc; + } + + public override function press():Bool + { + FlxG.save.data.optimize = !FlxG.save.data.optimize; + display = updateDisplay(); + return true; + } + + private override function updateDisplay():String + { + return "Optimization " + (FlxG.save.data.optimize ? "ON" : "OFF"); + } +} + class NPSDisplayOption extends Option { public function new(desc:String) diff --git a/source/OptionsMenu.hx b/source/OptionsMenu.hx index 841d9ea..0420ecd 100644 --- a/source/OptionsMenu.hx +++ b/source/OptionsMenu.hx @@ -57,9 +57,10 @@ class OptionsMenu extends MusicBeatState #end new FlashingLightsOption("Toggle flashing lights that can cause epileptic seizures and strain."), new WatermarkOption("Enable and disable all watermarks from the engine."), - new BotPlay("Showcase your charts and mods with autoplay."), new ScoreScreen("Show the score screen after the end of a song"), - new ShowInput("Display every single input in the score screen.") + new ShowInput("Display every single input in the score screen."), + new Optimization("No backgrounds, no characters, centered notes, no player 2."), + new BotPlay("Showcase your charts and mods with autoplay.") ]), new OptionCategory("Manage Save Data", [ @@ -220,10 +221,8 @@ class OptionsMenu extends MusicBeatState if (isCat) { if (currentSelectedCat.getOptions()[curSelected].press()) { - grpControls.remove(grpControls.members[curSelected]); - var ctrl:Alphabet = new Alphabet(0, (70 * curSelected) + 30, currentSelectedCat.getOptions()[curSelected].getDisplay(), true, false); - ctrl.isMenuItem = true; - grpControls.add(ctrl); + grpControls.members[curSelected].reType(currentSelectedCat.getOptions()[curSelected].getDisplay()); + trace(currentSelectedCat.getOptions()[curSelected].getDisplay()); } } else @@ -242,7 +241,7 @@ class OptionsMenu extends MusicBeatState curSelected = 0; } - changeSelection(curSelected); + changeSelection(); } } FlxG.save.flush(); diff --git a/source/PlayState.hx b/source/PlayState.hx index abc4b03..021ef92 100644 --- a/source/PlayState.hx +++ b/source/PlayState.hx @@ -1,5 +1,9 @@ package; +import openfl.events.Event; +import haxe.EnumTools; +import openfl.ui.Keyboard; +import openfl.events.KeyboardEvent; import Replay.Ana; import Replay.Analysis; import webm.WebmPlayer; @@ -254,7 +258,7 @@ class PlayState extends MusicBeatState PlayStateChangeables.safeFrames = FlxG.save.data.frames; PlayStateChangeables.scrollSpeed = FlxG.save.data.scrollSpeed; PlayStateChangeables.botPlay = FlxG.save.data.botplay; - + PlayStateChangeables.Optimize = FlxG.save.data.optimize; // pre lowercasing the song name (create) var songLowercase = StringTools.replace(PlayState.SONG.song, " ", "-").toLowerCase(); @@ -267,6 +271,8 @@ class PlayState extends MusicBeatState #if windows executeModchart = FileSystem.exists(Paths.lua(songLowercase + "/modchart")); + if (executeModchart) + PlayStateChangeables.Optimize = false; #end #if !cpp executeModchart = false; // FORCE disable for non cpp targets @@ -373,6 +379,9 @@ class PlayState extends MusicBeatState } } else {stageCheck = SONG.stage;} + if (!PlayStateChangeables.Optimize) + { + switch(stageCheck) { case 'halloween': @@ -752,7 +761,7 @@ class PlayState extends MusicBeatState add(stageCurtains); } } - + } //defaults if no gf was found in chart var gfCheck:String = 'gf'; @@ -777,7 +786,7 @@ class PlayState extends MusicBeatState default: curGf = 'gf'; } - + gf = new Character(400, 130, curGf); gf.scrollFactor.set(0.95, 0.95); @@ -866,14 +875,19 @@ class PlayState extends MusicBeatState gf.y += 300; } - add(gf); + if (!PlayStateChangeables.Optimize) + { + add(gf); + + // Shitty layering but whatev it works LOL + if (curStage == 'limo') + add(limo); + + add(dad); + add(boyfriend); + } - // Shitty layering but whatev it works LOL - if (curStage == 'limo') - add(limo); - add(dad); - add(boyfriend); if (loadRep) { FlxG.watch.addQuick('rep rpesses',repPresses); @@ -1109,6 +1123,8 @@ class PlayState extends MusicBeatState if (!loadRep) rep = new Replay("na"); + FlxG.stage.addEventListener(KeyboardEvent.KEY_DOWN,handleInput); + super.create(); } @@ -1337,6 +1353,49 @@ class PlayState extends MusicBeatState var songTime:Float = 0; + private function handleInput(evt:KeyboardEvent):Void { // this actually handles press inputs + + if (PlayStateChangeables.botPlay || loadRep || paused) + return; + + var key = String.fromCharCode(evt.charCode); + + var binds:Array = [FlxG.save.data.leftBind,FlxG.save.data.downBind, FlxG.save.data.upBind, FlxG.save.data.rightBind]; + + var data = -1; + + for (i in 0...binds.length) + if (binds[i].toLowerCase() == key) + data = i; + + if (data == -1) + return; + + var ana = new Ana(Conductor.songPosition, null, false, "miss", data); + + var dataNotes = []; + notes.forEachAlive(function(daNote:Note) + { + if (daNote.canBeHit && daNote.mustPress && !daNote.tooLate && !daNote.wasGoodHit && daNote.noteData == data) + dataNotes.push(daNote); + }); // Collect notes that can be hit + + + dataNotes.sort((a, b) -> Std.int(a.strumTime - b.strumTime)); // sort by the earliest note + + if (dataNotes.length != 0) + { + var coolNote = dataNotes[0]; + + goodNoteHit(coolNote); + var noteDiff:Float = -(coolNote.strumTime - Conductor.songPosition); + ana.hit = true; + ana.hitJudge = Ratings.CalculateRating(noteDiff, Math.floor((PlayStateChangeables.safeFrames / 60) * 1000)); + ana.nearestNote = [coolNote.strumTime,coolNote.noteData,coolNote.sustainLength]; + } + + } + var songStarted = false; function startSong():Void @@ -1489,6 +1548,10 @@ class PlayState extends MusicBeatState oldNote = null; var swagNote:Note = new Note(daStrumTime, daNoteData, oldNote); + + if (!gottaHitNote && PlayStateChangeables.Optimize) + continue; + swagNote.sustainLength = songNotes[2]; swagNote.scrollFactor.set(0, 0); @@ -1549,6 +1612,9 @@ class PlayState extends MusicBeatState //defaults if no noteStyle was found in chart var noteTypeCheck:String = 'normal'; + if (PlayStateChangeables.Optimize && player == 0) + continue; + if (SONG.noteStyle == null) { switch(storyWeek) {case 6: noteTypeCheck = 'pixel';} } else {noteTypeCheck = SONG.noteStyle;} @@ -1683,6 +1749,9 @@ class PlayState extends MusicBeatState babyArrow.x += 50; babyArrow.x += ((FlxG.width / 2) * player); + if (PlayStateChangeables.Optimize) + babyArrow.x -= 275; + cpuStrums.forEach(function(spr:FlxSprite) { spr.centerOffsets(); //CPU arrows start out slightly off-center @@ -1880,7 +1949,7 @@ class PlayState extends MusicBeatState switch (curStage) { case 'philly': - if (trainMoving) + if (trainMoving && !PlayStateChangeables.Optimize) { trainFrameTiming += elapsed; @@ -1931,6 +2000,7 @@ class PlayState extends MusicBeatState DiscordClient.changePresence("Chart Editor", null, null, true); #end FlxG.switchState(new ChartingState()); + FlxG.stage.removeEventListener(KeyboardEvent.KEY_DOWN,handleInput); #if windows if (luaModchart != null) { @@ -1982,6 +2052,7 @@ class PlayState extends MusicBeatState } FlxG.switchState(new AnimationDebug(SONG.player2)); + FlxG.stage.removeEventListener(KeyboardEvent.KEY_DOWN,handleInput); #if windows if (luaModchart != null) { @@ -1994,6 +2065,7 @@ class PlayState extends MusicBeatState if (FlxG.keys.justPressed.ZERO) { FlxG.switchState(new AnimationDebug(SONG.player1)); + FlxG.stage.removeEventListener(KeyboardEvent.KEY_DOWN,handleInput); #if windows if (luaModchart != null) { @@ -2547,6 +2619,7 @@ class PlayState extends MusicBeatState function endSong():Void { + FlxG.stage.removeEventListener(KeyboardEvent.KEY_DOWN,handleInput); if (useVideo) { GlobalVideo.get().stop(); @@ -3005,6 +3078,8 @@ class PlayState extends MusicBeatState var rightHold:Bool = false; var leftHold:Bool = false; + // THIS FUNCTION JUST FUCKS WIT HELD NOTES AND BOTPLAY/REPLAY + private function keyShit():Void // I've invested in emma stocks { // control arrays, order L D R U @@ -3029,7 +3104,6 @@ class PlayState extends MusicBeatState if (controls.RIGHT_P){luaModchart.executeState('keyPressed',["right"]);}; }; #end - // Prevent player input if botplay is on if(PlayStateChangeables.botPlay) @@ -3041,9 +3115,9 @@ class PlayState extends MusicBeatState var anas:Array = [null,null,null,null]; - for (i in 0...pressArray.length) + /*for (i in 0...pressArray.length) if (pressArray[i]) - anas[i] = new Ana(Conductor.songPosition, null, false, "miss", i); + anas[i] = new Ana(Conductor.songPosition, null, false, "miss", i);*/ // HOLDS, check for sustain notes if (holdArray.contains(true) && /*!boyfriend.stunned && */ generatedMusic) @@ -3056,7 +3130,7 @@ class PlayState extends MusicBeatState } // PRESSES, check for note hits - if (pressArray.contains(true) && /*!boyfriend.stunned && */ generatedMusic) + /*if (pressArray.contains(true) && generatedMusic) { boyfriend.holdTimer = 0; @@ -3071,13 +3145,36 @@ class PlayState extends MusicBeatState { if (!directionsAccounted[daNote.noteData]) { - directionsAccounted[daNote.noteData] = true; - possibleNotes.push(daNote); - directionList.push(daNote.noteData); + if (directionList.contains(daNote.noteData)) + { + directionsAccounted[daNote.noteData] = true; + for (coolNote in possibleNotes) + { + if (coolNote.noteData == daNote.noteData && Math.abs(daNote.strumTime - coolNote.strumTime) < 10) + { // if it's the same note twice at < 10ms distance, just delete it + // EXCEPT u cant delete it in this loop cuz it fucks with the collection lol + dumbNotes.push(daNote); + break; + } + else if (coolNote.noteData == daNote.noteData && daNote.strumTime < coolNote.strumTime) + { // if daNote is earlier than existing note (coolNote), replace + possibleNotes.remove(coolNote); + possibleNotes.push(daNote); + break; + } + } + } + else + { + possibleNotes.push(daNote); + directionList.push(daNote.noteData); + } } } }); + trace('notes that can be hit: ' + possibleNotes.length); + for (note in dumbNotes) { FlxG.log.add("killing dumb ass note at " + note.strumTime); @@ -3122,12 +3219,12 @@ class PlayState extends MusicBeatState noteMiss(shit, null); } - } + }*/ - if (!loadRep) + /*if (!loadRep) for (i in anas) if (i != null) - replayAna.anaArray.push(i); // put em all there + replayAna.anaArray.push(i); // put em all there*/ notes.forEachAlive(function(daNote:Note) { @@ -3508,7 +3605,6 @@ class PlayState extends MusicBeatState var array = [note.strumTime,note.sustainLength,note.noteData,noteDiff]; if (note.isSustainNote) array[1] = -1; - trace('pushing ' + array[0]); saveNotes.push(array); saveJudge.push(note.rating); } diff --git a/source/PlayStateChangeables.hx b/source/PlayStateChangeables.hx index 8ee4995..17a430a 100644 --- a/source/PlayStateChangeables.hx +++ b/source/PlayStateChangeables.hx @@ -4,4 +4,5 @@ class PlayStateChangeables public static var safeFrames:Int; public static var scrollSpeed:Float; public static var botPlay:Bool; + public static var Optimize:Bool; } \ No newline at end of file diff --git a/source/ResultsScreen.hx b/source/ResultsScreen.hx index 8541ccc..1343b04 100644 --- a/source/ResultsScreen.hx +++ b/source/ResultsScreen.hx @@ -74,7 +74,7 @@ class ResultsScreen extends FlxSubState text.text = "Week Cleared!"; } - comboText = new FlxText(20,-75,0,'Judgements:\nSicks - ${PlayState.sicks}\nGoods - ${PlayState.goods}\nBads - ${PlayState.bads}\n\nCombo Breaks: ${(PlayState.isStoryMode ? PlayState.campaignMisses : PlayState.misses) + PlayState.shits}\nHighest Combo: ${PlayState.highestCombo + 1}\n\nScore: ${PlayState.instance.songScore}\nAccuracy: ${HelperFunctions.truncateFloat(PlayState.instance.accuracy,2)}%\n\n${Ratings.GenerateLetterRank(PlayState.instance.accuracy)}\n\nF1 - View replay\nF2 - Replay song + comboText = new FlxText(20,-75,0,'Judgements:\nSicks - ${PlayState.sicks}\nGoods - ${PlayState.goods}\nBads - ${PlayState.bads}\n\nCombo Breaks: ${(PlayState.isStoryMode ? PlayState.campaignMisses : PlayState.misses)}\nHighest Combo: ${PlayState.highestCombo + 1}\n\nScore: ${PlayState.instance.songScore}\nAccuracy: ${HelperFunctions.truncateFloat(PlayState.instance.accuracy,2)}%\n\n${Ratings.GenerateLetterRank(PlayState.instance.accuracy)}\n\nF1 - View replay\nF2 - Replay song '); comboText.size = 28; comboText.setBorderStyle(FlxTextBorderStyle.OUTLINE,FlxColor.BLACK,4,1); @@ -179,6 +179,17 @@ class ResultsScreen extends FlxSubState PlayState.loadRep = false; PlayState.rep = null; + var songHighscore = StringTools.replace(PlayState.SONG.song, " ", "-"); + switch (songHighscore) { + case 'Dad-Battle': songHighscore = 'Dadbattle'; + case 'Philly-Nice': songHighscore = 'Philly'; + } + + #if !switch + Highscore.saveScore(songHighscore, Math.round(PlayState.instance.songScore), PlayState.storyDifficulty); + Highscore.saveCombo(songHighscore, Ratings.GenerateLetterRank(PlayState.instance.accuracy),PlayState.storyDifficulty); + #end + if (PlayState.isStoryMode) { FlxG.sound.playMusic(Paths.music('freakyMenu')); @@ -210,6 +221,17 @@ class ResultsScreen extends FlxSubState case 'philly-nice': songFormat = 'Philly'; } + var songHighscore = StringTools.replace(PlayState.SONG.song, " ", "-"); + switch (songHighscore) { + case 'Dad-Battle': songHighscore = 'Dadbattle'; + case 'Philly-Nice': songHighscore = 'Philly'; + } + + #if !switch + Highscore.saveScore(songHighscore, Math.round(PlayState.instance.songScore), PlayState.storyDifficulty); + Highscore.saveCombo(songHighscore, Ratings.GenerateLetterRank(PlayState.instance.accuracy),PlayState.storyDifficulty); + #end + var poop:String = Highscore.formatSong(songFormat, PlayState.rep.replay.songDiff); music.fadeOut(0.3); @@ -227,6 +249,17 @@ class ResultsScreen extends FlxSubState PlayState.loadRep = false; + var songHighscore = StringTools.replace(PlayState.SONG.song, " ", "-"); + switch (songHighscore) { + case 'Dad-Battle': songHighscore = 'Dadbattle'; + case 'Philly-Nice': songHighscore = 'Philly'; + } + + #if !switch + Highscore.saveScore(songHighscore, Math.round(PlayState.instance.songScore), PlayState.storyDifficulty); + Highscore.saveCombo(songHighscore, Ratings.GenerateLetterRank(PlayState.instance.accuracy),PlayState.storyDifficulty); + #end + var songFormat = StringTools.replace(PlayState.SONG.song, " ", "-"); switch (songFormat) { case 'Dad-Battle': songFormat = 'Dadbattle';