Files
2025-05-27 19:20:46 +02:00

58 lines
1.8 KiB
GDScript

## This is the main game controller. It enables a control scheme at the start and is
## responsible for controlling the remapping dialog.
extends Node
const Utils = preload("utils.gd")
@export_group("Context & Modifiers")
@export var keyboard:GUIDEMappingContext
@export var controller:GUIDEMappingContext
@export var controller_axis_invert_modifier:GUIDEModifierNegate
@export_group("Actions")
@export var switch_to_keyboard:GUIDEAction
@export var switch_to_controller:GUIDEAction
@export var open_menu:GUIDEAction
@onready var _remapping_dialog:Control = %RemappingDialog
func _ready():
# React when the open menu action is triggered.
open_menu.triggered.connect(_open_menu)
# and switching to controller / keyboard ...
switch_to_controller.triggered.connect(_switch.bind(controller))
switch_to_keyboard.triggered.connect(_switch.bind(keyboard))
# Also listen to when the remapping dialog closes and re-apply the changed
# mapping config
_remapping_dialog.closed.connect(_load_remapping_config)
# Start with the keyboard scheme
GUIDE.enable_mapping_context(keyboard)
# finally enable all controls with the last saved remapping configuration
_load_remapping_config(Utils.load_remapping_config())
func _open_menu() -> void:
# and show the remapping dialog
_remapping_dialog.open()
func _load_remapping_config(config:GUIDERemappingConfig):
GUIDE.set_remapping_config(config)
# also apply changes to our modifiers
controller_axis_invert_modifier.x = config.custom_data.get(Utils.CUSTOM_DATA_INVERT_HORIZONTAL, false)
controller_axis_invert_modifier.y = config.custom_data.get(Utils.CUSTOM_DATA_INVERT_VERTICAL, false)
func _switch(context:GUIDEMappingContext):
# ignore while remapping is active, remapping will take care of it
if _remapping_dialog.visible:
return
GUIDE.enable_mapping_context(context, true)