extends Node3D class_name InputController @export_group("Mapping contexts") @export var base_mode:GUIDEMappingContext @export_group("Move actions") @export var move:GUIDEAction @export var move_left:GUIDEAction @export var move_right:GUIDEAction @export var move_front:GUIDEAction @export var move_back:GUIDEAction @export var rotate_vertical:GUIDEAction @export var rotate_floorplane:GUIDEAction @export_group("Trigger actions") @export_subgroup("Aim") @export var aim_down:GUIDEAction @export var aim_pressed:GUIDEAction @export var aim_released:GUIDEAction @export_subgroup("Jump") @export var jump:GUIDEAction @export var jump_pressed:GUIDEAction @export_subgroup("Slide") @export var slide_pressed:GUIDEAction @export var slide_released:GUIDEAction @export_subgroup("Other") @export var hit:GUIDEAction @export var parry:GUIDEAction @export var dash:GUIDEAction @export var slam:GUIDEAction signal input_device_changed(is_gamepad: bool) var _using_gamepad = false signal input_move(value: Vector3) signal input_rotate_y(value: float) signal input_rotate_floorplane(value: float) signal input_move_keyboard(value: Vector3) # Jump signal input_jump_started signal input_jump_ongoing signal input_jump_ended signal input_aim_pressed signal input_aim_down signal input_aim_released signal input_slide_started signal input_slide_ended signal input_hit signal input_parry signal input_dash signal input_slam func _ready() -> void: GUIDE.enable_mapping_context(base_mode) aim_down.triggered.connect(on_input_aim_down) aim_pressed.triggered.connect(on_input_aim_pressed) aim_released.triggered.connect(on_input_aim_released) jump_pressed.triggered.connect(on_input_jump_started) jump.triggered.connect(on_input_jump_ongoing) jump.completed.connect(on_input_jump_ended) slide_pressed.triggered.connect(on_input_slide_started) slide_released.triggered.connect(on_input_slide_ended) hit.triggered.connect(on_input_hit) parry.triggered.connect(on_input_parry) dash.triggered.connect(on_input_dash) slam.triggered.connect(on_input_slam) func on_input_hit(): input_hit.emit() func on_input_parry(): input_parry.emit() func on_input_dash(): input_dash.emit() func on_input_slam(): input_slam.emit() func on_input_jump_started(): input_jump_started.emit() func on_input_jump_ongoing(): input_jump_ongoing.emit() func on_input_jump_ended(): input_jump_ended.emit() func on_input_aim_down(): input_aim_down.emit() func on_input_aim_pressed(): input_aim_pressed.emit() func on_input_aim_released(): input_aim_released.emit() func on_input_slide_started(): input_slide_started.emit() func on_input_slide_ended(): input_slide_ended.emit() func _input(event: InputEvent) -> void: if event is InputEventKey: if _using_gamepad: _using_gamepad = false input_device_changed.emit(_using_gamepad) elif event is InputEventJoypadMotion: if !_using_gamepad: if abs(event.axis_value) > 0.5: _using_gamepad = true input_device_changed.emit(_using_gamepad) elif event is InputEventJoypadButton: if !_using_gamepad: _using_gamepad = true input_device_changed.emit(_using_gamepad) func _process(_delta: float) -> void: var value_horizontal = -move_left.value_axis_1d + move_right.value_axis_1d var value_vertical = -move_front.value_axis_1d + move_back.value_axis_1d var keyboard_input_vector = Vector3(value_horizontal, 0, value_vertical) input_move_keyboard.emit(keyboard_input_vector) input_move.emit(move.value_axis_3d) input_rotate_y.emit(rotate_vertical.value_axis_1d) input_rotate_floorplane.emit(rotate_floorplane.value_axis_1d)