From b76966176524dc977cb89910fb7fa363a2fb6ddd Mon Sep 17 00:00:00 2001 From: isXander Date: Sun, 16 Apr 2023 23:10:40 +0100 Subject: [PATCH] more themes, fix input events passing to ingame from screen, changelog, fix button guide sneak wrong in some places --- .github/README.md | 20 +++-- changelogs/1.1.0-beta.3+1.19.4.md | 83 ++++++++++++++++++ .../dev/isxander/controlify/Controlify.java | 12 ++- .../controlify/api/ControlifyApi.java | 2 +- .../bindings/ControllerBindings.java | 1 - .../controlify/config/gui/YACLHelper.java | 28 ++++-- .../gamepad/BuiltinGamepadTheme.java | 3 +- .../controller/gamepad/GamepadController.java | 10 --- .../ingame/ControllerPlayerMovement.java | 24 +++-- .../ingame/guide/InGameButtonGuide.java | 7 +- .../controller_identification.json5 | 2 +- .../assets/controlify/lang/en_us.json | 1 + .../gui/gamepad/steam_deck/a_button.png | Bin 0 -> 1579 bytes .../gui/gamepad/steam_deck/b_button.png | Bin 0 -> 1600 bytes .../textures/gui/gamepad/steam_deck/back.png | Bin 0 -> 166 bytes .../gui/gamepad/steam_deck/dpad_down.png | Bin 0 -> 181 bytes .../gui/gamepad/steam_deck/dpad_left.png | Bin 0 -> 180 bytes .../gui/gamepad/steam_deck/dpad_right.png | Bin 0 -> 180 bytes .../gui/gamepad/steam_deck/dpad_up.png | Bin 0 -> 183 bytes .../textures/gui/gamepad/steam_deck/guide.png | Bin 0 -> 1625 bytes .../gui/gamepad/steam_deck/left_bumper.png | Bin 0 -> 152 bytes .../gamepad/steam_deck/left_stick_down.png | Bin 0 -> 207 bytes .../gamepad/steam_deck/left_stick_left.png | Bin 0 -> 212 bytes .../gamepad/steam_deck/left_stick_press.png | Bin 0 -> 193 bytes .../gamepad/steam_deck/left_stick_right.png | Bin 0 -> 217 bytes .../gui/gamepad/steam_deck/left_stick_up.png | Bin 0 -> 206 bytes .../gui/gamepad/steam_deck/left_trigger.png | Bin 0 -> 154 bytes .../gui/gamepad/steam_deck/right_bumper.png | Bin 0 -> 147 bytes .../gamepad/steam_deck/right_stick_down.png | Bin 0 -> 206 bytes .../gamepad/steam_deck/right_stick_left.png | Bin 0 -> 213 bytes .../gamepad/steam_deck/right_stick_press.png | Bin 0 -> 192 bytes .../gamepad/steam_deck/right_stick_right.png | Bin 0 -> 216 bytes .../gui/gamepad/steam_deck/right_stick_up.png | Bin 0 -> 206 bytes .../gui/gamepad/steam_deck/right_trigger.png | Bin 0 -> 153 bytes .../textures/gui/gamepad/steam_deck/start.png | Bin 0 -> 191 bytes .../gui/gamepad/steam_deck/touchpad.png | Bin 0 -> 2486 bytes .../gui/gamepad/steam_deck/x_button.png | Bin 0 -> 1599 bytes .../gui/gamepad/steam_deck/y_button.png | Bin 0 -> 1613 bytes 38 files changed, 145 insertions(+), 48 deletions(-) create mode 100644 changelogs/1.1.0-beta.3+1.19.4.md create mode 100644 src/main/resources/assets/controlify/textures/gui/gamepad/steam_deck/a_button.png create mode 100644 src/main/resources/assets/controlify/textures/gui/gamepad/steam_deck/b_button.png create mode 100644 src/main/resources/assets/controlify/textures/gui/gamepad/steam_deck/back.png create mode 100644 src/main/resources/assets/controlify/textures/gui/gamepad/steam_deck/dpad_down.png create mode 100644 src/main/resources/assets/controlify/textures/gui/gamepad/steam_deck/dpad_left.png create mode 100644 src/main/resources/assets/controlify/textures/gui/gamepad/steam_deck/dpad_right.png create mode 100644 src/main/resources/assets/controlify/textures/gui/gamepad/steam_deck/dpad_up.png create mode 100644 src/main/resources/assets/controlify/textures/gui/gamepad/steam_deck/guide.png create mode 100644 src/main/resources/assets/controlify/textures/gui/gamepad/steam_deck/left_bumper.png create mode 100644 src/main/resources/assets/controlify/textures/gui/gamepad/steam_deck/left_stick_down.png create mode 100644 src/main/resources/assets/controlify/textures/gui/gamepad/steam_deck/left_stick_left.png create mode 100644 src/main/resources/assets/controlify/textures/gui/gamepad/steam_deck/left_stick_press.png create mode 100644 src/main/resources/assets/controlify/textures/gui/gamepad/steam_deck/left_stick_right.png create mode 100644 src/main/resources/assets/controlify/textures/gui/gamepad/steam_deck/left_stick_up.png create mode 100644 src/main/resources/assets/controlify/textures/gui/gamepad/steam_deck/left_trigger.png create mode 100644 src/main/resources/assets/controlify/textures/gui/gamepad/steam_deck/right_bumper.png create mode 100644 src/main/resources/assets/controlify/textures/gui/gamepad/steam_deck/right_stick_down.png create mode 100644 src/main/resources/assets/controlify/textures/gui/gamepad/steam_deck/right_stick_left.png create mode 100644 src/main/resources/assets/controlify/textures/gui/gamepad/steam_deck/right_stick_press.png create mode 100644 src/main/resources/assets/controlify/textures/gui/gamepad/steam_deck/right_stick_right.png create mode 100644 src/main/resources/assets/controlify/textures/gui/gamepad/steam_deck/right_stick_up.png create mode 100644 src/main/resources/assets/controlify/textures/gui/gamepad/steam_deck/right_trigger.png create mode 100644 src/main/resources/assets/controlify/textures/gui/gamepad/steam_deck/start.png create mode 100644 src/main/resources/assets/controlify/textures/gui/gamepad/steam_deck/touchpad.png create mode 100644 src/main/resources/assets/controlify/textures/gui/gamepad/steam_deck/x_button.png create mode 100644 src/main/resources/assets/controlify/textures/gui/gamepad/steam_deck/y_button.png diff --git a/.github/README.md b/.github/README.md index d61150c..f8e61c3 100644 --- a/.github/README.md +++ b/.github/README.md @@ -19,14 +19,6 @@ Another fabric mod to add controller support to Minecraft Java - with a focus on -## Work In Progress - -This mod is still in development (so is this readme!) and is not ready for use. If you want to help contribute, -there are a few things you can do: - -- Find/create controller diagrams & buttons for each major controller brand. -- Add built-in support for common mod GUIs (contact me for a how-to). - ## Why another? Yes, mods like [Midnight Controls](https://modrinth.com/mod/midnight-controls) already exist. However due to the fact it @@ -35,6 +27,18 @@ create this mod! ## Features +### Controller vibration + +Controlify supports controller vibration, which has not been seen before for PC versions of Minecraft, +including Bedrock Windows 10 Edition. Configure the intensity of each vibration source, with +complex vibration patterns for lots of aspects of the game (e.g. when you take damage). + +### Built-in gyro support + +Controlify has built-in support for controller gyroscopes, allowing you to make fine movements in-game +with your controller. This can be combined with [flick stick](https://www.reddit.com/r/gamedev/comments/bw5xct/flick_stick_is_a_new_way_to_control_3d_games_with/) to be able to use a controller without +the compromise. + ### Controller identification Controlify has the ability to identify the make and model of your controller automatically, diff --git a/changelogs/1.1.0-beta.3+1.19.4.md b/changelogs/1.1.0-beta.3+1.19.4.md new file mode 100644 index 0000000..b00afaa --- /dev/null +++ b/changelogs/1.1.0-beta.3+1.19.4.md @@ -0,0 +1,83 @@ +# Controlify 1.1 (Beta 3) + +## New Features + +### Gyro support + +Controlify now has built-in support for controller gyroscopes, allowing you to make fine movements in-game. +This can be combined with [flick stick](https://www.reddit.com/r/gamedev/comments/bw5xct/flick_stick_is_a_new_way_to_control_3d_games_with/) to be able to use a controller without +the compromise of using the thumbsticks. + +This requires use of a compatible controller, such as a Dualsense controller. + +Currently, the Steam Deck is not supported, as it does not expose the gyro data to the OS, however, explicit +support for this device is planned in the future. + +## UI sounds + +A toggleable setting enables playing the legacy console edition UI sound when changing the selected component +in GUIs. In the future, this will be expanded to have more sounds. + +### Under-the-hood drivers + +Controlify now uses a new driver system, which allows me to combine multiple libraries to create a more +powerful controller interface, with a modular system to mix and match drivers. + +This means in the future, I can add more advanced features per-controller, such as Steam Deck touchpad and +back buttons explicitly supported in-game. + +### Improved joystick mapping + +Allows the mapping of joysticks to be more flexible, allowing for more complex mappings. This has been +battle-tested with a Thrustmaster TM.16000M FCS HOTAS joystick. + +### Built-in resource pack for extra mappings + +Controlify now has a built-in resource pack, which contains mappings and language files for the +aforementioned joystick. + +The split was done to not modify the default language file, which would become huge in size and potentially cause merge +conflicts. + +### Improved crash handling + +Where possible, Controlify now generates Minecraft crash reports with details of the controller which +caused the crash. + +## Changes + +### Screen navigation improvements + +Moving between components in GUIs feel more like most other games, where when holding the stick in a direction, +it moves once, waits a bit, and then moves through components quickly. Think holding down a key while you type. + +### More controller identifications + +More controllers are now identified out-of-box, particularly the PS3 and Dualsense controllers. + +Along with that, Dualsense, PS3 and Steam Deck now have textures. + +### Vibration natives downloading changes + +The vibration natives are now downloaded from my maven repository, allowing for better version control +and syncing with the mod version. + +## Bug Fixes + +- Fixed a bug where closing the pause menu or similar menu would cause you to trigger in-game inputs if + bound to the same button +- Fixed YetAnotherConfigLib not being declared as a fabric dependency, causing crashes if not present. + +## API Changes + +### Sources JAR now published + +The sources JAR is now published to the maven repository, allowing you to debug Controlify and view documentation in your IDE. + +### Controller binding API refactor + +Controller binding API has had a minor refactor that will cause incompatibilities with mods. + +### YACL option binding generator + +Bindings now allow you to create a YACL option, to add to your own config GUIs. diff --git a/src/main/java/dev/isxander/controlify/Controlify.java b/src/main/java/dev/isxander/controlify/Controlify.java index 42db320..fddeb89 100644 --- a/src/main/java/dev/isxander/controlify/Controlify.java +++ b/src/main/java/dev/isxander/controlify/Controlify.java @@ -228,8 +228,9 @@ public class Controlify implements ControlifyApi { controller.rumbleManager().tick(); } - if (state.hasAnyInput()) + if (state.hasAnyInput()) { this.setInputMode(InputMode.CONTROLLER); + } if (consecutiveInputSwitches > 100) { LOGGER.warn("Controlify detected current controller to be constantly giving input and has been disabled."); @@ -408,8 +409,8 @@ public class Controlify implements ControlifyApi { } @Override - public void setInputMode(@NotNull InputMode currentInputMode) { - if (this.currentInputMode == currentInputMode) return; + public boolean setInputMode(@NotNull InputMode currentInputMode) { + if (this.currentInputMode == currentInputMode) return false; this.currentInputMode = currentInputMode; var minecraft = Minecraft.getInstance(); @@ -432,7 +433,12 @@ public class Controlify implements ControlifyApi { } lastInputSwitchTime = Blaze3D.getTime(); + if (currentInputMode == InputMode.CONTROLLER) + getCurrentController().ifPresent(Controller::clearState); + ControlifyEvents.INPUT_MODE_CHANGED.invoker().onInputModeChanged(currentInputMode); + + return true; } public void hideMouse(boolean hide, boolean moveMouse) { diff --git a/src/main/java/dev/isxander/controlify/api/ControlifyApi.java b/src/main/java/dev/isxander/controlify/api/ControlifyApi.java index b79756b..ac599ba 100644 --- a/src/main/java/dev/isxander/controlify/api/ControlifyApi.java +++ b/src/main/java/dev/isxander/controlify/api/ControlifyApi.java @@ -30,7 +30,7 @@ public interface ControlifyApi { * Get the current input mode for the game. */ @NotNull InputMode currentInputMode(); - void setInputMode(@NotNull InputMode mode); + boolean setInputMode(@NotNull InputMode mode); static ControlifyApi get() { return Controlify.instance(); diff --git a/src/main/java/dev/isxander/controlify/bindings/ControllerBindings.java b/src/main/java/dev/isxander/controlify/bindings/ControllerBindings.java index 448000a..38fba8e 100644 --- a/src/main/java/dev/isxander/controlify/bindings/ControllerBindings.java +++ b/src/main/java/dev/isxander/controlify/bindings/ControllerBindings.java @@ -137,7 +137,6 @@ public class ControllerBindings { .identifier("controlify", "sneak") .defaultBind(GamepadBinds.RIGHT_STICK_PRESS) .category(MOVEMENT_CATEGORY) - .vanillaOverride(options.keyShift, () -> controller.config().toggleSneak) .build()); register(ATTACK = ControllerBindingBuilder.create(controller) .identifier("controlify", "attack") diff --git a/src/main/java/dev/isxander/controlify/config/gui/YACLHelper.java b/src/main/java/dev/isxander/controlify/config/gui/YACLHelper.java index 26199d9..be131cb 100644 --- a/src/main/java/dev/isxander/controlify/config/gui/YACLHelper.java +++ b/src/main/java/dev/isxander/controlify/config/gui/YACLHelper.java @@ -220,9 +220,7 @@ public class YACLHelper { category.group(makeVibrationGroup(globalVibrationOption, config, def)); } - if (controller instanceof GamepadController gamepad && gamepad.hasGyro()) { - category.group(makeGyroGroup(gamepad)); - } + category.group(makeGyroGroup(controller)); var advancedGroup = OptionGroup.createBuilder() .name(Component.translatable("controlify.gui.group.advanced")) @@ -309,19 +307,27 @@ public class YACLHelper { return vibrationGroup.build(); } - private static OptionGroup makeGyroGroup(GamepadController gamepad) { - var gpCfg = gamepad.config(); - var gpCfgDef = gamepad.defaultConfig(); + private static OptionGroup makeGyroGroup(Controller controller) { + GamepadController gamepad = (controller instanceof GamepadController) ? (GamepadController) controller : null; + boolean hasGyro = gamepad != null && gamepad.hasGyro(); + + var gpCfg = gamepad != null ? gamepad.config() : null; + var gpCfgDef = gamepad != null ? gamepad.defaultConfig() : null; + + Component noGyroTooltip = Component.translatable("controlify.gui.group.gyro.no_gyro.tooltip").withStyle(ChatFormatting.RED); Option gyroSensitivity; List> gyroOptions = new ArrayList<>(); var gyroGroup = OptionGroup.createBuilder() .name(Component.translatable("controlify.gui.group.gyro")) .tooltip(Component.translatable("controlify.gui.group.gyro.tooltip")) + .collapsed(!hasGyro) .option(gyroSensitivity = Option.createBuilder(float.class) .name(Component.translatable("controlify.gui.gyro_look_sensitivity")) .tooltip(Component.translatable("controlify.gui.gyro_look_sensitivity.tooltip")) - .binding(gpCfgDef.gyroLookSensitivity, () -> gpCfg.gyroLookSensitivity, v -> gpCfg.gyroLookSensitivity = v) + .tooltip(hasGyro ? Component.empty() : noGyroTooltip) + .available(hasGyro) + .binding(hasGyro ? gpCfgDef.gyroLookSensitivity : 0, () -> hasGyro ? gpCfg.gyroLookSensitivity : 0, v -> gpCfg.gyroLookSensitivity = v) .controller(opt -> new FloatSliderController(opt, 0f, 1f, 0.05f, percentOrOffFormatter)) .listener((opt, sensitivity) -> gyroOptions.forEach(o -> { o.setAvailable(sensitivity > 0); @@ -332,7 +338,9 @@ public class YACLHelper { var opt = Option.createBuilder(boolean.class) .name(Component.translatable("controlify.gui.gyro_requires_button")) .tooltip(Component.translatable("controlify.gui.gyro_requires_button.tooltip")) - .binding(gpCfgDef.gyroRequiresButton, () -> gpCfg.gyroRequiresButton, v -> gpCfg.gyroRequiresButton = v) + .tooltip(hasGyro ? Component.empty() : noGyroTooltip) + .available(hasGyro) + .binding(hasGyro ? gpCfgDef.gyroRequiresButton : false, () -> hasGyro ? gpCfg.gyroRequiresButton : false, v -> gpCfg.gyroRequiresButton = v) .controller(TickBoxController::new) .available(gyroSensitivity.pendingValue() > 0) .build(); @@ -343,7 +351,9 @@ public class YACLHelper { var opt = Option.createBuilder(boolean.class) .name(Component.translatable("controlify.gui.flick_stick")) .tooltip(Component.translatable("controlify.gui.flick_stick.tooltip")) - .binding(gpCfgDef.flickStick, () -> gpCfg.flickStick, v -> gpCfg.flickStick = v) + .tooltip(hasGyro ? Component.empty() : noGyroTooltip) + .available(hasGyro) + .binding(hasGyro ? gpCfgDef.flickStick : false, () -> hasGyro ? gpCfg.flickStick : false, v -> gpCfg.flickStick = v) .controller(TickBoxController::new) .available(gyroSensitivity.pendingValue() > 0) .build(); diff --git a/src/main/java/dev/isxander/controlify/controller/gamepad/BuiltinGamepadTheme.java b/src/main/java/dev/isxander/controlify/controller/gamepad/BuiltinGamepadTheme.java index 7b9c84c..14005e9 100644 --- a/src/main/java/dev/isxander/controlify/controller/gamepad/BuiltinGamepadTheme.java +++ b/src/main/java/dev/isxander/controlify/controller/gamepad/BuiltinGamepadTheme.java @@ -9,7 +9,8 @@ public enum BuiltinGamepadTheme implements NameableEnum { XBOX_ONE("Xbox One", "xbox_one"), DUALSHOCK4("Dualshock 4", "dualshock4"), DUALSHOCK3("Dualshock 3", "dualshock3"), - DUALSENSE("Dualsense", "dualsense"); + DUALSENSE("Dualsense", "dualsense"), + STEAM_DECK("Steam Deck", "steam_deck"); private final String name, id; diff --git a/src/main/java/dev/isxander/controlify/controller/gamepad/GamepadController.java b/src/main/java/dev/isxander/controlify/controller/gamepad/GamepadController.java index 47ebe85..e5a1d06 100644 --- a/src/main/java/dev/isxander/controlify/controller/gamepad/GamepadController.java +++ b/src/main/java/dev/isxander/controlify/controller/gamepad/GamepadController.java @@ -81,16 +81,6 @@ public class GamepadController extends AbstractController6@NdG0Q|Bu|#) zn!5_COs80IDhvnPkfCg2G6%v2TW4{;Oz?yFsfZ{digQEU^wZ`ieR3~hlg;4*PoB5m z^ZUR5U(01D`g;0%2!iNKr=%%7Kje?K-T43cNqsY()>)}-4ng#;_s1$?|G^Ceao1%n zUvLYVt%8D#u&kmY4A%_{qX}YUv~I~t6}n^*mNioZSI&M6NKF;NOf17>tZ`V;Qu8*P zp3ml$`KrRJVDxcvq%L3r1G+LLO_J3V7`w(|~M3+^Pu1e1T*klOxBG4M{%C zPzu8^B@D=bOt*N5_A+>vs?|Cq|Yc9QOy+rR<&h=VFk3N z)Akeg7+sewnhi6)O--Px1URc^>rLURLPH%I&~zP)Wdp2LK`wGC=oZw$^$h~BZ!?)d z#!YoGj6j6rCg-pjZHL?x?c^I4q^F>RYPJHCb6Cwm-x^C8x1sDJJCBgwiBztmGRZ~5 z4EgAcW~#_@HeL4sO0o+@fTI?nm?*_Y@~x;b>|;1~4AX*UkgAm$w}3`sH$ZXDsIn{H z7OW~l3E75>4b}{~3~9?O12S-TOCrEFhc!(V67fWo zD-OpgB^oPIrD8Nj@uhg2;$yN5IVKW?@mS}*gp`^e+0J|Qf4-lzHC$SAN;Z3dgs@n%LjXB`m!%AO}ksAu{G}XpC9o0ab9t-Ib?h$Q8CcG}dAmF8&b(=6 z*4@3+IE;#*j-VezDslEld3J@OQus4TE>cu3`+-Un64D3y+iO9;!AmVH-BPHc0>cYq_26C=zNgP)y zmDrM>#dekxB9REki<~Gj1i?5J(^boi>2x+2WaL0ww_F{Yw8y9p(iVDI5t2 z2xdY|Fcg4{77qBC;S3*Qv|vb7VF>angpKzyhD9&3jrZFBeE+1alhRTPcg*7zoR<<( zpYD)gRq7RyLeJJ$1)Z*Dfuuq&yJG-)VMQ9KAM1DQff{WohY0C^gu4cFaK@2;!a2AnhkZ`o`?WYcV7$RwT1CN1ih&g~~id%Kp9d(vI6 ze*MOw_UHNgUU=78a&XMIVcsg=@{7kFe0psB%k4hvQegM#*^bi07rU0fwd~OAo7R3m zdSPOkIeVm~`@~psauwK7Xa~th-#jpRl=&fgdfkNu7f0K6e6}ZLt&tD6%+;qlK-YNZ zF)qSRoZo*OXI^yfmmgkn_@}?FUVVGv$!)=fJMHMAp2?Zu*va3m%FZoc71wVKzkl}I z_rCk%@8olHeC_C!PtSe4>+<5g-&m)P&+@IA@k?N4&I4C|-LsT>EqLasyQx#ZwNOL( z4lqCa$-#lBlA6DIV(J`wZT*=|A5QJl`&04h#E;V}KS&3+KJ)YJBY&Ph%H;<)kG?ds RIpp>DL~pyWGfC7g@;Pe*? zdKVa9T>P89Q1F*zopr08Nua00000 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/controlify/textures/gui/gamepad/steam_deck/dpad_down.png b/src/main/resources/assets/controlify/textures/gui/gamepad/steam_deck/dpad_down.png new file mode 100644 index 0000000000000000000000000000000000000000..a37d6fa4f2b11ea0272a3f2bd55ee8ae410c15af GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H0wnYHF4+L2YCK&WLn>|^y}Xh4fC3MTgZ@DU zodZmod;jamvwobE%gW;=xUX6J0pmpd#SNM#G}Z~ap5Aes^S|hAHYL8Z0%so0>fG_w z#iruOE#t$ak(u6{1-oD!M|^y}Xh4fC3MTgZ@Lu zhz8c6s{fI8Odo@C9C^G1_cdo%G@qEhG(kl2sA`)(LlFP~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/controlify/textures/gui/gamepad/steam_deck/dpad_right.png b/src/main/resources/assets/controlify/textures/gui/gamepad/steam_deck/dpad_right.png new file mode 100644 index 0000000000000000000000000000000000000000..d3344df3c865392bb9e145197f72c5c047ed48cf GIT binary patch literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H0wnYHF4+L2sy$sCLn>|^z3j+$KtO~gV0wXo zcmbpLcl*;Oq4tKtzdXfFr61~+gmA>WwWuCitYIs9^Kp;tKW#bb0G+cE5v{WV=S0u@ zY5T&XEBiFp_qT$gQOa|4JlX;?uO2>e=&i8$jGb4-_so0zr>bvVv~O5T>Ln>~qy?l`OfC3Nm0iB7C z5e=-r&ivcFW07i5vLkcWNB(z=Y%cqFTHPlG%GkEe`q*}RN8zFJjroto|Kv0nnm$gL zc7f+{Rcqn%p0}rXzCZ2IIkHisi~Xpf&Y3icsXOEgo0Px*Qh6PD{QBn7yLS#~KVuUs ijI8{3nC)BrL(Y385&JH>uJQ!Bgu&C*&t;ucLK6TOK}>l7 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/controlify/textures/gui/gamepad/steam_deck/guide.png b/src/main/resources/assets/controlify/textures/gui/gamepad/steam_deck/guide.png new file mode 100644 index 0000000000000000000000000000000000000000..b1af9589c28c6bd41880f0d04138faee8a548ae9 GIT binary patch literal 1625 zcmbVMTWl0n7@oCaYN3q{qDD=b3~5uux$S)p9ck%Sb`xi5mQ7mBYIb(!?CzvH7iXsI zZe!CbXoLdBOHHgLNYNOh7Bn`gS_Q>GtPeFIF&bl9BkJn*F?kP$-TIpn z@3;GfM}VZOlql;dNEK8Ap)ssuOTiGO0chhXm{ByIxcJEl0#{_7=<^ATV06Q*5*{+) zj-hB=8XAx|nb`6W-cbOEK!vu57u1|)fdWsIcmY~F$25VLAoc)HbU6a?exVod)=h|W z6hlf3!{7mqVgsz?4x}H%-Hh8!GeMg5lWY($Zs7Icm5)H;OgRl=p@%EN(2ggvwrv2K z&gb(~-b3kThGsdAqZv2tc9RG}T1Cwk3#4Xks4|40C7Ft0E4qd|jABY3w0Q!lTDCzo zYP6bF@e}eGT@VeLr5MMi5>S?EIAhSvm4wR@4RcV1nr$I0Tf-Vz-PWzF{x8(E>uUrc z-wHxa#&va3)tU&)?%9RRs5s=hXe(YcARU92K4?m?XBSd)gJX>Wx=kqBx*6B?Ts2a? zRh4nKmtyetK1GxDytVPF2QVbskS9>oJS5{KSx=k|0G|(df}2q67^VyrbXiFk{|Q9_ z4gjzJ8Ys#cS+vC)f@KM$byF3Q!HOzoAZ=(F05Zct57}QYbGEs}# zoBswiI9GEd)D;gNxG>Hi9L4W==J0FeEEa$KF9Nn__L))Cot z!c45Y`^=qn+u75{)%*6dEiId=pJ(e=jSeq<&TTvE?VM=C7TylOF?0E1Y(AA}O4#qr zJR6%IS-7-jW9xo)Py6Ec@x)^*zl=0L8Kqp)(__Tc(z(gqRyMmV`Ks>V xPsf(QbKI!w_qRTs0-etb?XUhhvU{%S$}JtaqvyxRFI{k&f21cGn%}vy}Xh4fC7(8p#DS0 zhz3@ToAuNDC&natvj{DHxUN|}<>a9^FD%aUZaM3s#%+5ZRoBI!P|auiR-4WPp|7|tkNz&*nCfJEzl|kPgg&ebxsLQ0KX_V Am;e9( literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/controlify/textures/gui/gamepad/steam_deck/left_stick_down.png b/src/main/resources/assets/controlify/textures/gui/gamepad/steam_deck/left_stick_down.png new file mode 100644 index 0000000000000000000000000000000000000000..01e5fd8d0f1c8324978970a2b09adb4d5760fc30 GIT binary patch literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H0wnYHF4+L2rg^$JhE&|zJMlCxgCd7Z<{`Nq zw;FtN{+I8X!MkR%#zfmwDsAVRHM(Mq4zKDGn%Kt1%xh4wjKP|XtuVsH*4)DCgUiGn zhFvxvJFAM0zBKfXk($!FrZcN8_Q8=4lDQw+U$Zr*hkO!#$lEa~?_Oc;JeMhUjTb8~ zzqUDd-QME<&Zdh$&)+%r=OB|@~aoqUn^fC7h0>>=47 zrHs>G{M#JET;ZwuVEM}FCL(f2=55`&e{G)+tA)X0gQVs~!u~ANP5f&X&Z-HzviV4K z`v!rn0i7GT=42S&H@i`IGvPz#)E}J}*djc)X>9eMykNK3<0oIr<({AB?5kdvz*BIM t*Zv^Wx&Gf;Z=Su)SbyQo{C(xKNklxY z)d3F72v+v_=m(rmT$?6dTt%LIQ%{nwLNiM)3gbqPO|4@Ouwu-)Dmb|n3_fG0zasnq zV#~_xYx_J2u-6*b&{L;tW!AS}xZnANF~GrY1xg;97Ktj0XS1+Fn}V;0ZTyrTY2=M((7J;W42ZDDf7nE(I)07*qo IM6N<$g0~ay|j^+L6L{~fX+dM zGapmG%|FT!rzdxmMX_u9?dC&WH{*lXJh-h|yNpXN@Std@gaSh|NBOHGH5-1F3ztWI z|KOdU9F(LtA+ciHCr!DUb=orFYbFMk9=&NA@5|hOQs?THzhbk1mN9s``njxgN@xNA DNa8s~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/controlify/textures/gui/gamepad/steam_deck/right_bumper.png b/src/main/resources/assets/controlify/textures/gui/gamepad/steam_deck/right_bumper.png new file mode 100644 index 0000000000000000000000000000000000000000..b67e8e231aa11bf11dd8a5d197c3ba9033980c85 GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H0wnYHF4+L2qC8z3Ln>}1CrC_k_+nqzvFOUX z{dep0V?OLR-&Ew(6*xs%yN#j5%*S$9l8lOv<;E_>Q=P?ZVMkSF`m9TeIk(}rybs4e u{x(fB6|N>xX`$6W>=(AQ*gEnmGB8|st^T?FL-}u@EexKnelF{r5}E*Nd^3yy literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/controlify/textures/gui/gamepad/steam_deck/right_stick_down.png b/src/main/resources/assets/controlify/textures/gui/gamepad/steam_deck/right_stick_down.png new file mode 100644 index 0000000000000000000000000000000000000000..f5bb16fa32fbe17046b15f11fe280753f4e0caad GIT binary patch literal 206 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H0wnYHF4+L2rh2+KhE&|zd+{JAt09ML;Oq_T z+b=ix`uzW0QutrVZU)D{RFO9KBB7?_vXx@@=S`VudCrNI`?%x-=Sh!rCOvt{erC=S z)z#BAB40mpo&5cQSCpu^`j(5kGfL*9>2d0;ksOZ$sx|sC-YGyunZ~Ml!@}T)E_-byiyUMR->DPRCV^ty0fefCmelF{r G5}E)~7FIR@ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/controlify/textures/gui/gamepad/steam_deck/right_stick_left.png b/src/main/resources/assets/controlify/textures/gui/gamepad/steam_deck/right_stick_left.png new file mode 100644 index 0000000000000000000000000000000000000000..ca427c6daa606ea790908f9deaea577a9c355a6b GIT binary patch literal 213 zcmV;`04o29P)zPx+9$)dS%vaMP>G#d9=^yUze8Nl-rBQ$IfTQ=~ay?l`KfB^^V1)Ya{ zahn~cz4*8JPtq4>fwzVs`bqPa&M51tZ{=~E$~z~*((rS`#a8vh9Yno@Pb!cu rZ023J{}_ejeCB>_tpK()6onw6$Mj;Urpz=K`?6RRJdiVid-8 zHS+7G!+^wJ8^-t}rGErx9PUz>@QC%;D{{S9JfU`w4y=H?+Y!BRaR2}S literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/controlify/textures/gui/gamepad/steam_deck/right_trigger.png b/src/main/resources/assets/controlify/textures/gui/gamepad/steam_deck/right_trigger.png new file mode 100644 index 0000000000000000000000000000000000000000..5eae280997ad3516412c71ab1b1f62a6c81f7fe4 GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H0wnYHF4+L25~ay=2J6puofIVE@qh z7oYq8|6;CN6chv7`OKR6+#NE#>V5Mj2-QUhe&7Jk_n{=PRIH44$rjF6*2UngC4Q BIZ6Nk literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/controlify/textures/gui/gamepad/steam_deck/start.png b/src/main/resources/assets/controlify/textures/gui/gamepad/steam_deck/start.png new file mode 100644 index 0000000000000000000000000000000000000000..a290010f47604dac556940ad67a306e01e144454 GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H3?x5i&EW)65&=FTu0Z<#|Np_k!QS59US3{y zc6Nq_hN7aPycK~@fO3o_L4Lsu4$p3+0XdK>lEcWWQ%w&!h|D1o>Zqj42}6B#m}$=E4p kHig|ZHom@I<&TEGqXkoN(6@_nKnoZ=UHx3vIVCg!0RBZj2><{9 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/controlify/textures/gui/gamepad/steam_deck/touchpad.png b/src/main/resources/assets/controlify/textures/gui/gamepad/steam_deck/touchpad.png new file mode 100644 index 0000000000000000000000000000000000000000..87bed40ab8e7b41ffb2906184a947bf92244ac30 GIT binary patch literal 2486 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 aj_baYEAEw{KZGZ}h98ghN8fvT^w8hN+Z1R3 literal 0 HcmV?d00001