From 597996e5c068b99893945b535e7b1432b8eb248f Mon Sep 17 00:00:00 2001 From: JordanSantiagoYT Date: Tue, 24 Oct 2023 19:41:52 -0400 Subject: [PATCH] More changes Added Stefan2008's credits The Android keyboard now works with most of the input texts Removed Optimized Chart Loading. If you're using JSE 1.12.0, I recommend turning this off! --- assets/preload/data/botplayText.txt | 1 + assets/preload/images/credits/stef.png | Bin 0 -> 54281 bytes source/ClientPrefs.hx | 5 + source/CreditsState.hx | 5 +- source/PlayState.hx | 212 +++--------------- source/editors/CharacterEditorState.hx | 5 + source/editors/ChartingState.hx | 6 + .../editors/DialogueCharacterEditorState.hx | 4 + source/editors/DialogueEditorState.hx | 3 + source/editors/MenuCharacterEditorState.hx | 3 + source/editors/WeekEditorState.hx | 12 +- source/options/OptimizationSubState.hx | 4 +- source/options/Option.hx | 2 +- source/options/VisualsUISubState.hx | 10 + 14 files changed, 87 insertions(+), 185 deletions(-) create mode 100644 assets/preload/images/credits/stef.png diff --git a/assets/preload/data/botplayText.txt b/assets/preload/data/botplayText.txt index e72dd5f51ad..3128edee134 100644 --- a/assets/preload/data/botplayText.txt +++ b/assets/preload/data/botplayText.txt @@ -1,3 +1,4 @@ +Hey don't blame him, beating it was probably outside his skill level that's some nice botplay you got there! can i have it? skill issue congrats, you turned on botplay diff --git a/assets/preload/images/credits/stef.png b/assets/preload/images/credits/stef.png new file mode 100644 index 0000000000000000000000000000000000000000..230f0847704b651352e3921fbd6d33ee683731a9 GIT binary patch literal 54281 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 = [ //Name - Icon name - Description - Link - BG Color - ['No Botplay Lag Person'], - ['Jordan Santiago', 'jor', 'Coded everything into Psych Engine: No Botplay Lag Edition', 'https://twitter.com/JordansTweetsYT', 'FF9300'], + ['JS Engine People'], + ['Jordan Santiago', 'jor', 'Coded everything into JS Engine', 'https://twitter.com/JordansTweetsYT', 'FF9300'], + ['Stefan2008', 'stef', "Granted permission to use the Results Screen code, and helped\nwith the Android version's development", 'https://www.youtube.com/channel/UC9Nwf21GbaEm_h0Ka9gxZjQ', '800080'], [''], ['Psych Engine Team'], ['Shadow Mario', 'shadowmario', 'Main Programmer of Psych Engine', 'https://twitter.com/Shadow_Mario_', '444444'], diff --git a/source/PlayState.hx b/source/PlayState.hx index 9aa3c5cbe01..6cb1a4d21eb 100644 --- a/source/PlayState.hx +++ b/source/PlayState.hx @@ -1756,8 +1756,7 @@ class PlayState extends MusicBeatState // startCountdown(); trace ('Loading chart...'); - if (!ClientPrefs.fasterChartLoad) generateSong(SONG.song); - if (ClientPrefs.fasterChartLoad) generateSongOptim(SONG.song); + generateSong(SONG.song); if (curSong.toLowerCase() == "guns") // added this to bring back the old 2021 fnf vibes, i wish the fnf fandom revives one day :( { @@ -2187,6 +2186,7 @@ class PlayState extends MusicBeatState dadGroup.destroy(); boyfriendGroup.destroy(); } + if (ClientPrefs.scoreTxtSize > 0 && scoreTxt != null) scoreTxt.size = ClientPrefs.scoreTxtSize; if (!ClientPrefs.hideScore) updateScore(); judgementCounter = new FlxText(0, FlxG.height / 2 - (ClientPrefs.hudType != 'Box Funkin' || ClientPrefs.hudType != "Mic'd Up" ? 80 : 350), 0, "", 20); @@ -2197,19 +2197,22 @@ class PlayState extends MusicBeatState judgementCounter.visible = ClientPrefs.ratingCounter && !ClientPrefs.showcaseMode; if (!ClientPrefs.noMarvJudge) { - judgementCounter.text = 'Combo (Max): ' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(combo, false) : compactCombo) + ' (' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(maxCombo, false) : compactMaxCombo) + ')\nHits: ' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(totalNotesPlayed, false) : compactTotalPlays) + ' / ' + FlxStringUtil.formatMoney(totalNotes, false) + ' (' + FlxMath.roundDecimal((totalNotesPlayed/totalNotes) * 100, 2) + '%)\nMarvelous!!!: ' + marvs + '\nSicks!!: ' + sicks + '\nGoods!: ' + goods + '\nBads: ' + bads + '\nShits: ' + shits + '\nMisses: ' + songMisses + (ClientPrefs.comboScoreEffect ? 'Score Multiplier: ' + comboMultiplier + 'x' : ''); - if (ClientPrefs.hudType == 'Doki Doki+') judgementCounter.text = 'Combo (Max): ' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(combo, false) : compactCombo) + ' ( ' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(maxCombo, false) : compactMaxCombo) + ')\nHits: ' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(totalNotesPlayed, false) : compactTotalPlays) + ' / ' + FlxStringUtil.formatMoney(totalNotes, false) + ' (' + FlxMath.roundDecimal((totalNotesPlayed/totalNotes) * 100, 2) + '%)\nVery Doki: ' + marvs + '\nDoki: ' + sicks + '\nGood: ' + goods + '\nOK: ' + bads + '\nNO: ' + shits + '\nMiss: ' + songMisses + (ClientPrefs.comboScoreEffect ? 'Score Multiplier: ' + comboMultiplier + 'x' : ''); - if (ClientPrefs.hudType == 'VS Impostor') judgementCounter.text = 'Combo (Max): ' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(combo, false) : compactCombo) + ' ( ' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(maxCombo, false) : compactMaxCombo) + ')\nHits: ' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(totalNotesPlayed, false) : compactTotalPlays) + ' / ' + FlxStringUtil.formatMoney(totalNotes, false) + ' (' + FlxMath.roundDecimal((totalNotesPlayed/totalNotes) * 100, 2) + '%)\nSO SUSSY: ' + marvs + '\nSussy: ' + sicks + '\nSus: ' + goods + '\nSad: ' + bads + '\nAss: ' + shits + '\nMiss: ' + songMisses + (ClientPrefs.comboScoreEffect ? 'Score Multiplier: ' + comboMultiplier + 'x' : ''); + judgementCounter.text = 'Combo (Max): ' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(combo, false) : compactCombo) + ' (' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(maxCombo, false) : compactMaxCombo) + ')\nHits: ' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(totalNotesPlayed, false) : compactTotalPlays) + ' / ' + FlxStringUtil.formatMoney(totalNotes, false) + ' (' + FlxMath.roundDecimal((totalNotesPlayed/totalNotes) * 100, 2) + '%)\nMarvelous!!!: ' + marvs + '\nSicks!!: ' + sicks + '\nGoods!: ' + goods + '\nBads: ' + bads + '\nShits: ' + shits + '\nMisses: ' + songMisses + (ClientPrefs.comboScoreEffect ? '\nScore Multiplier: ' + comboMultiplier + 'x' : ''); + + if (ClientPrefs.hudType == 'Doki Doki+') judgementCounter.text = 'Combo (Max): ' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(combo, false) : compactCombo) + ' (' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(maxCombo, false) : compactMaxCombo) + ')\nHits: ' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(totalNotesPlayed, false) : compactTotalPlays) + ' / ' + FlxStringUtil.formatMoney(totalNotes, false) + ' (' + FlxMath.roundDecimal((totalNotesPlayed/totalNotes) * 100, 2) + '%)\nVery Doki: ' + marvs + '\nDoki: ' + sicks + '\nGood: ' + goods + '\nOK: ' + bads + '\nNO: ' + shits + '\nMiss: ' + songMisses + (ClientPrefs.comboScoreEffect ? '\nScore Multiplier: ' + comboMultiplier + 'x' : ''); + + if (ClientPrefs.hudType == 'VS Impostor') judgementCounter.text = 'Combo (Max): ' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(combo, false) : compactCombo) + ' (' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(maxCombo, false) : compactMaxCombo) + ')\nHits: ' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(totalNotesPlayed, false) : compactTotalPlays) + ' / ' + FlxStringUtil.formatMoney(totalNotes, false) + ' (' + FlxMath.roundDecimal((totalNotesPlayed/totalNotes) * 100, 2) + '%)\nSO SUSSY: ' + marvs + '\nSussy: ' + sicks + '\nSus: ' + goods + '\nSad: ' + bads + '\nAss: ' + shits + '\nMiss: ' + songMisses + (ClientPrefs.comboScoreEffect ? '\nScore Multiplier: ' + comboMultiplier + 'x' : ''); } if (ClientPrefs.noMarvJudge) { - judgementCounter.text = 'Combo (Max): ' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(combo, false) : compactCombo) + ' ( ' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(maxCombo, false) : compactMaxCombo) + ')\nHits: ' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(totalNotesPlayed, false) : compactTotalPlays) + ' / ' + FlxStringUtil.formatMoney(totalNotes, false) + ' (' + FlxMath.roundDecimal((totalNotesPlayed/totalNotes) * 100, 2) + '%)\nSicks!!: ' + sicks + '\nGoods!: ' + goods + '\nBads: ' + bads + '\nShits: ' + shits + '\nMisses: ' + songMisses + (ClientPrefs.comboScoreEffect ? 'Score Multiplier: ' + comboMultiplier + 'x' : ''); - if (ClientPrefs.hudType == 'Doki Doki+') judgementCounter.text = 'Combo (Max): ' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(combo, false) : compactCombo) + ' ( ' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(maxCombo, false) : compactMaxCombo) + ')\nHits: ' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(totalNotesPlayed, false) : compactTotalPlays) + ' / ' + FlxStringUtil.formatMoney(totalNotes, false) + ' (' + FlxMath.roundDecimal((totalNotesPlayed/totalNotes) * 100, 2) + '%)\nDoki: ' + sicks + '\nGood: ' + goods + '\nOK: ' + bads + '\nNO: ' + shits + '\nMiss: ' + songMisses + (ClientPrefs.comboScoreEffect ? 'Score Multiplier: ' + comboMultiplier + 'x' : ''); - if (ClientPrefs.hudType == 'VS Impostor') judgementCounter.text = 'Combo (Max): ' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(combo, false) : compactCombo) + ' ( ' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(maxCombo, false) : compactMaxCombo) + ')\nHits: ' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(totalNotesPlayed, false) : compactTotalPlays) + ' / ' + FlxStringUtil.formatMoney(totalNotes, false) + ' (' + FlxMath.roundDecimal((totalNotesPlayed/totalNotes) * 100, 2) + '%)\nSussy: ' + sicks + '\nSus: ' + goods + '\nSad: ' + bads + '\nAss: ' + shits + '\nMiss: ' + songMisses + (ClientPrefs.comboScoreEffect ? 'Score Multiplier: ' + comboMultiplier + 'x' : ''); + judgementCounter.text = 'Combo (Max): ' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(combo, false) : compactCombo) + ' (' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(maxCombo, false) : compactMaxCombo) + ')\nHits: ' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(totalNotesPlayed, false) : compactTotalPlays) + ' / ' + FlxStringUtil.formatMoney(totalNotes, false) + ' (' + FlxMath.roundDecimal((totalNotesPlayed/totalNotes) * 100, 2) + '%)\nSicks!!: ' + sicks + '\nGoods!: ' + goods + '\nBads: ' + bads + '\nShits: ' + shits + '\nMisses: ' + songMisses + (ClientPrefs.comboScoreEffect ? '\nScore Multiplier: ' + comboMultiplier + 'x' : ''); + + if (ClientPrefs.hudType == 'Doki Doki+') judgementCounter.text = 'Combo (Max): ' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(combo, false) : compactCombo) + ' (' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(maxCombo, false) : compactMaxCombo) + ')\nHits: ' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(totalNotesPlayed, false) : compactTotalPlays) + ' / ' + FlxStringUtil.formatMoney(totalNotes, false) + ' (' + FlxMath.roundDecimal((totalNotesPlayed/totalNotes) * 100, 2) + '%)\nDoki: ' + sicks + '\nGood: ' + goods + '\nOK: ' + bads + '\nNO: ' + shits + '\nMiss: ' + songMisses + (ClientPrefs.comboScoreEffect ? '\nScore Multiplier: ' + comboMultiplier + 'x' : ''); + + if (ClientPrefs.hudType == 'VS Impostor') judgementCounter.text = 'Combo (Max): ' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(combo, false) : compactCombo) + ' (' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(maxCombo, false) : compactMaxCombo) + ')\nHits: ' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(totalNotesPlayed, false) : compactTotalPlays) + ' / ' + FlxStringUtil.formatMoney(totalNotes, false) + ' (' + FlxMath.roundDecimal((totalNotesPlayed/totalNotes) * 100, 2) + '%)\nSussy: ' + sicks + '\nSus: ' + goods + '\nSad: ' + bads + '\nAss: ' + shits + '\nMiss: ' + songMisses + (ClientPrefs.comboScoreEffect ? '\nScore Multiplier: ' + comboMultiplier + 'x' : ''); } - judgementCounter.text += '\nNPS (Max): ' + FlxStringUtil.formatMoney(nps, false) + ' (' + FlxStringUtil.formatMoney(maxNPS, false) + ')'; - if (ClientPrefs.opponentRateCount) judgementCounter.text += '\n\nOpponent Hits: ' + FlxStringUtil.formatMoney(enemyHits, false) + ' / ' + FlxStringUtil.formatMoney(opponentNoteTotal, false) + ' (' + FlxMath.roundDecimal((enemyHits / opponentNoteTotal) * 100, 2) + '%)\nOpponent NPS (Max): ' + FlxStringUtil.formatMoney(oppNPS, false) + ' (' + FlxStringUtil.formatMoney(maxOppNPS, false) + ')'; - add(judgementCounter); + judgementCounter.text += (ClientPrefs.showNPS ? '\nNPS (Max): ' + FlxStringUtil.formatMoney(nps, false) + ' (' + FlxStringUtil.formatMoney(maxNPS, false) + ')' : ''); + if (ClientPrefs.opponentRateCount) judgementCounter.text += '\n\nOpponent Hits: ' + FlxStringUtil.formatMoney(enemyHits, false) + ' / ' + FlxStringUtil.formatMoney(opponentNoteTotal, false) + ' (' + FlxMath.roundDecimal((enemyHits / opponentNoteTotal) * 100, 2) + '%)' + (ClientPrefs.showNPS ? '\nOpponent NPS (Max): ' + FlxStringUtil.formatMoney(oppNPS, false) + ' (' + FlxStringUtil.formatMoney(maxOppNPS, false) + ')' : ''); pauseWarnText = new FlxText(400, FlxG.height / 2 - 20, 0, "Pausing is disabled! Turn it back on in Settings -> Gameplay -> 'Force Disable Pausing'", 16); pauseWarnText.cameras = [camHUD]; @@ -3594,7 +3597,7 @@ class PlayState extends MusicBeatState if (skipCountdown || startOnTime > 0) skipArrowStartTween = true; #if android - androidControls.visible = true; + androidControls.visible = !cpuControlled; //no need to have them visible if Botplay is on #end generateStaticArrows(0); generateStaticArrows(1); @@ -4381,168 +4384,6 @@ class PlayState extends MusicBeatState var elapsedTime = endTime - startTime; trace("Loaded chart in " + elapsedTime + " seconds"); } - private function generateSongOptim(dataPath:String):Void { - var startTime = Sys.time(); - songSpeedType = ClientPrefs.getGameplaySetting('scrolltype', 'multiplicative'); - - if (songSpeedType == "multiplicative") { - songSpeed = SONG.speed * ClientPrefs.getGameplaySetting('scrollspeed', 1); - } else if (songSpeedType == "constant") { - songSpeed = ClientPrefs.getGameplaySetting('scrollspeed', 1); - } - - Conductor.changeBPM(SONG.bpm); - curSong = SONG.song; - if (ClientPrefs.songLoading) - { - vocals = (SONG.needsVoices ? new FlxSound().loadEmbedded(Paths.voices(PlayState.SONG.song)) : new FlxSound()); - vocals.pitch = playbackRate; - FlxG.sound.list.add(vocals); - FlxG.sound.list.add(new FlxSound().loadEmbedded(Paths.inst(PlayState.SONG.song))); - } - - notes = new FlxTypedGroup(); - add(notes); - notes.visible = ClientPrefs.showNotes; - - var noteData:Array = SONG.notes; - - loadEventNotes(); - - for (section in noteData) { - for (songNotes in section.sectionNotes) { - var daStrumTime:Float = songNotes[0]; - var daNoteData:Int = Std.int(songNotes[1] % 4); - var sustainLength = songNotes[2]; - - var gottaHitNote:Bool = determineGottaHitNote(songNotes[1], section); - - var oldNote:Note = unspawnNotes.length > 0 ? unspawnNotes[unspawnNotes.length - 1] : null; - var swagNote:Note = createSwagNote(daStrumTime, daNoteData, sustainLength, gottaHitNote, section); - processSustainNotes(swagNote, section); - if (ClientPrefs.ratingCounter && !gottaHitNote) opponentNoteTotal += 1; - if (ClientPrefs.ratingCounter && gottaHitNote) totalNotes += 1; - } - sectionsLoaded += 1; - trace('loaded section ' + sectionsLoaded); - } - - loadOtherEventNotes(); - - unspawnNotes.sort(sortByTime); - unspawnNotesCopy = unspawnNotes.copy(); - generatedMusic = true; - sectionsLoaded = 0; - notesLoadedRN = 0; - maxScore = totalNotes * (ClientPrefs.noMarvJudge ? 350 : 500); - generatedMusic = true; - var endTime = Sys.time(); - - var elapsedTime = endTime - startTime; - trace('song loaded! notes loaded: ' + FlxStringUtil.formatMoney(unspawnNotes.length, false) + ', ' + FlxStringUtil.formatMoney(opponentNoteTotal, false) + ' being sung by the opponent and ' + FlxStringUtil.formatMoney(totalNotes, false) + ' being sung by the player! (Loaded in ' + elapsedTime + ' seconds)'); - } - - private function loadEventNotes():Void { - var songName:String = Paths.formatToSongPath(SONG.song); - var file:String = Paths.json(songName + '/events'); - #if MODS_ALLOWED - if (FileSystem.exists(Paths.modsJson(songName + '/events')) || FileSystem.exists(SUtil.getPath() + file)) { - #else - if (OpenFlAssets.exists(file)) { - #end - var eventsData:Array = Song.loadFromJson('events', songName).events; - for (event in eventsData) { - for (i in 0...event[1].length) { - var newEventNote:Array = [event[0], event[1][i][0], event[1][i][1], event[1][i][2]]; - var subEvent:EventNote = { - strumTime: newEventNote[0] + ClientPrefs.noteOffset, - event: newEventNote[1], - value1: newEventNote[2], - value2: newEventNote[3] - }; - eventNotes.push(subEvent); - eventPushed(subEvent); - } - } - } - } - - private function determineGottaHitNote(noteValue:Int, section:SwagSection):Bool { - var gottaHitNote:Bool = section.mustHitSection; - - if (noteValue > 3 && !opponentChart && !bothsides) { - gottaHitNote = !section.mustHitSection; - } - if (noteValue <= 3 && opponentChart && !bothsides) { - gottaHitNote = !section.mustHitSection; - } else if (bothsides) { - gottaHitNote = true; - } - - if (!gottaHitNote && ClientPrefs.mobileMidScroll) { - section.sectionNotes[3] = 'Behind Note'; - } - return gottaHitNote; - } - - private function createSwagNote(strumTime:Float, noteData:Int, sustainLength:Float, gottaHitNote:Bool, section:SwagSection):Note { - var swagNote:Note = new Note(strumTime, noteData, unspawnNotes.length > 0 ? unspawnNotes[unspawnNotes.length - 1] : null); - if (ClientPrefs.doubleGhost) { - swagNote.row = Conductor.secsToRow(strumTime); - if (noteRows[gottaHitNote ? 0 : 1][swagNote.row] == null) { - noteRows[gottaHitNote ? 0 : 1][swagNote.row] = []; - } - noteRows[gottaHitNote ? 0 : 1][swagNote.row].push(swagNote); - } - swagNote.mustPress = gottaHitNote; - swagNote.sustainLength = sustainLength; - swagNote.gfNote = (section.gfSection && (noteData < 4)); - swagNote.noteType = section.sectionNotes[3]; - if (!Std.isOfType(section.sectionNotes[3], String)) { - swagNote.noteType = editors.ChartingState.noteTypeList[section.sectionNotes[3]]; - } - swagNote.scrollFactor.set(); - unspawnNotes.push(swagNote); - return swagNote; - } - - private function processSustainNotes(swagNote:Note, section:SwagSection):Void { - var floorSus:Int = Math.floor(swagNote.sustainLength / Conductor.stepCrochet); - if (floorSus > 0) { - for (susNote in 0...floorSus + 1) { - var oldNote = unspawnNotes[unspawnNotes.length - 1]; - var sustainNote:Note = new Note( - swagNote.strumTime + (Conductor.stepCrochet * susNote) + (Conductor.stepCrochet / FlxMath.roundDecimal(songSpeed, 2)), - swagNote.noteData, - oldNote, - true - ); - sustainNote.mustPress = swagNote.mustPress; - sustainNote.gfNote = (section.gfSection && (swagNote.noteData < 4)); - sustainNote.scrollFactor.set(); - swagNote.tail.push(sustainNote); - sustainNote.parent = swagNote; - unspawnNotes.push(sustainNote); - } - } - - } - - private function loadOtherEventNotes():Void { - for (event in SONG.events) { - for (i in 0...event[1].length) { - var newEventNote:Array = [event[0], event[1][i][0], event[1][i][1], event[1][i][2]]; - var subEvent:EventNote = { - strumTime: newEventNote[0] + ClientPrefs.noteOffset, - event: newEventNote[1], - value1: newEventNote[2], - value2: newEventNote[3] - }; - eventNotes.push(subEvent); - eventPushed(subEvent); - } - } - } function eventPushed(event:EventNote) { switch(event.event) { case 'Change Character': @@ -5156,6 +4997,11 @@ if (ClientPrefs.showNPS) { + '\nTotal Note Hits: ' + FlxStringUtil.formatMoney(Math.abs(totalNotesPlayed + enemyHits), false) + '\nVideo Speedup: ' + Math.abs(playbackRate / playbackRate / playbackRate) + 'x'; } + if (notesHitArray.length == 1 || oppNotesHitArray.length == 1) { + if (ClientPrefs.ratingCounter && judgeCountUpdateFrame == 0 && judgementCounter != null) updateRatingCounter(); + if (!ClientPrefs.hideScore && scoreTxtUpdateFrame == 0 && scoreTxt != null) updateScore(); + if (ClientPrefs.compactNumbers && compactUpdateFrame == 0) updateCompactNumbers(); + } if (combo > maxCombo) maxCombo = combo; @@ -9710,14 +9556,18 @@ if (!allSicks && ClientPrefs.colorRatingFC && songMisses > 0 && ClientPrefs.hudT if (!ClientPrefs.noMarvJudge) { judgementCounter.text = 'Combo (Max): ' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(combo, false) : compactCombo) + ' (' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(maxCombo, false) : compactMaxCombo) + ')\nHits: ' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(totalNotesPlayed, false) : compactTotalPlays) + ' / ' + FlxStringUtil.formatMoney(totalNotes, false) + ' (' + FlxMath.roundDecimal((totalNotesPlayed/totalNotes) * 100, 2) + '%)\nMarvelous!!!: ' + marvs + '\nSicks!!: ' + sicks + '\nGoods!: ' + goods + '\nBads: ' + bads + '\nShits: ' + shits + '\nMisses: ' + songMisses + (ClientPrefs.comboScoreEffect ? '\nScore Multiplier: ' + comboMultiplier + 'x' : ''); - if (ClientPrefs.hudType == 'Doki Doki+') judgementCounter.text = 'Combo (Max): ' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(combo, false) : compactCombo) + ' ( ' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(maxCombo, false) : compactMaxCombo) + ')\nHits: ' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(totalNotesPlayed, false) : compactTotalPlays) + ' / ' + FlxStringUtil.formatMoney(totalNotes, false) + ' (' + FlxMath.roundDecimal((totalNotesPlayed/totalNotes) * 100, 2) + '%)\nVery Doki: ' + marvs + '\nDoki: ' + sicks + '\nGood: ' + goods + '\nOK: ' + bads + '\nNO: ' + shits + '\nMiss: ' + songMisses + (ClientPrefs.comboScoreEffect ? '\nScore Multiplier: ' + comboMultiplier + 'x' : ''); - if (ClientPrefs.hudType == 'VS Impostor') judgementCounter.text = 'Combo (Max): ' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(combo, false) : compactCombo) + ' ( ' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(maxCombo, false) : compactMaxCombo) + ')\nHits: ' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(totalNotesPlayed, false) : compactTotalPlays) + ' / ' + FlxStringUtil.formatMoney(totalNotes, false) + ' (' + FlxMath.roundDecimal((totalNotesPlayed/totalNotes) * 100, 2) + '%)\nSO SUSSY: ' + marvs + '\nSussy: ' + sicks + '\nSus: ' + goods + '\nSad: ' + bads + '\nAss: ' + shits + '\nMiss: ' + songMisses + (ClientPrefs.comboScoreEffect ? '\nScore Multiplier: ' + comboMultiplier + 'x' : ''); + + if (ClientPrefs.hudType == 'Doki Doki+') judgementCounter.text = 'Combo (Max): ' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(combo, false) : compactCombo) + ' (' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(maxCombo, false) : compactMaxCombo) + ')\nHits: ' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(totalNotesPlayed, false) : compactTotalPlays) + ' / ' + FlxStringUtil.formatMoney(totalNotes, false) + ' (' + FlxMath.roundDecimal((totalNotesPlayed/totalNotes) * 100, 2) + '%)\nVery Doki: ' + marvs + '\nDoki: ' + sicks + '\nGood: ' + goods + '\nOK: ' + bads + '\nNO: ' + shits + '\nMiss: ' + songMisses + (ClientPrefs.comboScoreEffect ? '\nScore Multiplier: ' + comboMultiplier + 'x' : ''); + + if (ClientPrefs.hudType == 'VS Impostor') judgementCounter.text = 'Combo (Max): ' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(combo, false) : compactCombo) + ' (' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(maxCombo, false) : compactMaxCombo) + ')\nHits: ' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(totalNotesPlayed, false) : compactTotalPlays) + ' / ' + FlxStringUtil.formatMoney(totalNotes, false) + ' (' + FlxMath.roundDecimal((totalNotesPlayed/totalNotes) * 100, 2) + '%)\nSO SUSSY: ' + marvs + '\nSussy: ' + sicks + '\nSus: ' + goods + '\nSad: ' + bads + '\nAss: ' + shits + '\nMiss: ' + songMisses + (ClientPrefs.comboScoreEffect ? '\nScore Multiplier: ' + comboMultiplier + 'x' : ''); } if (ClientPrefs.noMarvJudge) { - judgementCounter.text = 'Combo (Max): ' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(combo, false) : compactCombo) + ' ( ' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(maxCombo, false) : compactMaxCombo) + ')\nHits: ' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(totalNotesPlayed, false) : compactTotalPlays) + ' / ' + FlxStringUtil.formatMoney(totalNotes, false) + ' (' + FlxMath.roundDecimal((totalNotesPlayed/totalNotes) * 100, 2) + '%)\nSicks!!: ' + sicks + '\nGoods!: ' + goods + '\nBads: ' + bads + '\nShits: ' + shits + '\nMisses: ' + songMisses + (ClientPrefs.comboScoreEffect ? '\nScore Multiplier: ' + comboMultiplier + 'x' : ''); - if (ClientPrefs.hudType == 'Doki Doki+') judgementCounter.text = 'Combo (Max): ' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(combo, false) : compactCombo) + ' ( ' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(maxCombo, false) : compactMaxCombo) + ')\nHits: ' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(totalNotesPlayed, false) : compactTotalPlays) + ' / ' + FlxStringUtil.formatMoney(totalNotes, false) + ' (' + FlxMath.roundDecimal((totalNotesPlayed/totalNotes) * 100, 2) + '%)\nDoki: ' + sicks + '\nGood: ' + goods + '\nOK: ' + bads + '\nNO: ' + shits + '\nMiss: ' + songMisses + (ClientPrefs.comboScoreEffect ? '\nScore Multiplier: ' + comboMultiplier + 'x' : ''); - if (ClientPrefs.hudType == 'VS Impostor') judgementCounter.text = 'Combo (Max): ' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(combo, false) : compactCombo) + ' ( ' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(maxCombo, false) : compactMaxCombo) + ')\nHits: ' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(totalNotesPlayed, false) : compactTotalPlays) + ' / ' + FlxStringUtil.formatMoney(totalNotes, false) + ' (' + FlxMath.roundDecimal((totalNotesPlayed/totalNotes) * 100, 2) + '%)\nSussy: ' + sicks + '\nSus: ' + goods + '\nSad: ' + bads + '\nAss: ' + shits + '\nMiss: ' + songMisses + (ClientPrefs.comboScoreEffect ? '\nScore Multiplier: ' + comboMultiplier + 'x' : ''); + judgementCounter.text = 'Combo (Max): ' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(combo, false) : compactCombo) + ' (' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(maxCombo, false) : compactMaxCombo) + ')\nHits: ' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(totalNotesPlayed, false) : compactTotalPlays) + ' / ' + FlxStringUtil.formatMoney(totalNotes, false) + ' (' + FlxMath.roundDecimal((totalNotesPlayed/totalNotes) * 100, 2) + '%)\nSicks!!: ' + sicks + '\nGoods!: ' + goods + '\nBads: ' + bads + '\nShits: ' + shits + '\nMisses: ' + songMisses + (ClientPrefs.comboScoreEffect ? '\nScore Multiplier: ' + comboMultiplier + 'x' : ''); + + if (ClientPrefs.hudType == 'Doki Doki+') judgementCounter.text = 'Combo (Max): ' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(combo, false) : compactCombo) + ' (' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(maxCombo, false) : compactMaxCombo) + ')\nHits: ' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(totalNotesPlayed, false) : compactTotalPlays) + ' / ' + FlxStringUtil.formatMoney(totalNotes, false) + ' (' + FlxMath.roundDecimal((totalNotesPlayed/totalNotes) * 100, 2) + '%)\nDoki: ' + sicks + '\nGood: ' + goods + '\nOK: ' + bads + '\nNO: ' + shits + '\nMiss: ' + songMisses + (ClientPrefs.comboScoreEffect ? '\nScore Multiplier: ' + comboMultiplier + 'x' : ''); + + if (ClientPrefs.hudType == 'VS Impostor') judgementCounter.text = 'Combo (Max): ' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(combo, false) : compactCombo) + ' (' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(maxCombo, false) : compactMaxCombo) + ')\nHits: ' + (!ClientPrefs.compactNumbers ? FlxStringUtil.formatMoney(totalNotesPlayed, false) : compactTotalPlays) + ' / ' + FlxStringUtil.formatMoney(totalNotes, false) + ' (' + FlxMath.roundDecimal((totalNotesPlayed/totalNotes) * 100, 2) + '%)\nSussy: ' + sicks + '\nSus: ' + goods + '\nSad: ' + bads + '\nAss: ' + shits + '\nMiss: ' + songMisses + (ClientPrefs.comboScoreEffect ? '\nScore Multiplier: ' + comboMultiplier + 'x' : ''); } judgementCounter.text += (ClientPrefs.showNPS ? '\nNPS (Max): ' + FlxStringUtil.formatMoney(nps, false) + ' (' + FlxStringUtil.formatMoney(maxNPS, false) + ')' : ''); if (ClientPrefs.opponentRateCount) judgementCounter.text += '\n\nOpponent Hits: ' + FlxStringUtil.formatMoney(enemyHits, false) + ' / ' + FlxStringUtil.formatMoney(opponentNoteTotal, false) + ' (' + FlxMath.roundDecimal((enemyHits / opponentNoteTotal) * 100, 2) + '%)' + (ClientPrefs.showNPS ? '\nOpponent NPS (Max): ' + FlxStringUtil.formatMoney(oppNPS, false) + ' (' + FlxStringUtil.formatMoney(maxOppNPS, false) + ')' : ''); @@ -9998,4 +9848,6 @@ if (!allSicks && ClientPrefs.colorRatingFC && songMisses > 0 && ClientPrefs.hudT var curLight:Int = -1; var curLightEvent:Int = -1; -} \ No newline at end of file +} +//WEVE DONE IT, WE'VE HIT 10,000 LINES +//10-24-2023: nvm were back down to 9800 lines \ No newline at end of file diff --git a/source/editors/CharacterEditorState.hx b/source/editors/CharacterEditorState.hx index b87e5524404..cbcf1fd9b90 100644 --- a/source/editors/CharacterEditorState.hx +++ b/source/editors/CharacterEditorState.hx @@ -523,6 +523,7 @@ class CharacterEditorState extends MusicBeatState tab_group.name = "Character"; imageInputText = new FlxUIInputText(15, 30, 200, 'characters/BOYFRIEND', 8); + imageInputText.focusGained = () -> FlxG.stage.window.textInputEnabled = true; var reloadImage:FlxButton = new FlxButton(imageInputText.x + 210, imageInputText.y - 3, "Reload Image", function() { char.imageFile = imageInputText.text; @@ -550,6 +551,7 @@ class CharacterEditorState extends MusicBeatState */ healthIconInputText = new FlxUIInputText(15, imageInputText.y + 35, 75, leHealthIcon.getCharacter(), 8); + healthIconInputText.focusGained = () -> FlxG.stage.window.textInputEnabled = true; singDurationStepper = new FlxUINumericStepper(15, healthIconInputText.y + 45, 0.1, 4, 0, 999, 1); @@ -629,8 +631,11 @@ class CharacterEditorState extends MusicBeatState tab_group.name = "Animations"; animationInputText = new FlxUIInputText(15, 85, 80, '', 8); + animationInputText.focusGained = () -> FlxG.stage.window.textInputEnabled = true; animationNameInputText = new FlxUIInputText(animationInputText.x, animationInputText.y + 35, 150, '', 8); + animationNameInputText.focusGained = () -> FlxG.stage.window.textInputEnabled = true; animationIndicesInputText = new FlxUIInputText(animationNameInputText.x, animationNameInputText.y + 40, 250, '', 8); + animationIndicesInputText.focusGained = () -> FlxG.stage.window.textInputEnabled = true; animationNameFramerate = new FlxUINumericStepper(animationInputText.x + 170, animationInputText.y, 1, 24, 0, 240, 0); animationLoopCheckBox = new FlxUICheckBox(animationNameInputText.x + 170, animationNameInputText.y - 1, null, null, "Should it Loop?", 100); diff --git a/source/editors/ChartingState.hx b/source/editors/ChartingState.hx index 95a297f3b8f..a3cef7f4aec 100644 --- a/source/editors/ChartingState.hx +++ b/source/editors/ChartingState.hx @@ -533,6 +533,7 @@ class ChartingState extends MusicBeatState function addSongUI():Void { UI_songTitle = new FlxUIInputText(10, 10, 70, _song.song, 8); + UI_songTitle.focusGained = () -> FlxG.stage.window.textInputEnabled = true; blockPressWhileTypingOn.push(UI_songTitle); @@ -728,9 +729,11 @@ class ChartingState extends MusicBeatState if(skin == null) skin = ''; noteSkinInputText = new FlxUIInputText(player2DropDown.x, player2DropDown.y + 50, 150, skin, 8); blockPressWhileTypingOn.push(noteSkinInputText); + noteSkinInputText.focusGained = () -> FlxG.stage.window.textInputEnabled = true; noteSplashesInputText = new FlxUIInputText(noteSkinInputText.x, noteSkinInputText.y + 35, 150, _song.splashSkin, 8); blockPressWhileTypingOn.push(noteSplashesInputText); + noteSplashesInputText.focusGained = () -> FlxG.stage.window.textInputEnabled = true; var reloadNotesButton:FlxButton = new FlxButton(noteSplashesInputText.x + 5, noteSplashesInputText.y + 20, 'Change Notes', function() { _song.arrowSkin = noteSkinInputText.text; @@ -783,6 +786,7 @@ class ChartingState extends MusicBeatState creditInputText = new FlxUIInputText(10, 30, 100, _song.songCredit, 8); blockPressWhileTypingOn.push(creditInputText); + creditInputText.focusGained = () -> FlxG.stage.window.textInputEnabled = true; tab_group_songdata.add(creditInputText); tab_group_songdata.add(new FlxText(creditInputText.x, creditInputText.y - 15, 0, 'Song Credit:')); @@ -1359,11 +1363,13 @@ class ChartingState extends MusicBeatState tab_group_event.add(text); value1InputText = new FlxUIInputText(20, 110, 100, ""); blockPressWhileTypingOn.push(value1InputText); + value1InputText.focusGained = () -> FlxG.stage.window.textInputEnabled = true; var text:FlxText = new FlxText(20, 130, 0, "Value 2:"); tab_group_event.add(text); value2InputText = new FlxUIInputText(20, 150, 100, ""); blockPressWhileTypingOn.push(value2InputText); + value2InputText.focusGained = () -> FlxG.stage.window.textInputEnabled = true; // New event buttons var removeButton:FlxButton = new FlxButton(eventDropDown.x + eventDropDown.width + 10, eventDropDown.y, '-', function() diff --git a/source/editors/DialogueCharacterEditorState.hx b/source/editors/DialogueCharacterEditorState.hx index 4f501da368c..22f66e1cbef 100644 --- a/source/editors/DialogueCharacterEditorState.hx +++ b/source/editors/DialogueCharacterEditorState.hx @@ -278,10 +278,13 @@ class DialogueCharacterEditorState extends MusicBeatState animationInputText = new FlxUIInputText(15, 85, 80, '', 8); blockPressWhileTypingOn.push(animationInputText); + animationInputText.focusGained = () -> FlxG.stage.window.textInputEnabled = true; loopInputText = new FlxUIInputText(animationInputText.x, animationInputText.y + 35, 150, '', 8); blockPressWhileTypingOn.push(loopInputText); + loopInputText.focusGained = () -> FlxG.stage.window.textInputEnabled = true; idleInputText = new FlxUIInputText(loopInputText.x, loopInputText.y + 40, 150, '', 8); blockPressWhileTypingOn.push(idleInputText); + idleInputText.focusGained = () -> FlxG.stage.window.textInputEnabled = true; var addUpdateButton:FlxButton = new FlxButton(10, idleInputText.y + 30, "Add/Update", function() { var theAnim:String = animationInputText.text.trim(); @@ -383,6 +386,7 @@ class DialogueCharacterEditorState extends MusicBeatState imageInputText = new FlxUIInputText(10, 30, 80, character.jsonFile.image, 8); blockPressWhileTypingOn.push(imageInputText); + imageInputText.focusGained = () -> FlxG.stage.window.textInputEnabled = true; xStepper = new FlxUINumericStepper(imageInputText.x, imageInputText.y + 50, 10, character.jsonFile.position[0], -2000, 2000, 0); yStepper = new FlxUINumericStepper(imageInputText.x + 80, xStepper.y, 10, character.jsonFile.position[1], -2000, 2000, 0); scaleStepper = new FlxUINumericStepper(imageInputText.x, xStepper.y + 50, 0.05, character.jsonFile.scale, 0.1, 10, 2); diff --git a/source/editors/DialogueEditorState.hx b/source/editors/DialogueEditorState.hx index 8921726ceb7..0fd46e6fcea 100644 --- a/source/editors/DialogueEditorState.hx +++ b/source/editors/DialogueEditorState.hx @@ -153,6 +153,7 @@ class DialogueEditorState extends MusicBeatState characterInputText = new FlxUIInputText(10, 20, 80, DialogueCharacter.DEFAULT_CHARACTER, 8); blockPressWhileTypingOn.push(characterInputText); + characterInputText.focusGained = () -> FlxG.stage.window.textInputEnabled = true; speedStepper = new FlxUINumericStepper(10, characterInputText.y + 40, 0.005, 0.05, 0, 0.5, 3); @@ -165,9 +166,11 @@ class DialogueEditorState extends MusicBeatState soundInputText = new FlxUIInputText(10, speedStepper.y + 40, 150, '', 8); blockPressWhileTypingOn.push(soundInputText); + soundInputText.focusGained = () -> FlxG.stage.window.textInputEnabled = true; lineInputText = new FlxUIInputText(10, soundInputText.y + 35, 200, DEFAULT_TEXT, 8); blockPressWhileTypingOn.push(lineInputText); + lineInputText.focusGained = () -> FlxG.stage.window.textInputEnabled = true; #if !android var loadButton:FlxButton = new FlxButton(20, lineInputText.y + 25, "Load Dialogue", function() { diff --git a/source/editors/MenuCharacterEditorState.hx b/source/editors/MenuCharacterEditorState.hx index 8761ec88853..f8485e6f5cd 100644 --- a/source/editors/MenuCharacterEditorState.hx +++ b/source/editors/MenuCharacterEditorState.hx @@ -188,10 +188,13 @@ class MenuCharacterEditorState extends MusicBeatState imageInputText = new FlxUIInputText(10, 20, 80, characterFile.image, 8); blockPressWhileTypingOn.push(imageInputText); + imageInputText.focusGained = () -> FlxG.stage.window.textInputEnabled = true; idleInputText = new FlxUIInputText(10, imageInputText.y + 35, 100, characterFile.idle_anim, 8); blockPressWhileTypingOn.push(idleInputText); + idleInputText.focusGained = () -> FlxG.stage.window.textInputEnabled = true; confirmInputText = new FlxUIInputText(10, idleInputText.y + 35, 100, characterFile.confirm_anim, 8); blockPressWhileTypingOn.push(confirmInputText); + confirmInputText.focusGained = () -> FlxG.stage.window.textInputEnabled = true; flipXCheckbox = new FlxUICheckBox(10, confirmInputText.y + 30, null, null, "Flip X", 100); flipXCheckbox.callback = function() diff --git a/source/editors/WeekEditorState.hx b/source/editors/WeekEditorState.hx index 0748603b22c..eb22db57060 100644 --- a/source/editors/WeekEditorState.hx +++ b/source/editors/WeekEditorState.hx @@ -178,26 +178,33 @@ class WeekEditorState extends MusicBeatState songsInputText = new FlxUIInputText(10, 30, 200, '', 8); blockPressWhileTypingOn.push(songsInputText); + songsInputText.focusGained = () -> FlxG.stage.window.textInputEnabled = true; opponentInputText = new FlxUIInputText(10, songsInputText.y + 40, 70, '', 8); blockPressWhileTypingOn.push(opponentInputText); + opponentInputText.focusGained = () -> FlxG.stage.window.textInputEnabled = true; boyfriendInputText = new FlxUIInputText(opponentInputText.x + 75, opponentInputText.y, 70, '', 8); blockPressWhileTypingOn.push(boyfriendInputText); + boyfriendInputText.focusGained = () -> FlxG.stage.window.textInputEnabled = true; girlfriendInputText = new FlxUIInputText(boyfriendInputText.x + 75, opponentInputText.y, 70, '', 8); blockPressWhileTypingOn.push(girlfriendInputText); + girlfriendInputText.focusGained = () -> FlxG.stage.window.textInputEnabled = true; backgroundInputText = new FlxUIInputText(10, opponentInputText.y + 40, 120, '', 8); blockPressWhileTypingOn.push(backgroundInputText); - + backgroundInputText.focusGained = () -> FlxG.stage.window.textInputEnabled = true; displayNameInputText = new FlxUIInputText(10, backgroundInputText.y + 60, 200, '', 8); blockPressWhileTypingOn.push(backgroundInputText); + displayNameInputText.focusGained = () -> FlxG.stage.window.textInputEnabled = true; weekNameInputText = new FlxUIInputText(10, displayNameInputText.y + 60, 150, '', 8); blockPressWhileTypingOn.push(weekNameInputText); + weekNameInputText.focusGained = () -> FlxG.stage.window.textInputEnabled = true; weekFileInputText = new FlxUIInputText(10, weekNameInputText.y + 40, 100, '', 8); blockPressWhileTypingOn.push(weekFileInputText); + weekFileInputText.focusGained = () -> FlxG.stage.window.textInputEnabled = true; reloadWeekThing(); hideCheckbox = new FlxUICheckBox(10, weekFileInputText.y + 40, null, null, "Hide Week from Story Mode?", 100); @@ -252,9 +259,11 @@ class WeekEditorState extends MusicBeatState weekBeforeInputText = new FlxUIInputText(10, hiddenUntilUnlockCheckbox.y + 55, 100, '', 8); blockPressWhileTypingOn.push(weekBeforeInputText); + weekBeforeInputText.focusGained = () -> FlxG.stage.window.textInputEnabled = true; difficultiesInputText = new FlxUIInputText(10, weekBeforeInputText.y + 60, 200, '', 8); blockPressWhileTypingOn.push(difficultiesInputText); + difficultiesInputText.focusGained = () -> FlxG.stage.window.textInputEnabled = true; tab_group.add(new FlxText(weekBeforeInputText.x, weekBeforeInputText.y - 28, 0, 'Week File name of the Week you have\nto finish for Unlocking:')); tab_group.add(new FlxText(difficultiesInputText.x, difficultiesInputText.y - 20, 0, 'Difficulties:')); @@ -729,6 +738,7 @@ class WeekEditorFreeplayState extends MusicBeatState }); iconInputText = new FlxUIInputText(10, bgColorStepperR.y + 70, 100, '', 8); + iconInputText.focusGained = () -> FlxG.stage.window.textInputEnabled = true; var hideFreeplayCheckbox:FlxUICheckBox = new FlxUICheckBox(10, iconInputText.y + 30, null, null, "Hide Week from Freeplay?", 100); hideFreeplayCheckbox.checked = weekFile.hideFreeplay; diff --git a/source/options/OptimizationSubState.hx b/source/options/OptimizationSubState.hx index 2e69c1a8d7f..54bbbc8779c 100644 --- a/source/options/OptimizationSubState.hx +++ b/source/options/OptimizationSubState.hx @@ -100,13 +100,15 @@ class OptimizationSubState extends BaseOptionsMenu true); addOption(option); + /* //ok i was GOING to keep this but note types break if you turn it on var option:Option = new Option('Optimized Chart Loading', //Name 'If checked, hopefully tries to get charts to load faster.', //Description 'fasterChartLoad', //Save data variable name 'bool', //Variable type false); //Default value addOption(option); - + */ + super(); } } \ No newline at end of file diff --git a/source/options/Option.hx b/source/options/Option.hx index b54eb713460..aa7ce9dfa72 100644 --- a/source/options/Option.hx +++ b/source/options/Option.hx @@ -49,7 +49,7 @@ class Option public var displayFormat:String = '%v'; //How String/Float/Percent/Int values are shown, %v = Current value, %d = Default value public var description:String = ''; public var name:String = 'Unknown'; - public var isNote:Bool = false; + public var specialOption:Bool = false; public function new(name:String, description:String = '', variable:String, type:String = 'bool', defaultValue:Dynamic = 'null variable value', ?options:Array = null) { diff --git a/source/options/VisualsUISubState.hx b/source/options/VisualsUISubState.hx index 900142dc8c7..fe71ecb3a96 100644 --- a/source/options/VisualsUISubState.hx +++ b/source/options/VisualsUISubState.hx @@ -156,6 +156,16 @@ class VisualsUISubState extends BaseOptionsMenu 'bool', false); addOption(option); + + var option:Option = new Option('ScoreTxt Size: ', + "Sets the size of scoreTxt. Logically, higher values mean\nthe scoreTxt is bigger. If set to 0, then it will\nuse the default size for each HUD type.", + 'scoreTxtSize', + 'int', + '0'); + addOption(option); + + option.minValue = 0; + option.maxValue = 100; /* ignore this i was just making a joke about fnf's naughtiness option var option:Option = new Option('Family Friendly Mode',