diff --git a/config.gd b/config.gd new file mode 100644 index 0000000..602a97f --- /dev/null +++ b/config.gd @@ -0,0 +1,45 @@ +extends Node + +const PATH := "user://config.cfg" +const SECTION := "settings" + +const JOYSTICK_LABELS := "joystick_labels" +const TRACK_JOYSTICK_MOVEMENT := "track_joystick_movement" +const TRACK_JOYSTICK_DRIFT := "track_joystick_drift" + +var _config: ConfigFile + +# Joystick +var joystick_labels: bool = true: + set(val): + joystick_labels = val + save_config() +var track_joystick_movement: bool = true: + set(val): + track_joystick_movement = val + save_config() +var track_joystick_drift: bool = true: + set(val): + track_joystick_drift = val + save_config() + +func _ready() -> void: + self._config = ConfigFile.new() + var err := self._config.load(PATH) + if err != OK: + self.save_config() + print_debug("Auto generated config file") + + self.joystick_labels = self._config.get_value(SECTION, JOYSTICK_LABELS, true) + self.track_joystick_movement = self._config.get_value(SECTION, TRACK_JOYSTICK_MOVEMENT, true) + self.track_joystick_drift = self._config.get_value(SECTION, TRACK_JOYSTICK_DRIFT, true) + +func save_config() -> void: + self._config.set_value(SECTION, JOYSTICK_LABELS, self.joystick_labels) + self._config.set_value(SECTION, TRACK_JOYSTICK_MOVEMENT, self.track_joystick_movement) + self._config.set_value(SECTION, TRACK_JOYSTICK_DRIFT, self.track_joystick_drift) + + var err := self._config.save(PATH) + if err != OK: + printerr("Failed to save config") + return diff --git a/config.gd.uid b/config.gd.uid new file mode 100644 index 0000000..059ccbe --- /dev/null +++ b/config.gd.uid @@ -0,0 +1 @@ +uid://doaovsp1ac3o0 diff --git a/controller/controller.gd b/controller/controller.gd index 7dcdcf0..f4f8fbd 100644 --- a/controller/controller.gd +++ b/controller/controller.gd @@ -1,10 +1,5 @@ extends Control -const NO_DEVICE := "No Active Device" - -const DEFAULT_COLOR := Color(0x2a2a2aff) -const ACTIVE_COLOR := Color(0x4a8e53ff) - @onready var device_name: RichTextLabel = $Device var _has_joy := false @@ -27,7 +22,7 @@ func _process(_delta: float) -> void: if Input.get_connected_joypads().size() <= 0: self._has_joy = false - self.device_name.text = NO_DEVICE + self.device_name.text = WyHelper.NO_DEVICE return for btn in self._buttons: @@ -35,10 +30,10 @@ func _process(_delta: float) -> void: continue var cbtn := btn as ControllerButton - cbtn.color = DEFAULT_COLOR + cbtn.color = WyHelper.DEFAULT_COLOR if cbtn.input_code && Input.is_action_pressed(cbtn.input_code): - cbtn.color = ACTIVE_COLOR + cbtn.color = WyHelper.ACTIVE_COLOR for btn in self._triggers: if not btn is ControllerTrigger: diff --git a/controller/joystick/joystick.gd b/controller/joystick/joystick.gd index 45f84f4..530eccb 100644 --- a/controller/joystick/joystick.gd +++ b/controller/joystick/joystick.gd @@ -1,11 +1,5 @@ extends Panel -const DRIFT_DEADZONE := 0.03; -const REST_DEADZONE := 0.05; -const DEFAULT_COLOR := Color(0x2a2a2aff) -const ACTIVE_COLOR := Color(0x4a8e53ff) -const ERROR_COLOR := Color(0xbe2037ff) - @onready var pos: Panel = $Pos @onready var label_node: RichTextLabel = $Label @onready var box_theme: StyleBoxFlat = preload("uid://bgb7rlf1chjnd") as StyleBoxFlat @@ -14,11 +8,13 @@ const ERROR_COLOR := Color(0xbe2037ff) @export var axis_y: JoyAxis var _dot_style: StyleBoxFlat +var _last_x := 0.0 +var _last_y := 0.0 func _ready() -> void: self._dot_style = box_theme.duplicate() self.pos.add_theme_stylebox_override("panel", self._dot_style) - self._dot_style.bg_color = DEFAULT_COLOR + self._dot_style.bg_color = WyHelper.DEFAULT_COLOR func _process(_delta: float) -> void: var x := Input.get_joy_axis(0, self.axis_x) @@ -27,16 +23,23 @@ func _process(_delta: float) -> void: self.pos.position.x = (x * 128.0) + 104.0 self.pos.position.y = (y * 128.0) + 104.0 - var is_moving := x > REST_DEADZONE || y > REST_DEADZONE \ - || x < -REST_DEADZONE || y < -REST_DEADZONE - var is_drifting := x >= DRIFT_DEADZONE || y >= DRIFT_DEADZONE \ - || x <= -DRIFT_DEADZONE || y <= -DRIFT_DEADZONE + var speed_x: float = abs(x - self._last_x) + var speed_y: float = abs(y - self._last_y) - if is_moving: - self._dot_style.bg_color = ACTIVE_COLOR - elif is_drifting: - self._dot_style.bg_color = ERROR_COLOR + var is_moving: bool = speed_x > WyHelper.DRIFT_DEADZONE || speed_y > WyHelper.DRIFT_DEADZONE + var is_drifting: bool = !is_moving && (speed_x > WyHelper.REST_DEADZONE || speed_y > WyHelper.REST_DEADZONE) + var is_stuck: bool = (abs(x) > WyHelper.DRIFT_DEADZONE && abs(x) <= WyHelper.STUCK_DEADZONE) \ + && (abs(y) > WyHelper.DRIFT_DEADZONE && abs(y) <= WyHelper.STUCK_DEADZONE) + + if Config.track_joystick_movement && is_moving: + self._dot_style.bg_color = WyHelper.ACTIVE_COLOR + elif Config.track_joystick_drift && (is_drifting || is_stuck): + self._dot_style.bg_color = WyHelper.ERROR_COLOR else: - self._dot_style.bg_color = DEFAULT_COLOR + self._dot_style.bg_color = WyHelper.DEFAULT_COLOR - self.label_node.text = "x:%0.2f y:%0.2f" % [x, y] + if Config.joystick_labels: + self.label_node.text = "x:%0.2f y:%0.2f" % [x, y] + + self._last_x = x + self._last_y = y diff --git a/helper.gd b/helper.gd new file mode 100644 index 0000000..ea6c542 --- /dev/null +++ b/helper.gd @@ -0,0 +1,11 @@ +extends Node + +const NO_DEVICE := "No Active Device" + +const DRIFT_DEADZONE := 0.01; +const REST_DEADZONE := 0.005; +const STUCK_DEADZONE := 0.05; + +const DEFAULT_COLOR := Color(0x2a2a2aff) +const ACTIVE_COLOR := Color(0x4a8e53ff) +const ERROR_COLOR := Color(0xbe2037ff) diff --git a/helper.gd.uid b/helper.gd.uid new file mode 100644 index 0000000..d592f66 --- /dev/null +++ b/helper.gd.uid @@ -0,0 +1 @@ +uid://dn6sj0up74oxj diff --git a/project.godot b/project.godot index cc5ebaa..a1332ea 100644 --- a/project.godot +++ b/project.godot @@ -20,6 +20,11 @@ boot_splash/fullsize=false boot_splash/use_filter=false config/icon="res://icon.svg" +[autoload] + +WyHelper="*res://helper.gd" +Config="*res://config.gd" + [debug] gdscript/warnings/untyped_declaration=2