From f92618a6107f96b5812033eac9c3145ab89f8df5 Mon Sep 17 00:00:00 2001 From: ahwelp Date: Thu, 25 Jan 2024 16:59:40 -0300 Subject: [PATCH 1/4] Adding Flash suport with Ruffle --- functions/EmuScripts/emuDeckRuffle.sh | 36 ++++++++++++++++++++++++++ functions/all.sh | 1 + functions/helperFunctions.sh | 2 ++ icons/ruffle.png | Bin 0 -> 41789 bytes settings.sh | 2 ++ setup.sh | 10 +++++-- tools/binupdate/binupdate.sh | 13 ++++++++++ tools/launchers/ruffle.sh | 12 +++++++++ uninstall.sh | 22 +++++++++++----- 9 files changed, 89 insertions(+), 9 deletions(-) create mode 100644 functions/EmuScripts/emuDeckRuffle.sh create mode 100644 icons/ruffle.png create mode 100644 tools/launchers/ruffle.sh mode change 100755 => 100644 uninstall.sh diff --git a/functions/EmuScripts/emuDeckRuffle.sh b/functions/EmuScripts/emuDeckRuffle.sh new file mode 100644 index 000000000..3d2dc599f --- /dev/null +++ b/functions/EmuScripts/emuDeckRuffle.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +#variables +Ruffle_emuName="Ruffle" +Ruffle_emuType="Binary" +Ruffle_emuPath="$HOME/Applications/ruffle" +Ruffle_file_name="ruffle-nightly-$(date +'%Y-%m-%d')-linux-x86_64.tar.gz" + +#Install +Ruffle_install(){ + echo "Begin Ruffle Install" + local showProgress="$1" + + if installEmuBI "Ruffle" "https://github.com/ruffle-rs/ruffle/releases/download/nightly-$(date +'%Y-%m-%d')/$Ruffle_file_name" "Ruffle" "tar.gz" "$showProgress"; then + mkdir "$HOME/$Ruffle_emuPath" + tar -zxvf "$HOME/Applications/$Ruffle_file_name" -C "$HOME/Applications/ruffle" ruffle && rm -rf "$HOME/Applications/$Ruffle_file_name" + chmod +x "$Ruffle_emuPath/ruffle" + + else + return 1 + fi +} + +#Uninstall +Ruffle_uninstall(){ + echo "Begin Ruffle uninstall" + rm -rf "$HOME/Applications/ruffle" #Full path. Let's avoid a empty location while rm -rf +} + +Ruffle_IsInstalled(){ + if [ -e "$Ruffle_emuPath/ruffle" ]; then + echo "true" + else + echo "false" + fi +} \ No newline at end of file diff --git a/functions/all.sh b/functions/all.sh index 87b67398a..99314d668 100644 --- a/functions/all.sh +++ b/functions/all.sh @@ -86,6 +86,7 @@ source "$EMUDECKGIT"/functions/EmuScripts/emuDeckRMG.sh source "$EMUDECKGIT"/functions/EmuScripts/emuDeckMelonDS.sh source "$EMUDECKGIT"/functions/EmuScripts/emuDeckares.sh source "$EMUDECKGIT"/functions/EmuScripts/emuDeckFlycast.sh +source "$EMUDECKGIT"/functions/EmuScripts/emuDeckRuffle.sh #remoteplayclientscripts source "$EMUDECKGIT"/functions/RemotePlayClientScripts/remotePlayChiaki.sh diff --git a/functions/helperFunctions.sh b/functions/helperFunctions.sh index d109c375f..174e6a21b 100644 --- a/functions/helperFunctions.sh +++ b/functions/helperFunctions.sh @@ -296,6 +296,7 @@ function createUpdateSettingsFile(){ #defaultSettingsList+=("doSetupMelon=true") defaultSettingsList+=("doSetupMGBA=true") defaultSettingsList+=("doSetupFlycast=true") + defaultSettingsList+=("doSetupRuffle=true") defaultSettingsList+=("doInstallSRM=true") defaultSettingsList+=("doInstallESDE=true") defaultSettingsList+=("doInstallPegasus=false") @@ -319,6 +320,7 @@ function createUpdateSettingsFile(){ #defaultSettingsList+=("doInstallMelon=false") defaultSettingsList+=("doInstallMGBA=false") defaultSettingsList+=("doInstallFlycast=true") + defaultSettingsList+=("doInstallRuffle=false") defaultSettingsList+=("doInstallCHD=true") defaultSettingsList+=("doInstallPowertools=false") defaultSettingsList+=("doInstallGyro=false") diff --git a/icons/ruffle.png b/icons/ruffle.png new file mode 100644 index 0000000000000000000000000000000000000000..c9e954333da1d0504d88e37762ca841b7f2ef6f2 GIT binary patch literal 41789 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�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 KNVRL|jsF6d-&=YB literal 0 HcmV?d00001 diff --git a/settings.sh b/settings.sh index 7698f549a..f9264eea6 100644 --- a/settings.sh +++ b/settings.sh @@ -26,6 +26,7 @@ doSetupPCSX2QT=true #doSetupMelon=true doSetupMGBA=true doSetupFlycast=true +doSetupRuffle=true #Install all systems by default doInstallSRM=true @@ -50,6 +51,7 @@ doInstallMAME=true #doInstallMelon=false doInstallMGBA=false doInstallFlycast=true +doInstallRuffle=false doInstallCHD=false doInstallPowertools=false doInstallGyro=false diff --git a/setup.sh b/setup.sh index c66f3fc8d..570298ade 100644 --- a/setup.sh +++ b/setup.sh @@ -258,7 +258,10 @@ if [ "$doInstallXenia" == "true" ]; then echo "Xenia_install" Xenia_install fi - +if [ $doInstallRuffle == "true" ]; then + echo "Ruffle_install" + Ruffle_install +fi #Steam RomManager Config if [ "$doSetupSRM" == "true" ]; then @@ -373,7 +376,10 @@ if [ "$doSetupXenia" == "true" ]; then echo "Xenia_init" Xenia_init fi - +if [ "$doSetupRuffle" == "true" ]; then + echo "Ruffle_init" + Ruffle_init +fi #Fixes repeated Symlink for older installations diff --git a/tools/binupdate/binupdate.sh b/tools/binupdate/binupdate.sh index 84f9b0c49..a6d2053a5 100644 --- a/tools/binupdate/binupdate.sh +++ b/tools/binupdate/binupdate.sh @@ -198,6 +198,16 @@ function runBinDownloads { messages+=("There was a problem updating RPCS3") fi fi + if [[ "$binsToDL" == *"ruffle"* ]]; then + ((progresspct += pct)) || true + echo "$progresspct" + echo "# Updating Ruffle" + if Ruffle_install "true" 2>&1; then + messages+=("Ruffle Updated Successfully") + else + messages+=("There was a problem updating Ruffle") + fi + fi echo "100" echo "# Complete!" } @@ -248,6 +258,9 @@ fi if [ "$(RPCS3_IsInstalled ""$emuDeckEmuTypeAppImage"")" == "true" ]; then binTable+=(TRUE "PlayStation 3 Emu" "rpcs3") fi +if [ "$(Ruffle_IsInstalled)" == "true" ]; then + binTable+=(TRUE "Flash Emu" "ruffle") +fi if [ "${#binTable[@]}" -gt 0 ]; then #Binary selector diff --git a/tools/launchers/ruffle.sh b/tools/launchers/ruffle.sh new file mode 100644 index 000000000..10982ac0f --- /dev/null +++ b/tools/launchers/ruffle.sh @@ -0,0 +1,12 @@ +#!/bin/sh +source $HOME/.config/EmuDeck/backend/functions/all.sh +rclone_downloadEmu ruffle + +emuName="ruffle" #parameterize me +emufolder="$HOME/Applications" # has to be applications for ES-DE to find it + +#find full path to emu executable +exe=$(find $emufolder -iname "${emuName}" | sort -n | cut -d' ' -f 2- | tail -n 1 2>/dev/null) + +eval "${exe} $1" +rclone_uploadEmu ruffle \ No newline at end of file diff --git a/uninstall.sh b/uninstall.sh old mode 100755 new mode 100644 index e8d490d58..612950928 --- a/uninstall.sh +++ b/uninstall.sh @@ -26,6 +26,7 @@ doUninstallVita3K=true doUninstallXemu=true doUninstallXenia=true doUninstallYuzu=true +doUninstallRuffle=true @@ -101,12 +102,13 @@ if [ "$doUninstall" == true ]; then 14 "RetroArch"\ 15 "RMG" \ 16 "RPCS3" \ - 17 "Ryujinx" \ - 18 "ScummVM" \ - 19 "Vita3K" \ - 20 "Xemu" \ - 21 "Xenia" \ - 22 "Yuzu" ) + 17 "Ruffle" \ + 18 "Ryujinx" \ + 19 "ScummVM" \ + 20 "Vita3K" \ + 21 "Xemu" \ + 22 "Xenia" \ + 23 "Yuzu" ) ans=$? if [ $ans -eq 0 ]; then @@ -153,6 +155,9 @@ if [ "$doUninstall" == true ]; then if [[ "$emusToUninstall" == *"RetroArch"* ]]; then doUninstallRA=false fi + if [[ "$emusToUninstall" == *"Ruffle"* ]]; then + doUninstallRuffle=false + fi if [[ "$emusToUninstall" == *"RPCS3"* ]]; then doUninstallRPCS3=false fi @@ -264,6 +269,9 @@ if [ "$doUninstall" == true ]; then rm -rf "$HOME/.cache/rpcs3" &>> /dev/null rm -rf $HOME/.local/share/applications/RPCS3.desktop &>> /dev/null fi + if [[ "$doUninstallRuffle" == true ]]; then + rm -rf $HOME/Applications/ruffle &>> /dev/null + fi if [[ "$doUninstallRyujinx" == true ]]; then rm -rf $HOME/.config/Ryujinx &>> /dev/null rm -rf $HOME/Applications/publish &>> /dev/null @@ -399,4 +407,4 @@ if [ "$doUninstall" == true ]; then exit -fi +fi \ No newline at end of file From 24761ab213943e4b33c4c986ba000b3e2891c400 Mon Sep 17 00:00:00 2001 From: ahwelp Date: Tue, 30 Jan 2024 16:58:30 -0300 Subject: [PATCH 2/4] Adding Input Controller profile for Flash/Ruffle --- .../steam-input/ruffle_controller_config.vdf | 817 ++++++++++++++++++ 1 file changed, 817 insertions(+) create mode 100755 configs/steam-input/ruffle_controller_config.vdf diff --git a/configs/steam-input/ruffle_controller_config.vdf b/configs/steam-input/ruffle_controller_config.vdf new file mode 100755 index 000000000..f3feaf235 --- /dev/null +++ b/configs/steam-input/ruffle_controller_config.vdf @@ -0,0 +1,817 @@ +"controller_mappings" +{ + "version" "3" + "title" "EmuDeck - Flash" + "description" "Press START + SELECT to Exit Emulator." + "export_type" "template" + "controller_type" "controller_xboxone" + "actions" + { + "Default" + { + "title" "Default" + "legacy_set" "1" + } + } + "action_layers" + { + } + "localization" + { + "english" + { + "title" "Web Browser" + "description" "Layout for Web Browsing" + } + "portuguese" + { + "title" "Browser da Web" + "description" "" + } + } + "group" + { + "id" "0" + "mode" "four_buttons" + "name" "" + "description" "" + "inputs" + { + "button_a" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press RETURN, ⏯️, , " + "binding" "key_press SPACE, , " + } + } + } + "disabled_activators" + { + } + } + "button_b" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press RETURN, , " + } + } + } + "disabled_activators" + { + } + } + "button_x" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press SPACE, , " + } + } + } + "disabled_activators" + { + } + } + "button_y" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press ESCAPE, , " + } + } + } + "disabled_activators" + { + } + } + } + } + "group" + { + "id" "1" + "mode" "dpad" + "name" "" + "description" "" + "inputs" + { + "dpad_north" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press UP_ARROW, , " + "binding" "key_press W, , " + } + } + } + "disabled_activators" + { + } + } + "dpad_south" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press DOWN_ARROW, , " + } + } + "Full_Press" + { + "bindings" + { + "binding" "key_press S, , " + } + } + } + "disabled_activators" + { + } + } + "dpad_east" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press RIGHT_ARROW, , " + } + } + "Full_Press" + { + "bindings" + { + "binding" "key_press D, , " + } + } + } + "disabled_activators" + { + } + } + "dpad_west" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_ARROW, , " + } + } + "Full_Press" + { + "bindings" + { + "binding" "key_press A, , " + } + } + } + "disabled_activators" + { + } + } + } + "settings" + { + "requires_click" "0" + "layout" "0" + } + } + "group" + { + "id" "2" + "mode" "dpad" + "name" "" + "description" "" + "inputs" + { + "dpad_north" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press UP_ARROW, , " + } + "settings" + { + "haptic_intensity" "1" + } + } + } + "disabled_activators" + { + } + } + "dpad_south" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press DOWN_ARROW, , " + } + "settings" + { + "haptic_intensity" "1" + } + } + } + "disabled_activators" + { + } + } + "dpad_east" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press RIGHT_ARROW, ⏩, , " + } + "settings" + { + "haptic_intensity" "1" + } + } + } + "disabled_activators" + { + } + } + "dpad_west" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_ARROW, ⏪, , " + } + "settings" + { + "haptic_intensity" "1" + } + } + } + "disabled_activators" + { + } + } + } + } + "group" + { + "id" "3" + "mode" "absolute_mouse" + "name" "" + "description" "" + "inputs" + { + "click" + { + "activators" + { + "Soft_Press" + { + "bindings" + { + "binding" "mouse_button LEFT, , " + } + "settings" + { + "haptic_intensity" "1" + } + } + } + "disabled_activators" + { + } + } + } + } + "group" + { + "id" "4" + "mode" "trigger" + "name" "" + "description" "" + "inputs" + { + "click" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "mouse_button RIGHT, , " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + } + } + "group" + { + "id" "5" + "mode" "trigger" + "name" "" + "description" "" + "inputs" + { + "click" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "mouse_button LEFT, , " + } + "settings" + { + "haptic_intensity" "2" + } + } + } + "disabled_activators" + { + } + } + } + } + "group" + { + "id" "7" + "mode" "scrollwheel" + "name" "" + "description" "" + "inputs" + { + "scroll_clockwise" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "mouse_wheel SCROLL_UP, ⏫, , " + } + "settings" + { + "interruptable" "0" + } + } + "Full_Press" + { + "bindings" + { + "binding" "mouse_wheel SCROLL_UP, , " + } + "settings" + { + "delay_start" "24" + "interruptable" "0" + } + } + } + "disabled_activators" + { + } + } + "scroll_counterclockwise" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "mouse_wheel SCROLL_DOWN, ⏬, , " + } + "settings" + { + "interruptable" "0" + } + } + "Full_Press" + { + "bindings" + { + "binding" "mouse_wheel SCROLL_DOWN, , " + } + "settings" + { + "delay_start" "24" + "interruptable" "0" + } + } + } + "disabled_activators" + { + } + } + } + "settings" + { + "scroll_angle" "137" + "haptic_intensity" "1" + "scroll_type" "2" + "scroll_invert" "1" + "scroll_friction" "1" + } + } + "group" + { + "id" "8" + "mode" "absolute_mouse" + "name" "" + "description" "" + "inputs" + { + } + "settings" + { + "gyro_natural_sensitivity" "113" + } + } + "group" + { + "id" "9" + "mode" "dpad" + "name" "" + "description" "" + "inputs" + { + "dpad_north" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press UP_ARROW, ⏫, , " + } + } + "Full_Press" + { + "bindings" + { + "binding" "key_press W, , " + } + } + } + "disabled_activators" + { + } + } + "dpad_south" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press DOWN_ARROW, ⏬, , " + } + } + "Full_Press" + { + "bindings" + { + "binding" "key_press S, , " + } + } + } + "disabled_activators" + { + } + } + "dpad_east" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press RIGHT_ARROW, ⏩, , " + } + } + "Full_Press" + { + "bindings" + { + "binding" "key_press D, , " + } + } + } + "disabled_activators" + { + } + } + "dpad_west" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_ARROW, ⏪, , " + } + } + "Full_Press" + { + "bindings" + { + "binding" "key_press A, , " + } + } + } + "disabled_activators" + { + } + } + } + "settings" + { + "requires_click" "0" + "layout" "0" + "haptic_intensity_override" "0" + } + } + "group" + { + "id" "10" + "mode" "joystick_move" + "name" "" + "description" "" + "inputs" + { + "click" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "mouse_button LEFT, , " + } + "settings" + { + "haptic_intensity" "1" + } + } + } + "disabled_activators" + { + } + } + } + } + "group" + { + "id" "11" + "mode" "joystick_mouse" + "name" "" + "description" "" + "inputs" + { + "click" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "mouse_button LEFT, , " + } + } + } + "disabled_activators" + { + } + } + } + "settings" + { + "curve_exponent" "4" + "output_joystick" "2" + "sensitivity" "200" + } + } + "group" + { + "id" "12" + "mode" "dpad" + "name" "" + "description" "" + "inputs" + { + } + "settings" + { + "requires_click" "0" + } + } + "group" + { + "id" "6" + "mode" "switches" + "name" "" + "description" "" + "inputs" + { + "button_escape" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_CONTROL, , " + "binding" "key_press P, , " + } + } + } + "disabled_activators" + { + } + } + "button_menu" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "controller_action SHOW_KEYBOARD, , " + } + } + } + "disabled_activators" + { + } + } + "left_bumper" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press Q, ◀️, , " + } + } + } + "disabled_activators" + { + } + } + "right_bumper" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press E, ▶️, , " + } + } + } + "disabled_activators" + { + } + } + "button_back_right" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "key_press LEFT_CONTROL, , " + } + } + } + "disabled_activators" + { + } + } + "button_capture" + { + "activators" + { + "release" + { + "bindings" + { + "binding" "controller_action system_key_1, , " + } + } + } + "disabled_activators" + { + } + } + "always_on_action" + { + "activators" + { + "Full_Press" + { + "bindings" + { + "binding" "controller_action ts_n, , " + } + } + } + "disabled_activators" + { + } + } + } + } + "preset" + { + "id" "0" + "name" "Default" + "group_source_bindings" + { + "6" "switch active" + "0" "button_diamond active" + "1" "joystick active" + "12" "joystick active modeshift" + "2" "left_trackpad inactive" + "7" "left_trackpad active" + "3" "right_trackpad active" + "4" "left_trigger active" + "5" "right_trigger active" + "8" "gyro inactive" + "9" "dpad active" + "10" "right_joystick inactive" + "11" "right_joystick active" + } + } + "settings" + { + "left_trackpad_mode" "0" + "right_trackpad_mode" "0" + } +} From bff999d50d043dabe62b5dda95b1bed848c04a22 Mon Sep 17 00:00:00 2001 From: ahwelp Date: Tue, 30 Jan 2024 17:00:13 -0300 Subject: [PATCH 3/4] Adding Input Controller profile for Flash/Ruffle --- functions/EmuScripts/emuDeckRuffle.sh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/functions/EmuScripts/emuDeckRuffle.sh b/functions/EmuScripts/emuDeckRuffle.sh index 3d2dc599f..9c32694f3 100644 --- a/functions/EmuScripts/emuDeckRuffle.sh +++ b/functions/EmuScripts/emuDeckRuffle.sh @@ -15,12 +15,16 @@ Ruffle_install(){ mkdir "$HOME/$Ruffle_emuPath" tar -zxvf "$HOME/Applications/$Ruffle_file_name" -C "$HOME/Applications/ruffle" ruffle && rm -rf "$HOME/Applications/$Ruffle_file_name" chmod +x "$Ruffle_emuPath/ruffle" - + Ruffle_addSteamInputProfile else return 1 fi } +Ruffle_addSteamInputProfile(){ + rsync -r "$EMUDECKGIT/configs/steam-input/ruffle_controller_config.vdf" "$HOME/.steam/steam/controller_base/templates/" +} + #Uninstall Ruffle_uninstall(){ echo "Begin Ruffle uninstall" From 25695751b96dc0b2a6f3c7833562e49182ae5cde Mon Sep 17 00:00:00 2001 From: ahwelp Date: Tue, 30 Jan 2024 17:02:44 -0300 Subject: [PATCH 4/4] Adding Input Controller profile for Flash/Ruffle --- configs/steam-input/ruffle_controller_config.vdf | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/configs/steam-input/ruffle_controller_config.vdf b/configs/steam-input/ruffle_controller_config.vdf index f3feaf235..ac33876eb 100755 --- a/configs/steam-input/ruffle_controller_config.vdf +++ b/configs/steam-input/ruffle_controller_config.vdf @@ -20,13 +20,13 @@ { "english" { - "title" "Web Browser" - "description" "Layout for Web Browsing" + "title" "EmuDeck - Flash" + "description" "Layout for Flash" } "portuguese" { - "title" "Browser da Web" - "description" "" + "title" "EmuDeck - Flash" + "description" "Layout para Flash" } } "group"