buckshotroulette-decomp/ControllerManager.gd

104 lines
3.1 KiB
GDScript

class_name ControllerManager extends Node
@export var dynamicallySwappingDevice : bool
@export var buttons : Array[ButtonClass]
@export var brackets : Array[Control]
@export var brackets_3d : Array[Node3D]
@export var cursor : CursorManager
@export var exitingButtons : bool
@export var settingVisibility : bool
@export var mouseRaycast : MouseRaycast
var previousFocus : Control
func _ready():
get_viewport().connect("gui_focus_changed", _on_focus_changed)
var controllers = Input.get_connected_joypads()
func _process(delta):
if (settingVisibility): SetVisibility()
func _on_focus_changed(control:Control):
if (control != null):
previousFocus = control
var controller_currently_enabled = false
func SetMainControllerState(controllerActive : bool):
match controllerActive:
true:
controller_currently_enabled = true
cursor.controller_active = true
SetPrevFocus(true)
cursor.SetCursor(cursor.cursor_visible, false)
false:
controller_currently_enabled = false
cursor.controller_active = false
SetPrevFocus(false)
cursor.SetCursor(cursor.cursor_visible, false)
var printing = false
var checkingForInput = true
func _input(event):
if (dynamicallySwappingDevice && checkingForInput):
#ENABLE CONTROLLER
if(event is InputEventJoypadButton):
cursor.controller_active = true
SetPrevFocus(true)
cursor.SetCursor(cursor.cursor_visible, false)
elif(event is InputEventKey):
if (!IsEventAssignedToNavigation(event)): return
cursor.controller_active = true
SetPrevFocus(true)
cursor.SetCursor(cursor.cursor_visible, false)
#DISABLE CONTROLLER
elif(event is InputEventMouseMotion):
if event.velocity == Vector2(0, 0): return
cursor.controller_active = false
SetPrevFocus(false)
cursor.SetCursor(cursor.cursor_visible, false)
elif(event is InputEventMouseButton):
cursor.controller_active = false
SetPrevFocus(false)
cursor.SetCursor(cursor.cursor_visible, false)
var navigationBinds = ["ui_up", "ui_down", "ui_left", "ui_right"]
func IsEventAssignedToNavigation(key : InputEventKey):
for b in navigationBinds:
if (key.is_action(b)): return true
return false
func SetRebindFocus(settingToPrevious : bool):
if (!settingToPrevious):
previousFocus.release_focus()
return
if (cursor.controller_active):
if (settingToPrevious):
previousFocus.grab_focus()
var fs1 = false
var fs2 = true
@export var stoppingOverride = true
@export var settingFilter : bool
func SetPrevFocus(grabbing : bool):
if (grabbing && !fs1):
ExitButtons()
if (settingFilter): for b in buttons: b.SetFilter("ignore")
if (previousFocus != null): previousFocus.grab_focus()
fs2 = false
fs1 = true
elif (!grabbing && !fs2):
ExitButtons()
if (previousFocus != null): previousFocus.release_focus()
if (stoppingOverride): mouseRaycast.StopRaycastOverride()
if (settingFilter): for b in buttons: b.SetFilter("stop")
fs1 = false
fs2 = true
func SetVisibility():
for b in brackets: b.visible = cursor.controller_active
for b in brackets_3d: b.visible = cursor.controller_active
func ExitButtons():
if (exitingButtons):
for b in buttons:
if(!b.resetting): b.OnExit()