From 5698b6859d21e1d6b569de4c8676055dec619fec Mon Sep 17 00:00:00 2001 From: KadeDeveloper Date: Wed, 4 Aug 2021 13:51:44 -0700 Subject: [PATCH] updates to early window and health gain + work on waveform --- source/ChartingState.hx | 20 ++++++++ source/GameplayCustomizeState.hx | 16 +++++- source/KadeEngineData.hx | 3 ++ source/Note.hx | 19 +++---- source/PlayState.hx | 50 ++++++++++++------ source/PlayStateChangeables.hx | 1 + source/Ratings.hx | 2 +- source/Waveform.hx | 88 ++++++++++++++++++++++++++++++++ 8 files changed, 172 insertions(+), 27 deletions(-) create mode 100644 source/Waveform.hx diff --git a/source/ChartingState.hx b/source/ChartingState.hx index 6357545..880ad24 100644 --- a/source/ChartingState.hx +++ b/source/ChartingState.hx @@ -131,6 +131,8 @@ class ChartingState extends MusicBeatState var camFollow:FlxObject; + public var waveform:Waveform; + public static var latestChartVersion = "2"; override function create() @@ -313,6 +315,7 @@ class ChartingState extends MusicBeatState height = Math.floor(renderer.y); } + trace(height); @@ -385,6 +388,23 @@ class ChartingState extends MusicBeatState add(sectionRenderes); + + // fuckin stupid ass bitch ass fucking waveform + /*if (PlayState.isSM) + { + waveform = new Waveform(0,0,PlayState.pathToSm + "/" + PlayState.sm.header.MUSIC,height); + } + else + { + if (_song.needsVoices) + waveform = new Waveform(0,0,Paths.voices(_song.song),height); + else + waveform = new Waveform(0,0,Paths.inst(_song.song),height); + } + + waveform.drawWaveform(); + add(waveform); + */ add(dummyArrow); add(strumLine); add(lines); diff --git a/source/GameplayCustomizeState.hx b/source/GameplayCustomizeState.hx index 26e29e6..03f66d1 100644 --- a/source/GameplayCustomizeState.hx +++ b/source/GameplayCustomizeState.hx @@ -61,6 +61,8 @@ class GameplayCustomizeState extends MusicBeatState camHUD.bgColor.alpha = 0; FlxG.cameras.add(camHUD); + camHUD.zoom = FlxG.save.data.zoom; + background.scrollFactor.set(0.9,0.9); curt.scrollFactor.set(0.9,0.9); front.scrollFactor.set(0.9,0.9); @@ -116,7 +118,7 @@ class GameplayCustomizeState extends MusicBeatState generateStaticArrows(0); generateStaticArrows(1); - text = new FlxText(5, FlxG.height + 40, 0, "Click and drag around gameplay elements to customize their positions.\nPress R to reset.\nPress Escape to go back.", 12); + text = new FlxText(5, FlxG.height + 40, 0, "Click and drag around gameplay elements to customize their positions.\nPress R to reset. +/- to change zoom.\nPress Escape to go back.", 12); text.scrollFactor.set(); text.setFormat("VCR OSD Mono", 16, FlxColor.WHITE, LEFT, FlxTextBorderStyle.OUTLINE, FlxColor.BLACK); @@ -164,6 +166,18 @@ class GameplayCustomizeState extends MusicBeatState for (i in strumLineNotes) i.y = strumLine.y; + if (FlxG.keys.pressed.PLUS) + { + FlxG.save.data.zoom += 0.1; + camHUD.zoom = FlxG.save.data.zoom; + } + + if (FlxG.keys.pressed.MINUS) + { + FlxG.save.data.zoom -= 0.1; + camHUD.zoom = FlxG.save.data.zoom; + } + if (FlxG.mouse.overlaps(sick) && FlxG.mouse.justReleased) { FlxG.save.data.changedHitX = sick.x; diff --git a/source/KadeEngineData.hx b/source/KadeEngineData.hx index eb0b876..b6edf9d 100644 --- a/source/KadeEngineData.hx +++ b/source/KadeEngineData.hx @@ -111,6 +111,9 @@ class KadeEngineData if (FlxG.save.data.editor == null) FlxG.save.data.editor = true; + + if (FlxG.save.data.zoom == null) + FlxG.save.data.zoom = 1; var gamepad:FlxGamepad = FlxG.gamepads.lastActive; diff --git a/source/Note.hx b/source/Note.hx index 700c14e..428a505 100644 --- a/source/Note.hx +++ b/source/Note.hx @@ -83,12 +83,15 @@ class Note extends FlxSprite else { this.strumTime = strumTime; - rStrumTime = strumTime - (FlxG.save.data.offset + PlayState.songOffset); #if sys if (PlayState.isSM) { - rStrumTime = Math.round(rStrumTime + Std.parseFloat(PlayState.sm.header.OFFSET)); + rStrumTime = strumTime; } + else + rStrumTime = (strumTime - FlxG.save.data.offset + PlayState.songOffset); + #else + rStrumTime = (strumTime - FlxG.save.data.offset + PlayState.songOffset); #end } @@ -245,25 +248,23 @@ class Note extends FlxSprite if (mustPress) { - // ass if (isSustainNote) { - if (strumTime > Conductor.songPosition - (Conductor.safeZoneOffset * 1.5) - && strumTime < Conductor.songPosition + (Conductor.safeZoneOffset * 0.5)) + if (strumTime - Conductor.songPosition <= ((166 * Conductor.timeScale) * 0.5) + && strumTime - Conductor.songPosition >= (-166 * Conductor.timeScale)) canBeHit = true; else canBeHit = false; } else { - if (strumTime > Conductor.songPosition - Conductor.safeZoneOffset - && strumTime < Conductor.songPosition + Conductor.safeZoneOffset) + if (strumTime - Conductor.songPosition <= (166 * Conductor.timeScale) + && strumTime - Conductor.songPosition >= (-166 * Conductor.timeScale)) canBeHit = true; else canBeHit = false; } - - if (strumTime < Conductor.songPosition - Conductor.safeZoneOffset * Conductor.timeScale && !wasGoodHit) + if (strumTime - Conductor.songPosition < -166 && !wasGoodHit) tooLate = true; } else diff --git a/source/PlayState.hx b/source/PlayState.hx index e14b145..17beeaa 100644 --- a/source/PlayState.hx +++ b/source/PlayState.hx @@ -311,6 +311,7 @@ class PlayState extends MusicBeatState PlayStateChangeables.scrollSpeed = FlxG.save.data.scrollSpeed; PlayStateChangeables.botPlay = FlxG.save.data.botplay; PlayStateChangeables.Optimize = FlxG.save.data.optimize; + PlayStateChangeables.zoom = FlxG.save.data.zoom; // pre lowercasing the song name (create) var songLowercase = StringTools.replace(PlayState.SONG.song, " ", "-").toLowerCase(); @@ -397,6 +398,8 @@ class PlayState extends MusicBeatState FlxG.cameras.add(camSustains); FlxG.cameras.add(camNotes); + camHUD.zoom = PlayStateChangeables.zoom; + FlxCamera.defaultCameras = [camGame]; persistentUpdate = true; @@ -1613,6 +1616,9 @@ class PlayState extends MusicBeatState keys[data] = false; } + public var closestNotes:Array = []; + + private function handleInput(evt:KeyboardEvent):Void { // this actually handles press inputs @@ -1668,13 +1674,9 @@ class PlayState extends MusicBeatState 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 + for(i in closestNotes) + if (i.noteData == data) + dataNotes.push(i); if (dataNotes.length != 0) { @@ -1724,7 +1726,7 @@ class PlayState extends MusicBeatState ana.hit = false; ana.hitJudge = "shit"; ana.nearestNote = []; - health -= 0.10; + health -= 0.30; } } @@ -2255,6 +2257,8 @@ class PlayState extends MusicBeatState perfectMode = false; #end + + if (updateFrame == 4) { TimingStruct.clearTimings(); @@ -2622,6 +2626,20 @@ class PlayState extends MusicBeatState if (generatedMusic && PlayState.SONG.notes[Std.int(curStep / 16)] != null) { + + closestNotes = []; + + notes.forEachAlive(function(daNote:Note) + { + if (daNote.canBeHit && daNote.mustPress && !daNote.tooLate && !daNote.wasGoodHit) + closestNotes.push(daNote); + }); // Collect notes that can be hit + + closestNotes.sort((a, b) -> Std.int(a.strumTime - b.strumTime)); + + if (closestNotes.length != 0) + FlxG.watch.addQuick("Current Note",closestNotes[0].strumTime - Conductor.songPosition); + // Make sure Girlfriend cheers only for certain songs if (allowedToHeadbang) { @@ -3140,13 +3158,13 @@ class PlayState extends MusicBeatState else { if (!daNote.isSustainNote) - health -= 0.10; + health -= 0.20; vocals.volume = 0; if (theFunne && !daNote.isSustainNote) noteMiss(daNote.noteData, daNote); if (daNote.isParent) { - health -= 0.20; // give a health punishment for failing a LN + health -= 0.30; // give a health punishment for failing a LN trace("hold fell over at the start"); for (i in daNote.children) { @@ -3161,7 +3179,7 @@ class PlayState extends MusicBeatState && daNote.sustainActive && daNote.spotInLine != daNote.parent.children.length) { - health -= 0.20; // give a health punishment for failing a LN + health -= 0.30; // give a health punishment for failing a LN trace("hold fell over at " + daNote.spotInLine); for (i in daNote.parent.children) { @@ -3178,14 +3196,14 @@ class PlayState extends MusicBeatState else { if (!daNote.isSustainNote) - health -= 0.10; + health -= 0.20; vocals.volume = 0; if (theFunne && !daNote.isSustainNote) noteMiss(daNote.noteData, daNote); if (daNote.isParent) { - health -= 0.20; // give a health punishment for failing a LN + health -= 0.30; // give a health punishment for failing a LN trace("hold fell over at the start"); for (i in daNote.children) { @@ -3201,7 +3219,7 @@ class PlayState extends MusicBeatState && daNote.sustainActive && daNote.spotInLine != daNote.parent.children.length) { - health -= 0.20; // give a health punishment for failing a LN + health -= 0.40; // give a health punishment for failing a LN trace("hold fell over at " + daNote.spotInLine); for (i in daNote.parent.children) { @@ -3457,7 +3475,7 @@ class PlayState extends MusicBeatState score = -300; combo = 0; misses++; - health -= 0.06; + health -= 0.1; ss = false; shits++; if (FlxG.save.data.accuracyMod == 0) @@ -3465,7 +3483,7 @@ class PlayState extends MusicBeatState case 'bad': daRating = 'bad'; score = 0; - health -= 0.03; + health -= 0.06; ss = false; bads++; if (FlxG.save.data.accuracyMod == 0) diff --git a/source/PlayStateChangeables.hx b/source/PlayStateChangeables.hx index 17a430a..2e42501 100644 --- a/source/PlayStateChangeables.hx +++ b/source/PlayStateChangeables.hx @@ -5,4 +5,5 @@ class PlayStateChangeables public static var scrollSpeed:Float; public static var botPlay:Bool; public static var Optimize:Bool; + public static var zoom:Float; } \ No newline at end of file diff --git a/source/Ratings.hx b/source/Ratings.hx index 758f8bf..23689a2 100644 --- a/source/Ratings.hx +++ b/source/Ratings.hx @@ -119,7 +119,7 @@ class Ratings public static function checkRating(ms:Float, ts:Float) { - var rating = "sick"; + var rating = "shit"; if (ms <= 166 * ts && ms >= 135 * ts) rating = "shit"; if (ms < 135 * ts && ms >= 90 * ts) diff --git a/source/Waveform.hx b/source/Waveform.hx new file mode 100644 index 0000000..4a282bf --- /dev/null +++ b/source/Waveform.hx @@ -0,0 +1,88 @@ +import flixel.util.FlxColor; +import flixel.FlxG; +import openfl.geom.Rectangle; +import haxe.io.Bytes; +import lime.media.AudioBuffer; +import flixel.FlxSprite; + +class Waveform extends FlxSprite +{ + + /// referenced from https://github.com/gedehari/HaxeFlixel-Waveform-Rendering/blob/master/source/PlayState.hx + /// by gedehari + + public var buffer:AudioBuffer; + public var data:Bytes; + + public function new(x:Int,y:Int, audioPath:String, height:Int) + { + super(x,y); + + var path = StringTools.replace(audioPath, "songs:",""); + + trace("loading " + path); + + buffer = AudioBuffer.fromFile(path); + + trace("BPS: " + buffer.bitsPerSample + " - Channels: " + buffer.channels); + + makeGraphic(height,350,FlxColor.TRANSPARENT); + + angle = 90; + + data = buffer.data.toBytes(); + } + + public function drawWaveform() + { + var index:Int = 0; + var drawIndex:Int = 0; + var samplesPerCollumn:Int = 600; + + var min:Float = 0; + var max:Float = 0; + + while ((index * 4) < (data.length - 1)) + { + var byte:Int = data.getUInt16(index * 4); + + if (byte > 65535 / 2) + byte -= 65535; + + var sample:Float = (byte / 65535); + + if (sample > 0) + { + if (sample > max) + max = sample; + } + else if (sample < 0) + { + if (sample < min) + min = sample; + } + + if ((index % samplesPerCollumn) == 0) + { + // trace("min: " + min + ", max: " + max); + + if (drawIndex > 350) + { + drawIndex = 0; + } + + var pixelsMin:Float = Math.abs(min * 300); + var pixelsMax:Float = max * 300; + + pixels.fillRect(new Rectangle(drawIndex, x, 1, height), 0xFF000000); + pixels.fillRect(new Rectangle(drawIndex, y - pixelsMin, 1, pixelsMin + pixelsMax), FlxColor.WHITE); + drawIndex += 1; + + min = 0; + max = 0; + } + + index += 1; + } + } +} \ No newline at end of file