diff --git a/source/funkin/input/Controls.hx b/source/funkin/input/Controls.hx index 366feb42..bcc45ae1 100644 --- a/source/funkin/input/Controls.hx +++ b/source/funkin/input/Controls.hx @@ -45,6 +45,10 @@ class Controls public var UI_DOWN_P(get, never):Bool; public var UI_UP_P(get, never):Bool; public var UI_RIGHT_P(get, never):Bool; + public var UI_LEFT_T(get, never):Bool; + public var UI_DOWN_T(get, never):Bool; + public var UI_UP_T(get, never):Bool; + public var UI_RIGHT_T(get, never):Bool; public var ACCEPT(get, never):Bool; public var BACK(get, never):Bool; public var PAUSE(get, never):Bool; @@ -149,6 +153,30 @@ class Controls return getAction(UIRight).checkPressed(); } + @:noCompletion + inline function get_UI_LEFT_T():Bool + { + return getAction(UILeft).checkTurbo(); + } + + @:noCompletion + inline function get_UI_DOWN_T():Bool + { + return getAction(UIDown).checkTurbo(); + } + + @:noCompletion + inline function get_UI_UP_T():Bool + { + return getAction(UIUp).checkTurbo(); + } + + @:noCompletion + inline function get_UI_RIGHT_T():Bool + { + return getAction(UIRight).checkTurbo(); + } + @:noCompletion inline function get_ACCEPT():Bool { diff --git a/source/funkin/input/FunkinAction.hx b/source/funkin/input/FunkinAction.hx index 30f9a878..3d3505ef 100644 --- a/source/funkin/input/FunkinAction.hx +++ b/source/funkin/input/FunkinAction.hx @@ -15,6 +15,10 @@ class FunkinAction var timestamp(default, null):Int = -1; + var spamming:Bool = false; + var spamTicks:Int = 0; + var lastTicks:Int = -1; + public function new(keys:Array, buttons:Array) { this.keys = keys; @@ -37,6 +41,9 @@ class FunkinAction public inline function checkPressed():Bool return FlxG.game.ticks - timestamp <= FlxG.elapsed * Constants.MS_PER_SEC; + public inline function checkTurbo():Bool + return TurboControl.check(this); + public inline function hasKey(key:FlxKey):Bool return keys.contains(key); diff --git a/source/funkin/input/TurboControl.hx b/source/funkin/input/TurboControl.hx new file mode 100644 index 00000000..8316f3e8 --- /dev/null +++ b/source/funkin/input/TurboControl.hx @@ -0,0 +1,58 @@ +package funkin.input; + +@:access(funkin.input.FunkinAction) +class TurboControl +{ + static var registry:Map = new Map(); + + public static function check(action:FunkinAction):Bool + { + var TurboControl:Null = registry.get(action); + + if (TurboControl == null) + { + TurboControl = new TurboControl(action); + registry.set(action, TurboControl); + } + + return TurboControl?.active ?? false; + } + + public var active:Bool = false; + + var action:FunkinAction; + + var spamming:Bool = false; + var spamTimer:Float = 0; + + public function new(action:FunkinAction) + { + this.action = action; + FlxG.signals.preUpdate.add(() -> update(FlxG.elapsed)); + } + + function update(elapsed:Float):Void + { + active = false; + + if (action.check()) + { + if (spamming && spamTimer >= 0.07) + { + spamTimer = 0; + active = true; + } + else if (!spamming && spamTimer >= 0.5) + spamming = true; + else if (spamTimer <= 0) + active = true; + + spamTimer += elapsed; + } + else + { + spamming = false; + spamTimer = 0; + } + } +} diff --git a/source/funkin/ui/freeplay/capsule/CapsuleGroup.hx b/source/funkin/ui/freeplay/capsule/CapsuleGroup.hx index 6b1fc6c0..12ff795a 100644 --- a/source/funkin/ui/freeplay/capsule/CapsuleGroup.hx +++ b/source/funkin/ui/freeplay/capsule/CapsuleGroup.hx @@ -37,8 +37,8 @@ class CapsuleGroup extends FlxTypedGroup { super.update(elapsed); - var up:Bool = Controls.instance.UI_UP_P; - var down:Bool = Controls.instance.UI_DOWN_P; + var up:Bool = Controls.instance.UI_UP_T; + var down:Bool = Controls.instance.UI_DOWN_T; if ((up || down) && !busy) change(up ? -1 : 1); diff --git a/source/funkin/ui/options/OptionList.hx b/source/funkin/ui/options/OptionList.hx index 3e8ba00f..dea9df6d 100644 --- a/source/funkin/ui/options/OptionList.hx +++ b/source/funkin/ui/options/OptionList.hx @@ -33,10 +33,10 @@ class OptionList extends FlxTypedGroup