package funkin; import flixel.util.FlxColor; import flixel.text.FlxText; import funkin.modding.events.ScriptEvent; import funkin.modding.module.ModuleHandler; import funkin.modding.events.ScriptEvent.UpdateScriptEvent; import funkin.Conductor.BPMChangeEvent; import flixel.addons.ui.FlxUIState; class MusicBeatState extends FlxUIState { private var curStep:Int = 0; private var curBeat:Int = 0; private var controls(get, never):Controls; private var lastBeatHitTime:Float = 0; inline function get_controls():Controls return PlayerSettings.player1.controls; public var leftWatermarkText:FlxText = null; public var rightWatermarkText:FlxText = null; override function create() { super.create(); if (transIn != null) trace('reg ' + transIn.region); createWatermarkText(); } override function update(elapsed:Float) { super.update(elapsed); // everyStep(); var oldStep:Int = curStep; updateCurStep(); updateBeat(); if (oldStep != curStep && curStep >= 0) stepHit(); dispatchEvent(new UpdateScriptEvent(elapsed)); } function createWatermarkText() { // Both have an xPos of 0, but a width equal to the full screen. // The rightWatermarkText is right aligned, which puts the text in the correct spot. leftWatermarkText = new FlxText(0, FlxG.height - 18, FlxG.width, '', 12); rightWatermarkText = new FlxText(0, FlxG.height - 18, FlxG.width, '', 12); // 100,000 should be good enough. leftWatermarkText.zIndex = 100000; rightWatermarkText.zIndex = 100000; leftWatermarkText.scrollFactor.set(0, 0); rightWatermarkText.scrollFactor.set(0, 0); leftWatermarkText.setFormat("VCR OSD Mono", 16, FlxColor.WHITE, LEFT, FlxTextBorderStyle.OUTLINE, FlxColor.BLACK); rightWatermarkText.setFormat("VCR OSD Mono", 16, FlxColor.WHITE, RIGHT, FlxTextBorderStyle.OUTLINE, FlxColor.BLACK); add(leftWatermarkText); add(rightWatermarkText); } function dispatchEvent(event:ScriptEvent) { ModuleHandler.callEvent(event); } private function updateBeat():Void { curBeat = Math.floor(curStep / 4); } private function updateCurStep():Void { 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]; } curStep = lastChange.stepTime + Math.floor((Conductor.songPosition - lastChange.songTime) / Conductor.stepCrochet); } public function stepHit():Void { if (curStep % 4 == 0) beatHit(); } public function beatHit():Void { lastBeatHitTime = Conductor.songPosition; // do literally nothing dumbass } }