package; import flixel.FlxBasic; #if windows import Discord.DiscordClient; #end import flixel.util.FlxColor; import openfl.Lib; import Conductor.BPMChangeEvent; import flixel.FlxG; import flixel.addons.ui.FlxUIState; class MusicBeatState extends FlxUIState { private var lastBeat:Float = 0; private var lastStep:Float = 0; private var curStep:Int = 0; private var curBeat:Int = 0; private var curDecimalBeat:Float = 0; private var controls(get, never):Controls; inline function get_controls():Controls return PlayerSettings.player1.controls; private var assets:Array = []; override function add(Object:flixel.FlxBasic):flixel.FlxBasic { if (FlxG.save.data.optimize) assets.push(Object); return super.add(Object); } public function clean() { if (FlxG.save.data.optimize) for(i in assets) { remove(i); } } override function create() { TimingStruct.clearTimings(); (cast (Lib.current.getChildAt(0), Main)).setFPSCap(FlxG.save.data.fpsCap); if (transIn != null) trace('reg ' + transIn.region); super.create(); } var array:Array = [ FlxColor.fromRGB(148, 0, 211), FlxColor.fromRGB(75, 0, 130), FlxColor.fromRGB(0, 0, 255), FlxColor.fromRGB(0, 255, 0), FlxColor.fromRGB(255, 255, 0), FlxColor.fromRGB(255, 127, 0), FlxColor.fromRGB(255, 0 , 0) ]; var skippedFrames = 0; override function update(elapsed:Float) { //everyStep(); /*var nextStep:Int = updateCurStep(); if (nextStep >= 0) { if (nextStep > curStep) { for (i in curStep...nextStep) { curStep++; updateBeat(); stepHit(); } } else if (nextStep < curStep) { //Song reset? curStep = nextStep; updateBeat(); stepHit(); } }*/ if (Conductor.songPosition < 0) curDecimalBeat = 0; else { if (TimingStruct.AllTimings.length > 1) { var data = TimingStruct.getTimingAtTimestamp(Conductor.songPosition); FlxG.watch.addQuick("Current Conductor Timing Seg", data.bpm); Conductor.crochet = ((60 / data.bpm) * 1000); var step = ((60 / data.bpm) * 1000) / 4; var startInMS = (data.startTime * 1000); curDecimalBeat = data.startBeat + (((Conductor.songPosition/1000) - data.startTime) * (data.bpm / 60)); var ste:Int = Math.floor(data.startStep + ((Conductor.songPosition - startInMS) / step)); if (ste >= 0) { if (ste > curStep) { for (i in curStep...ste) { curStep++; updateBeat(); stepHit(); } } else if (ste < curStep) { trace("reset steps for some reason?? at " + Conductor.songPosition); //Song reset? curStep = ste; updateBeat(); stepHit(); } } } else { curDecimalBeat = (Conductor.songPosition / 1000) * (Conductor.bpm/60); var nextStep:Int = Math.floor(Conductor.songPosition / Conductor.stepCrochet); if (nextStep >= 0) { if (nextStep > curStep) { for (i in curStep...nextStep) { curStep++; updateBeat(); stepHit(); } } else if (nextStep < curStep) { //Song reset? trace("(no bpm change) reset steps for some reason?? at " + Conductor.songPosition); curStep = nextStep; updateBeat(); stepHit(); } } Conductor.crochet = ((60 / Conductor.bpm) * 1000); } } if (FlxG.save.data.fpsRain && skippedFrames >= 6) { if (currentColor >= array.length) currentColor = 0; (cast (Lib.current.getChildAt(0), Main)).changeFPSColor(array[currentColor]); currentColor++; skippedFrames = 0; } else skippedFrames++; if ((cast (Lib.current.getChildAt(0), Main)).getFPSCap != FlxG.save.data.fpsCap && FlxG.save.data.fpsCap <= 290) (cast (Lib.current.getChildAt(0), Main)).setFPSCap(FlxG.save.data.fpsCap); super.update(elapsed); } private function updateBeat():Void { lastBeat = curBeat; curBeat = Math.floor(curStep / 4); } public static var currentColor = 0; private function updateCurStep():Int { var lastChange:BPMChangeEvent = { stepTime: 0, songTime: 0, bpm: 0 } for (i in 0...Conductor.bpmChangeMap.length) { if (Conductor.songPosition >= Conductor.bpmChangeMap[i].songTime) lastChange = Conductor.bpmChangeMap[i]; } return lastChange.stepTime + Math.floor((Conductor.songPosition - lastChange.songTime) / Conductor.stepCrochet); } public function stepHit():Void { if (curStep % 4 == 0) beatHit(); } public function beatHit():Void { //do literally nothing dumbass } public function fancyOpenURL(schmancy:String) { #if linux Sys.command('/usr/bin/xdg-open', [schmancy, "&"]); #else FlxG.openURL(schmancy); #end } }