2022-03-08 08:13:53 +00:00
|
|
|
package funkin;
|
2020-10-28 09:26:33 +00:00
|
|
|
|
|
|
|
import flixel.FlxSubState;
|
2022-09-07 23:07:08 +00:00
|
|
|
import flixel.util.FlxColor;
|
2022-04-18 23:36:09 +00:00
|
|
|
import funkin.Conductor.BPMChangeEvent;
|
|
|
|
import funkin.modding.events.ScriptEvent;
|
|
|
|
import funkin.modding.module.ModuleHandler;
|
2020-10-28 09:26:33 +00:00
|
|
|
|
2022-04-18 23:36:09 +00:00
|
|
|
/**
|
|
|
|
* MusicBeatSubstate reincorporates the functionality of MusicBeatState into an FlxSubState.
|
|
|
|
*/
|
2020-10-28 09:26:33 +00:00
|
|
|
class MusicBeatSubstate extends FlxSubState
|
|
|
|
{
|
2022-07-07 01:49:42 +00:00
|
|
|
public function new(bgColor:FlxColor = FlxColor.TRANSPARENT)
|
2020-10-28 09:26:33 +00:00
|
|
|
{
|
2022-07-07 01:49:42 +00:00
|
|
|
super(bgColor);
|
2020-10-28 09:26:33 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
private var curStep:Int = 0;
|
|
|
|
private var curBeat:Int = 0;
|
|
|
|
private var controls(get, never):Controls;
|
|
|
|
|
|
|
|
inline function get_controls():Controls
|
|
|
|
return PlayerSettings.player1.controls;
|
|
|
|
|
|
|
|
override function update(elapsed:Float)
|
|
|
|
{
|
2021-06-23 08:15:44 +00:00
|
|
|
// everyStep();
|
2021-02-12 00:58:11 +00:00
|
|
|
var oldStep:Int = curStep;
|
2020-10-28 09:26:33 +00:00
|
|
|
|
|
|
|
updateCurStep();
|
2021-02-12 02:19:27 +00:00
|
|
|
curBeat = Math.floor(curStep / 4);
|
2021-02-12 00:58:11 +00:00
|
|
|
|
2021-03-17 17:33:26 +00:00
|
|
|
if (oldStep != curStep && curStep >= 0)
|
2021-02-12 00:58:11 +00:00
|
|
|
stepHit();
|
|
|
|
|
2020-10-28 09:26:33 +00:00
|
|
|
super.update(elapsed);
|
|
|
|
}
|
|
|
|
|
|
|
|
private function updateCurStep():Void
|
|
|
|
{
|
2021-02-11 22:06:26 +00:00
|
|
|
var lastChange:BPMChangeEvent = {
|
|
|
|
stepTime: 0,
|
|
|
|
songTime: 0,
|
|
|
|
bpm: 0
|
|
|
|
}
|
|
|
|
for (i in 0...Conductor.bpmChangeMap.length)
|
2020-10-28 09:26:33 +00:00
|
|
|
{
|
2021-02-11 22:06:26 +00:00
|
|
|
if (Conductor.songPosition > Conductor.bpmChangeMap[i].songTime)
|
|
|
|
lastChange = Conductor.bpmChangeMap[i];
|
2020-10-28 09:26:33 +00:00
|
|
|
}
|
|
|
|
|
2022-07-07 00:37:35 +00:00
|
|
|
curStep = lastChange.stepTime + Math.floor(((Conductor.songPosition - Conductor.audioOffset) - lastChange.songTime) / Conductor.stepCrochet);
|
2020-10-28 09:26:33 +00:00
|
|
|
}
|
|
|
|
|
2022-07-23 02:25:19 +00:00
|
|
|
public function stepHit():Bool
|
2020-10-28 09:26:33 +00:00
|
|
|
{
|
2022-07-23 02:25:19 +00:00
|
|
|
var event = new SongTimeScriptEvent(ScriptEvent.SONG_STEP_HIT, curBeat, curStep);
|
|
|
|
|
|
|
|
dispatchEvent(event);
|
|
|
|
|
|
|
|
if (event.eventCanceled)
|
|
|
|
return false;
|
|
|
|
|
2021-02-12 02:19:27 +00:00
|
|
|
if (curStep % 4 == 0)
|
2020-10-28 09:26:33 +00:00
|
|
|
beatHit();
|
2022-07-23 02:25:19 +00:00
|
|
|
|
|
|
|
return true;
|
2020-10-28 09:26:33 +00:00
|
|
|
}
|
|
|
|
|
2022-04-18 23:36:09 +00:00
|
|
|
function dispatchEvent(event:ScriptEvent)
|
|
|
|
{
|
|
|
|
ModuleHandler.callEvent(event);
|
|
|
|
}
|
|
|
|
|
2022-09-07 23:07:08 +00:00
|
|
|
/**
|
|
|
|
* Close this substate and replace it with a different one.
|
|
|
|
*/
|
|
|
|
public function switchSubState(substate:FlxSubState):Void
|
|
|
|
{
|
|
|
|
this.close();
|
|
|
|
this._parentState.openSubState(substate);
|
|
|
|
}
|
|
|
|
|
2022-07-23 02:25:19 +00:00
|
|
|
public function beatHit():Bool
|
2020-10-28 09:26:33 +00:00
|
|
|
{
|
2022-07-23 02:25:19 +00:00
|
|
|
var event = new SongTimeScriptEvent(ScriptEvent.SONG_BEAT_HIT, curBeat, curStep);
|
|
|
|
|
|
|
|
dispatchEvent(event);
|
|
|
|
|
|
|
|
if (event.eventCanceled)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
return true;
|
2020-10-28 09:26:33 +00:00
|
|
|
}
|
|
|
|
}
|