diff --git a/source/EtternaFunctions.hx b/source/EtternaFunctions.hx new file mode 100644 index 0000000..5fdc27a --- /dev/null +++ b/source/EtternaFunctions.hx @@ -0,0 +1,84 @@ +class EtternaFunctions +{ + // erf constants + public static var a1 = 0.254829592; + public static var a2 = -0.284496736; + public static var a3 = 1.421413741; + public static var a4 = -1.453152027; + public static var a5 = 1.061405429; + public static var p = 0.3275911; + + public static function erf(x:Float):Float + { + // Save the sign of x + var sign = 1; + if (x < 0) + sign = -1; + x = Math.abs(x); + + // A&S formula 7.1.26 + var t = 1.0/(1.0 + p*x); + var y = 1.0 - (((((a5*t + a4)*t) + a3)*t + a2)*t + a1)*t*Math.exp(-x*x); + + return sign*y; + } + + public static function getNotes():Int + { + var notes:Int = 0; + for (i in 0...PlayState.SONG.notes.length) + { + for (ii in 0...PlayState.SONG.notes[i].sectionNotes.length) + { + var n = PlayState.SONG.notes[i].sectionNotes[ii]; + if (n[1] <= 0) + notes++; + } + } + return notes; + } + + public static function getHolds():Int + { + var notes:Int = 0; + for (i in 0...PlayState.SONG.notes.length) + { + trace(PlayState.SONG.notes[i]); + for (ii in 0...PlayState.SONG.notes[i].sectionNotes.length) + { + var n = PlayState.SONG.notes[i].sectionNotes[ii]; + trace(n); + if (n[1] > 0) + notes++; + } + } + return notes; + } + + public static function getMapMaxScore():Int + { + return (getNotes() * 350); + } + + public static function wife3(maxms:Float, ts) + { + var max_points = 1.0; + var miss_weight = -5.5; + var ridic= 5 * ts; + var max_boo_weight = 180 * ts; + var ts_pow = 0.75; + var zero = 65 * (Math.pow(ts,ts_pow)); + var power = 2.5; + var dev = 22.7 * (Math.pow(ts,ts_pow)); + + if (maxms <= ridic) // anything below this (judge scaled) threshold is counted as full pts + return max_points; + else if (maxms <= zero) // ma/pa region, exponential + return max_points * erf((zero - maxms) / dev); + else if (maxms <= max_boo_weight)// cb region, linear + return (maxms - zero) * miss_weight / (max_boo_weight - zero); + else + return miss_weight; + } + +} \ No newline at end of file diff --git a/source/Note.hx b/source/Note.hx index f21ef89..c7cde28 100644 --- a/source/Note.hx +++ b/source/Note.hx @@ -40,6 +40,9 @@ class Note extends FlxSprite if (prevNote == null) prevNote = this; + if (FlxG.save.data.downscroll) + flipY = true; + this.prevNote = prevNote; isSustainNote = sustainNote; diff --git a/source/PlayState.hx b/source/PlayState.hx index 51ef676..9dab5a9 100644 --- a/source/PlayState.hx +++ b/source/PlayState.hx @@ -1928,13 +1928,13 @@ class PlayState extends MusicBeatState if (SONG.validScore) { #if !switch - Highscore.saveScore(SONG.song, songScore, storyDifficulty); + Highscore.saveScore(SONG.song, Math.round(songScore), storyDifficulty); #end } if (isStoryMode) { - campaignScore += songScore; + campaignScore += Math.round(songScore); storyPlaylist.remove(storyPlaylist[0]); @@ -2005,7 +2005,7 @@ class PlayState extends MusicBeatState private function popUpScore(strumtime:Float):Void { var noteDiff:Float = Math.abs(strumtime - Conductor.songPosition); - var wife:Float = noteDiff / 1000; + var wife:Float = EtternaFunctions.wife3(noteDiff, 1); // boyfriend.playAnim('hey'); vocals.volume = 1; @@ -2017,14 +2017,15 @@ class PlayState extends MusicBeatState // var rating:FlxSprite = new FlxSprite(); - var score:Int = 350; + var score:Float = 350; var daRating:String = "sick"; + totalNotesHit += wife; + if (noteDiff > Conductor.safeZoneOffset * 2) { daRating = 'shit'; - totalNotesHit -= 2 - wife; ss = false; if (theFunne) { @@ -2037,7 +2038,6 @@ class PlayState extends MusicBeatState else if (noteDiff < Conductor.safeZoneOffset * -2) { daRating = 'shit'; - totalNotesHit -= 2 - wife; if (theFunne) { score = -3000; @@ -2050,7 +2050,6 @@ class PlayState extends MusicBeatState else if (noteDiff < Conductor.safeZoneOffset * -0.45) { daRating = 'bad'; - totalNotesHit += 0.2 - wife; if (theFunne) { score = -1000; @@ -2065,7 +2064,6 @@ class PlayState extends MusicBeatState else if (noteDiff > Conductor.safeZoneOffset * 0.45) { daRating = 'bad'; - totalNotesHit += 0.2 - wife; if (theFunne) { score = -1000; @@ -2080,7 +2078,6 @@ class PlayState extends MusicBeatState else if (noteDiff < Conductor.safeZoneOffset * -0.25) { daRating = 'good'; - totalNotesHit += 0.65 - wife; if (theFunne) { score = 200; @@ -2094,7 +2091,6 @@ class PlayState extends MusicBeatState else if (noteDiff > Conductor.safeZoneOffset * 0.35) { daRating = 'good'; - totalNotesHit += 0.65 - wife; if (theFunne) { score = 200; @@ -2107,19 +2103,20 @@ class PlayState extends MusicBeatState } if (daRating == 'sick') { - totalNotesHit += 1 - wife; if (health < 2) health += 0.1; sicks++; } - + + trace('Weight: ' + wife); + // trace('Wife accuracy loss: ' + wife + ' | Rating: ' + daRating + ' | Score: ' + score + ' | Weight: ' + (1 - wife)); if (daRating != 'shit' || daRating != 'bad') { - songScore += score; + songScore += Math.round(score); /* if (combo > 60) daRating = 'sick'; @@ -2608,7 +2605,7 @@ class PlayState extends MusicBeatState updateAccuracy(); } - function updateAccuracy() + function updateAccuracy() { if (misses > 0 || accuracy < 96) fc = false; @@ -2616,6 +2613,8 @@ class PlayState extends MusicBeatState fc = true; totalPlayed += 1; accuracy = totalNotesHit / totalPlayed * 100; + trace('Notes Hit: ' + totalNotesHit + ' / ' + totalPlayed + ' = ' + accuracy); + trace(accuracy); }