Merge branch 'cooker-0.8.0b' into feat/godot-configurator
13
.github/FUNDING.yml
vendored
Normal file
|
@ -0,0 +1,13 @@
|
|||
# These are supported funding model platforms
|
||||
|
||||
#github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
|
||||
patreon: RetroDECK # Replace with a single Patreon username
|
||||
#open_collective: # Replace with a single Open Collective username
|
||||
#ko_fi: # Replace with a single Ko-fi username
|
||||
#tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
|
||||
#community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
|
||||
#liberapay: # Replace with a single Liberapay username
|
||||
#issuehunt: # Replace with a single IssueHunt username
|
||||
#otechie: # Replace with a single Otechie username
|
||||
#lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
|
||||
custom: ['https://retrodeck.readthedocs.io/en/latest/wiki_about/donations-licenses/'] # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
|
152
.github/workflows/cooker-selfhosted-persistent.yml
vendored
Normal file
|
@ -0,0 +1,152 @@
|
|||
name: "Build cooker (persistent)"
|
||||
|
||||
env:
|
||||
PERSISTENCE: true
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- cooker*
|
||||
- feat*
|
||||
paths:
|
||||
- '.github/workflows/**'
|
||||
- 'automation_tools/**'
|
||||
- 'emu-configs/**'
|
||||
- 'es-configs/**'
|
||||
- 'functions/**'
|
||||
- 'rd-submodules/**'
|
||||
- '*.sh'
|
||||
- 'net.retrodeck.retrodeck.yml'
|
||||
- 'net.retrodeck.retrodeck.appdata.xml'
|
||||
pull_request:
|
||||
branches:
|
||||
- cooker*
|
||||
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
|
||||
Building_RetroDECK:
|
||||
runs-on: self-hosted
|
||||
steps:
|
||||
|
||||
# Circumventing this bug: https://github.com/flatpak/flatpak-builder/issues/317
|
||||
- name: Remove stuck mounts
|
||||
run: sudo umount -f /home/ubuntu/actions-runner/_work/RetroDECK/RetroDECK/.flatpak-builder/rofiles/*
|
||||
continue-on-error: true
|
||||
|
||||
- name: Clone RetroDECK repo
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: 'true'
|
||||
|
||||
- name: "Install dependencies"
|
||||
run: "automation_tools/install_dependencies.sh"
|
||||
|
||||
- name: Generate cooker build ID
|
||||
run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/cooker_build_id.sh"
|
||||
|
||||
# backing up manifest in case download fails and hashes must be recalculated
|
||||
- name: Manifest backup
|
||||
run: "cp ${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml ${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml.bak"
|
||||
|
||||
- name: Run pre-build automation tasks
|
||||
run : "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/pre_build_automation.sh"
|
||||
|
||||
- name: "Adding flatpak portal for automated updates (cooker only)"
|
||||
run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/cooker_flatpak_portal_add.sh"
|
||||
|
||||
- name: "Updating release notes in appdata"
|
||||
run: "automation_tools/appdata_management.sh"
|
||||
|
||||
- name: "[DEBUG] Outputting manifest"
|
||||
run: cat net.retrodeck.retrodeck.yml
|
||||
|
||||
- name: "Build flatpak: download only"
|
||||
id: "flatpak-download"
|
||||
run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/flatpak_build_download_only_persistent.sh"
|
||||
continue-on-error: true
|
||||
|
||||
# Sometimes flatpak download fails, in this case it tries a second time
|
||||
- name: "Build flatpak: download only (retry)"
|
||||
if: steps.flatpak-download.outcome == 'failure'
|
||||
run: |
|
||||
echo "Download failed, maybe some hash changed since the build start."
|
||||
echo "Recalculating hashes and retrying download..."
|
||||
rm -f "{GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml"
|
||||
cp "${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml.bak" "${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml"
|
||||
"${GITHUB_WORKSPACE}/automation_tools/pre_build_automation.sh"
|
||||
"${GITHUB_WORKSPACE}/automation_tools/flatpak_build_download_only_persistent.sh"
|
||||
|
||||
- name: Build flatpak
|
||||
run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/flatpak_build_only_persistent.sh"
|
||||
|
||||
- name: Create Artifact for flathub
|
||||
run: |
|
||||
tar -czf ${GITHUB_WORKSPACE}/RetroDECK-Artifact-cooker.tar.gz -C ${GITHUB_WORKSPACE}/retrodeck-flatpak-cooker .
|
||||
hash=($(sha256sum ${GITHUB_WORKSPACE}/RetroDECK-Artifact-cooker.tar.gz))
|
||||
echo $hash > ${GITHUB_WORKSPACE}/RetroDECK-Artifact-cooker.sha
|
||||
mv -f RetroDECK-Artifact-cooker.* ${{ secrets.ARTIFACT_REPO }}
|
||||
continue-on-error: true
|
||||
|
||||
- name: Create Bundle
|
||||
run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/flatpak_build_bundle_persistent.sh"
|
||||
|
||||
- name: Set environment variable with current branch name
|
||||
run: echo "GITHUB_REF_SLUG=$(git rev-parse --abbrev-ref HEAD)" >> $GITHUB_ENV
|
||||
|
||||
- name: Get commits since last release
|
||||
run: |
|
||||
# Get the latest release tag
|
||||
LATEST_TAG=$(git describe --tags --abbrev=0)
|
||||
# Get all commits since the latest release tag
|
||||
COMMITS=$(git log $LATEST_TAG..HEAD --pretty=format:"- %s")
|
||||
# Set the output variable
|
||||
echo "::set-output name=commits::$COMMITS"
|
||||
id: commits
|
||||
continue-on-error: true
|
||||
|
||||
- name: Get branch name
|
||||
id: branch_name
|
||||
run: echo "BRANCH_NAME=$(echo $GITHUB_REF | sed 's|refs/heads/||')" >> $GITHUB_ENV
|
||||
|
||||
# if it's a feature branch it will not marked as "latest" cooker version
|
||||
- name: "Set makeLatest (cooker only)"
|
||||
run: |
|
||||
if [[ "$BRANCH_NAME" == 'feat/'* ]]; then
|
||||
echo "MAKE_LATEST=false" >> $GITHUB_ENV
|
||||
else
|
||||
echo "MAKE_LATEST=true" >> $GITHUB_ENV
|
||||
fi
|
||||
|
||||
- name: Publish the flatpak in a new cooker release
|
||||
uses: ncipollo/release-action@v1
|
||||
with:
|
||||
tag: "${{env.BRANCH_NAME}}-${{ env.buildid }}"
|
||||
body: |
|
||||
# Release Notes (Cooker)
|
||||
This is a cooker snapshot based on the commit: ${{ github.event.repository.full_name }}@${{github.sha}}.
|
||||
On branch [${{env.BRANCH_NAME}}](https://github.com/XargonWan/RetroDECK/tree/${{env.BRANCH_NAME}}).
|
||||
|
||||
## Commits since last release
|
||||
${{ steps.commits.outputs.commits }}
|
||||
|
||||
For the full release note for this build please refer to the channel [#BETA-TESTING](https://discord.gg/qQcrFvaA2C) on our Discord server.
|
||||
|
||||
Cooker channel is provided for the community to test fixes and explore new functionality.
|
||||
Please DO NOT open issues or ask support on this build.
|
||||
|
||||
artifacts: "RetroDECK-cooker.flatpak,RetroDECK-Artifact.tar.gz"
|
||||
allowUpdates: true
|
||||
makeLatest: ${{env.MAKE_LATEST}} # if it's a feat branch is not considered the latest build
|
||||
token: ${{ secrets.TRIGGER_BUILD_TOKEN }}
|
||||
repo: RetroDECK-cooker
|
||||
continue-on-error: true
|
||||
|
||||
# In case it cannot publish the release at least it's providing the flatpak file for creating a manual release
|
||||
- name: Upload RetroDECK-cooker.flatpak
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: retrodeck-flatpak
|
||||
path: RetroDECK-cooker.flatpak
|
||||
continue-on-error: true
|
54
.github/workflows/cooker-selfhosted.yml
vendored
|
@ -1,23 +1,28 @@
|
|||
name: "Build cooker"
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- cooker*
|
||||
- feat*
|
||||
paths:
|
||||
- '.github/workflows/**'
|
||||
- 'automation_tools/**'
|
||||
- 'emu-configs/**'
|
||||
- 'es-configs/**'
|
||||
- 'functions/**'
|
||||
- 'rd-submodules/**'
|
||||
- '*.sh'
|
||||
- 'net.retrodeck.retrodeck.yml'
|
||||
- 'net.retrodeck.retrodeck.appdata.xml'
|
||||
pull_request:
|
||||
branches:
|
||||
- cooker*
|
||||
# push:
|
||||
# branches:
|
||||
# - cooker*
|
||||
# - feat*
|
||||
# paths:
|
||||
# - '.github/workflows/**'
|
||||
# - 'automation_tools/**'
|
||||
# - 'emu-configs/**'
|
||||
# - 'es-configs/**'
|
||||
# - 'functions/**'
|
||||
# - 'rd-submodules/**'
|
||||
# - '*.sh'
|
||||
# - 'net.retrodeck.retrodeck.yml'
|
||||
# - 'net.retrodeck.retrodeck.appdata.xml'
|
||||
# pull_request:
|
||||
# branches:
|
||||
# - cooker*
|
||||
|
||||
# Italy (CET): 11:00 PM
|
||||
# Japan (JST): 7:00 AM
|
||||
schedule:
|
||||
- cron: '0 22 * * *'
|
||||
|
||||
workflow_dispatch:
|
||||
|
||||
|
@ -44,6 +49,10 @@ jobs:
|
|||
- name: Generate cooker build ID
|
||||
run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/cooker_build_id.sh"
|
||||
|
||||
# backing up manifest in case download fails and hashes must be recalculated
|
||||
- name: Manifest backup
|
||||
run: "cp ${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml ${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml.bak"
|
||||
|
||||
- name: Run pre-build automation tasks
|
||||
run : "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/pre_build_automation.sh"
|
||||
|
||||
|
@ -62,12 +71,15 @@ jobs:
|
|||
continue-on-error: true
|
||||
|
||||
# Sometimes flatpak download fails, in this case it tries a second time
|
||||
- name: Run pre-build automation tasks (retry)
|
||||
if: steps.flatpak-download.outcome == 'failure'
|
||||
run : "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/pre_build_automation.sh"
|
||||
- name: "Build flatpak: download only (retry)"
|
||||
if: steps.flatpak-download.outcome == 'failure'
|
||||
run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/flatpak_build_download_only.sh"
|
||||
run: |
|
||||
echo "Download failed, maybe some hash changed since the build start."
|
||||
echo "Recalculating hashes and retrying download..."
|
||||
rm -f "{GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml"
|
||||
cp "${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml.bak" "${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml"
|
||||
"${GITHUB_WORKSPACE}/automation_tools/pre_build_automation.sh"
|
||||
"${GITHUB_WORKSPACE}/automation_tools/flatpak_build_download_only.sh"
|
||||
|
||||
- name: Build flatpak
|
||||
run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/flatpak_build_only.sh"
|
||||
|
|
12
.github/workflows/main-selfhosted.yml
vendored
|
@ -40,6 +40,10 @@ jobs:
|
|||
- name: "Install dependencies"
|
||||
run: "automation_tools/install_dependencies.sh"
|
||||
|
||||
# backing up manifest in case download fails and hashes must be recalculated
|
||||
- name: Manifest backup
|
||||
run: "cp ${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml ${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml.bak"
|
||||
|
||||
- name: Run pre-build automation tasks
|
||||
run : "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/pre_build_automation.sh"
|
||||
|
||||
|
@ -65,7 +69,13 @@ jobs:
|
|||
# Sometimes flatpak download fails, in this case it tries a second time
|
||||
- name: "Build flatpak: download only (retry)"
|
||||
if: steps.flatpak-download.outcome == 'failure'
|
||||
run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/flatpak_build_download_only.sh"
|
||||
run: |
|
||||
echo "Download failed, maybe some hash changed since the build start."
|
||||
echo "Recalculating hashes and retrying download..."
|
||||
rm -f "{GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml"
|
||||
cp "${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml.bak" "${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml"
|
||||
"${GITHUB_WORKSPACE}/automation_tools/pre_build_automation.sh"
|
||||
"${GITHUB_WORKSPACE}/automation_tools/flatpak_build_download_only.sh"
|
||||
|
||||
- name: Build flatpak
|
||||
run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/flatpak_build_only.sh"
|
||||
|
|
4
.github/workflows/submodule-update.yml
vendored
|
@ -2,8 +2,8 @@ name: Sunday Submodule Update
|
|||
|
||||
on:
|
||||
# At 4:00 (CET)
|
||||
schedule:
|
||||
- cron: '0 2 * * 0'
|
||||
# schedule:
|
||||
# - cron: '0 2 * * 0'
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
|
|
8
.gitignore
vendored
|
@ -20,6 +20,7 @@ tmp
|
|||
rd-submodules/es-de/patches-tmp*
|
||||
.local/
|
||||
buildid
|
||||
*.bak
|
||||
|
||||
# Python #
|
||||
##########
|
||||
|
@ -27,6 +28,7 @@ __pycache__
|
|||
|
||||
# Submodules #
|
||||
##############
|
||||
rd-submodules/retroarch/
|
||||
rd-submodules/ryujinx/
|
||||
rd-submodules/shared-modules/
|
||||
rd-submodules/retroarch*
|
||||
rd-submodules/ryujinx*
|
||||
rd-submodules/shared-modules*
|
||||
rd-submodules/es-de/patches-tmp*
|
||||
|
|
|
@ -1,31 +0,0 @@
|
|||
# Read the Docs configuration file
|
||||
# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
|
||||
|
||||
# Required
|
||||
version: 2
|
||||
|
||||
# Set the OS, Python version and other tools you might need
|
||||
build:
|
||||
os: ubuntu-22.04
|
||||
tools:
|
||||
python: "3.11"
|
||||
# You can also specify other tool versions:
|
||||
# nodejs: "19"
|
||||
# rust: "1.64"
|
||||
# golang: "1.19"
|
||||
|
||||
# Build documentation in the "docs/" directory with Sphinx
|
||||
sphinx:
|
||||
configuration: wiki-rtd/conf.py
|
||||
|
||||
# Optionally build your docs in additional formats such as PDF and ePub
|
||||
formats:
|
||||
- pdf
|
||||
- epub
|
||||
|
||||
# Optional but recommended, declare the Python requirements required
|
||||
# to build your documentation
|
||||
# See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html
|
||||
python:
|
||||
install:
|
||||
- requirements: wiki-rtd/requirements.txt
|
103
README.md
|
@ -4,13 +4,13 @@
|
|||
|
||||
# RetroDECK on your device!
|
||||
|
||||
|
||||
<p float="center">
|
||||
<img src="https://github.com/XargonWan/RetroDECK/blob/main/res/screenshots/screen03.jpeg?raw=true" alt="screenshot" width="300"/>
|
||||
<img src="https://github.com/XargonWan/RetroDECK/blob/main/res/screenshots/screen04.jpeg?raw=true" alt="screenshot" width="300"/><br/>
|
||||
<img src="https://github.com/XargonWan/RetroDECK/blob/main/res/screenshots/screen05.jpeg?raw=true" alt="screenshot" width="300"/>
|
||||
<img src="https://github.com/XargonWan/RetroDECK/blob/main/res/screenshots/screen06.jpeg?raw=true" alt="screenshot" width="300"/>
|
||||
</p>
|
||||
<br/>
|
||||
|
||||
Instead of having several different emulators, engines and frontends on your Linux/SteamOS system you only need one: RetroDECK.
|
||||
|
||||
![Flathub](https://img.shields.io/flathub/downloads/net.retrodeck.retrodeck)
|
||||
![Flathub](https://img.shields.io/flathub/v/net.retrodeck.retrodeck)
|
||||
|
@ -18,43 +18,21 @@
|
|||
![GitHub](https://img.shields.io/github/license/XargonWan/RetroDECK)
|
||||
[![Documentation Status](https://readthedocs.org/projects/retrodeck/badge/?version=latest)](https://retrodeck.readthedocs.io/en/latest/?badge=latest)
|
||||
|
||||
# What is RetroDECK?
|
||||
Instead of having several different software on your system for a variety of emulators and frontends you only need to have one: RetroDECK.
|
||||
**The RetroDECK Wiki & FAQ**
|
||||
|
||||
RetroDECK is a [EmulationStation Desktop Edition](https://es-de.org) (ES-DE) powered flatpak application that builds in a variety of emulators and other software that allows you to play your favorite retro (and even not-so-retro) games in one complete package.
|
||||
Please check out the these links for even more information:
|
||||
|
||||
It's inspired by embedded emulation systems like:
|
||||
|
||||
- AmberELEC
|
||||
- EmuELEC
|
||||
- CoreELEC
|
||||
- Lakka
|
||||
- Batocera
|
||||
|
||||
The RetroDECK team consists of several veterans from some of the projects mentioned above as well as a bunch of other talented individuals.
|
||||
|
||||
RetroDECK also adds the `RetroDECK Framework` and the `RetroDECK Configurator` on top of the emulators and ES-DE frontend that allows deeper integrations between emulators and easier exposure to a variety of features that you otherwise need to set per emulator basis to create a uniformity between them.
|
||||
|
||||
For our long term vision you can check out the following wiki page:
|
||||
|
||||
[RetroDECK: Visions and Goals](https://github.com/XargonWan/RetroDECK/wiki/RetroDECK%3A-Visions-and-Goals)
|
||||
|
||||
### The RetroDECK community:
|
||||
|
||||
[Website](https://retrodeck.net) <br/>
|
||||
[Wiki](https://github.com/XargonWan/RetroDECK/wiki) <br/>
|
||||
[Discord](https://discord.gg/Dz3szYsP8g)<br/>
|
||||
[Lemmy](https://lemmy.zip/c/retrodeck)<br/>
|
||||
[Subreddit](https://www.reddit.com/r/retrodeck)
|
||||
- [RetroDECK Wiki](https://retrodeck.readthedocs.io/en/latest/)
|
||||
- [RetroDECK FAQ](https://retrodeck.readthedocs.io/en/latest/wiki_general/faq/)
|
||||
|
||||
# How do I start using RetroDECK?
|
||||
Basically just download it from Flathub, put your roms/games and needed bioses and just play.
|
||||
|
||||
We have an in depth How To on how to get started over here:
|
||||
Read our getting started guide here:
|
||||
|
||||
[How to: Start using RetroDECK](https://github.com/XargonWan/RetroDECK/wiki/How-to%3A-Start-using-RetroDECK)
|
||||
[How to: Start using RetroDECK](https://retrodeck.readthedocs.io/en/latest/wiki_general/retrodeck-start/)
|
||||
|
||||
## What devices/systems does RetroDECK support:
|
||||
|
||||
RetroDECK currently supports:
|
||||
|
||||
- Steam Deck
|
||||
|
@ -62,21 +40,68 @@ RetroDECK currently supports:
|
|||
|
||||
For more information read up here:
|
||||
|
||||
[Supported Systems](https://github.com/XargonWan/RetroDECK/wiki/RetroDECK%3A-Supported-Systems)
|
||||
[Supported Systems](https://retrodeck.readthedocs.io/en/latest/wiki_general/supported-devices/)
|
||||
|
||||
## What is RetroDECK?
|
||||
RetroDECK is a [EmulationStation Desktop Edition](https://es-de.org) (ES-DE) powered Linux [Flatpak application](https://flathub.org/apps/net.retrodeck.retrodeck) that thanks to its `RetroDECK Framework` it builds-in and manage a variety of emulators and other software that allows you to play your favorite retro (and even not-so-retro) games in one complete package.
|
||||
|
||||
### So what does that mean?
|
||||
It means that RetroDECK provides all the emulators, systems and a frontend. RetroDECK configures them for you and put them into one application you can download from Flathub.
|
||||
|
||||
By being one application RetroDECK can put all important files in one location for all the emulators, instead of having them spread out over your entire system and even add features on top to orchestrate them seamlessly.
|
||||
|
||||
|
||||
## Is RetroDECK in Beta?
|
||||
### The RetroDECK Framework
|
||||
As previously mentioned, RetroDECK also adds the `RetroDECK Framework` on top of the emulators and ES-DE interface that allows deeper integrations between emulators and easier exposure to a variety of features that you otherwise need to set per emulator basis to create a uniformity between them.
|
||||
|
||||
The `RetroDECK Configurator` is a `Utility` that some parts of exposes the `RetroDECK Framework` to the RetroDECK users.
|
||||
|
||||
**What can the RetroDECK Framework and by extent the RetroDECK Configurator do?**
|
||||
|
||||
It can help with:
|
||||
|
||||
- Compressing games
|
||||
- Easier `Texture Pack` and `Mod` management
|
||||
- File management
|
||||
- Tools for troubleshooting (BIOS Checker, Multi-File Structure Checker, Partial or full reset of functions)
|
||||
- Auto installing some free BIOSes
|
||||
- Install prebuilt Steam Input profiles for devices like the Steam Deck and external controllers
|
||||
- Easier management of `mods`, `roms`, `texture_packs`, `scraped media`, `screenshots`, `saves / states` `gamelists` and more
|
||||
- Give access to global presets that can be acitivated to configure things over many emulators in one go like: `RetroAchievements`
|
||||
`Borders` `Widescreen Mode` `Swaping A/B X/Y for Nintendo Games`
|
||||
|
||||
For our long term vision you can check out the following wiki page:
|
||||
[RetroDECK: Visions and Goals](https://retrodeck.readthedocs.io/en/latest/wiki_about/visions-and-goals/)
|
||||
|
||||
### How to get support?
|
||||
Use the supports channels on [Discord](https://discord.gg/Dz3szYsP8g) `🤝-community-support` and `🆘-support`.
|
||||
### The RetroDECK community:
|
||||
[Website](https://retrodeck.net) <br/>
|
||||
[Wiki](https://github.com/XargonWan/RetroDECK/wiki) <br/>
|
||||
[Discord](https://discord.gg/Dz3szYsP8g)<br/>
|
||||
[Lemmy](https://lemmy.zip/c/retrodeck)<br/>
|
||||
[Subreddit](https://www.reddit.com/r/retrodeck)
|
||||
|
||||
### Is RetroDECK in Beta?
|
||||
Yes, here you can read more about the beta period:
|
||||
|
||||
[RetroDECK: Beta period](https://github.com/XargonWan/RetroDECK/wiki/RetroDECK%3A-Beta-period)
|
||||
|
||||
|
||||
## Can I contribute to the project?
|
||||
[RetroDECK: Beta period](https://retrodeck.readthedocs.io/en/latest/wiki_general/beta-period/)
|
||||
|
||||
### Can I contribute to the project?
|
||||
Yes, off course! <br>
|
||||
Read up here on how to help out, there is something for everyone:
|
||||
|
||||
[How to: Contribute to RetroDECK](https://github.com/XargonWan/RetroDECK/wiki/How-to%3A-Contribute-to-RetroDECK)
|
||||
[How to: Contribute to RetroDECK](https://retrodeck.readthedocs.io/en/latest/wiki_community/contibute-rd/)
|
||||
|
||||
## Our repositories:
|
||||
| Name | Description |
|
||||
|-------------------------------------------------------------|-----------------------------------------------------------|
|
||||
| [RetroDECK](https://github.com/XargonWan/RetroDECK) | This one, our main repo where the core of the project is |
|
||||
| [RetroDECK-cooker](https://github.com/XargonWan/RetroDECK-cooker) | Where we publish our test build, no code is hosted here |
|
||||
| [RetroDECK-Wiki](https://github.com/XargonWan/RetroDECK-Wiki) | Where our wiki source code is |
|
||||
| [RetroDECK on Flathub](https://github.com/flathub/net.retrodeck.retrodeck) | Our little space in Flathub's organization |
|
||||
| [RetroDECK-MAME](https://github.com/XargonWan/RetroDECK-MAME) | MAME is big to build, so it's pre-built here and then imported in the build |
|
||||
| [RetroDECK-ES-DE](https://github.com/XargonWan/RetroDECK-ES-DE) | This is where we store our patched fork of ES-DE |
|
||||
|
||||
|
||||
# The RetroDECK Wiki
|
||||
|
|
|
@ -8,6 +8,8 @@ hash^MSXBIOSHASHPLACEHOLDER^http://bluemsx.msxblue.com/rel_download/blueMSXv282f
|
|||
hash^XEMUHDDHASHPLACEHOLDER^https://github.com/mborgerson/xemu-hdd-image/releases/latest/download/xbox_hdd.qcow2.zip
|
||||
hash^VITA3KSHAPLACEHOLDER^https://github.com/Vita3K/Vita3K/releases/download/continuous/ubuntu-latest.zip
|
||||
hash^RANIGHTLYCORESPLACEHOLDER^https://buildbot.libretro.com/nightly/linux/x86_64/RetroArch_cores.7z
|
||||
hash^RETRODECKMAMEPLACEHOLDER^"https://github.com/XargonWan/RetroDECK-MAME/releases/download/$(curl -s https://api.github.com/repos/XargonWan/RetroDECK-MAME/releases/latest | grep -oP '"tag_name": "\K(.*?)(?=")')/RetroDECK-MAME-Artifact.tar.gz"
|
||||
url^RETRODECKMAMEURLPLACEHOLDER^"https://github.com/XargonWan/RetroDECK-MAME/releases/download/$(curl -s https://api.github.com/repos/XargonWan/RetroDECK-MAME/releases/latest | grep -oP '"tag_name": "\K(.*?)(?=")')/RetroDECK-MAME-Artifact.tar.gz"
|
||||
latestcommit^UNIVERSALDYNAMICINPUTCOMMITPLACEHOLDER^https://github.com/Venomalia/UniversalDynamicInput^main
|
||||
outside_info^VERSIONPLACEHOLDER^${GITHUB_WORKSPACE}/buildid
|
||||
outside_file^VERSIONPLACEHOLDER^${GITHUB_WORKSPACE}/buildid
|
||||
branch^THISBRANCH
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
# This is building the bundle RetroDECK.flatpak after the download and build steps are done
|
||||
|
||||
if [ "${GITHUB_REF##*/}" = "main" ]; then
|
||||
flatpak build-bundle ${GITHUB_WORKSPACE}/.local RetroDECK.flatpak net.retrodeck.retrodeck
|
||||
flatpak build-bundle "${GITHUB_WORKSPACE}/.local" "$GITHUB_WORKSPACE/RetroDECK.flatpak" net.retrodeck.retrodeck
|
||||
else
|
||||
flatpak build-bundle ${GITHUB_WORKSPACE}/.local RetroDECK-cooker.flatpak net.retrodeck.retrodeck
|
||||
flatpak build-bundle "${GITHUB_WORKSPACE}/.local" "$GITHUB_WORKSPACE/RetroDECK-cooker.flatpak" net.retrodeck.retrodeck
|
||||
fi
|
12
automation_tools/flatpak_build_bundle_persistent.sh
Executable file
|
@ -0,0 +1,12 @@
|
|||
#!/bin/bash
|
||||
|
||||
# This is building the bundle RetroDECK.flatpak after the download and build steps are done
|
||||
|
||||
BUILD_DIR="$HOME/cooker-persistent"
|
||||
mkdir -p "$BUILD_DIR"
|
||||
|
||||
if [ "${GITHUB_REF##*/}" = "main" ]; then
|
||||
flatpak build-bundle "${BUILD_DIR}/.local" "$GITHUB_WORKSPACE/RetroDECK.flatpak" net.retrodeck.retrodeck
|
||||
else
|
||||
flatpak build-bundle "${BUILD_DIR}/.local" "$GITHUB_WORKSPACE/RetroDECK-cooker.flatpak" net.retrodeck.retrodeck
|
||||
fi
|
|
@ -12,7 +12,7 @@ else
|
|||
FOLDER=retrodeck-flatpak-cooker
|
||||
fi
|
||||
|
||||
mkdir -vp "${GITHUB_WORKSPACE}"/{local,retrodeck-flatpak-cooker}
|
||||
mkdir -vp "${GITHUB_WORKSPACE}"/{.local,retrodeck-flatpak-cooker}
|
||||
|
||||
flatpak-builder --user --force-clean \
|
||||
--install-deps-from=flathub \
|
||||
|
@ -21,3 +21,4 @@ flatpak-builder --user --force-clean \
|
|||
--download-only \
|
||||
"${GITHUB_WORKSPACE}/${FOLDER}" \
|
||||
net.retrodeck.retrodeck.yml
|
||||
|
26
automation_tools/flatpak_build_download_only_persistent.sh
Executable file
|
@ -0,0 +1,26 @@
|
|||
#!/bin/bash
|
||||
|
||||
# This script is downloading the needed files to prepare the manifest build
|
||||
|
||||
git config --global protocol.file.allow always
|
||||
|
||||
if [[ "${GITHUB_REF##*/}" == "main" ]]; then
|
||||
BUNDLE_NAME="RetroDECK.flatpak"
|
||||
FOLDER=retrodeck-flatpak
|
||||
else
|
||||
BUNDLE_NAME="RetroDECK-cooker.flatpak"
|
||||
FOLDER=retrodeck-flatpak-cooker
|
||||
fi
|
||||
|
||||
BUILD_DIR="$HOME/cooker-persistent"
|
||||
mkdir -p "$BUILD_DIR"
|
||||
mkdir -vp "${BUILD_DIR}"/{.local,retrodeck-flatpak-cooker}
|
||||
|
||||
flatpak-builder --user --force-clean \
|
||||
--install-deps-from=flathub \
|
||||
--install-deps-from=flathub-beta \
|
||||
--repo="${BUILD_DIR}/.local" \
|
||||
--download-only \
|
||||
"${BUILD_DIR}/${FOLDER}" \
|
||||
"${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml"
|
||||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
# This script is downloading the needed files to prepare the manifest build
|
||||
|
||||
git config --global protocol.file.allow always
|
||||
git config protocol.file.allow always
|
||||
|
||||
if [ "${GITHUB_REF##*/}" = "main" ]; then
|
||||
BUNDLE_NAME="RetroDECK.flatpak"
|
||||
|
@ -20,5 +20,5 @@ flatpak-builder --user --force-clean \
|
|||
--install-deps-from=flathub-beta \
|
||||
--repo=${GITHUB_WORKSPACE}/.local \
|
||||
--disable-download \
|
||||
${GITHUB_WORKSPACE}/"$FOLDER" \
|
||||
net.retrodeck.retrodeck.yml
|
||||
"${GITHUB_WORKSPACE}/$FOLDER" \
|
||||
net.retrodeck.retrodeck.yml
|
25
automation_tools/flatpak_build_only_persistent.sh
Executable file
|
@ -0,0 +1,25 @@
|
|||
#!/bin/bash
|
||||
|
||||
# This script is downloading the needed files to prepare the manifest build
|
||||
|
||||
git config protocol.file.allow always
|
||||
|
||||
if [ "${GITHUB_REF##*/}" = "main" ]; then
|
||||
BUNDLE_NAME="RetroDECK.flatpak"
|
||||
FOLDER=retrodeck-flatpak-main
|
||||
else
|
||||
BUNDLE_NAME="RetroDECK-cooker.flatpak"
|
||||
FOLDER=retrodeck-flatpak-cooker
|
||||
fi
|
||||
|
||||
BUILD_DIR="$HOME/cooker-persistent"
|
||||
mkdir -vp ${$BUILD_DIR}/.local
|
||||
mkdir -vp ${$BUILD_DIR}/"$FOLDER"
|
||||
|
||||
flatpak-builder --user --force-clean \
|
||||
--install-deps-from=flathub \
|
||||
--install-deps-from=flathub-beta \
|
||||
--repo="${BUILD_DIR}/.local" \
|
||||
--disable-download \
|
||||
"${BUILD_DIR}/${FOLDER}" \
|
||||
"${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml"
|
|
@ -2,4 +2,5 @@
|
|||
# This scritp is installing the required dependencies to correctly run the pipeline and buold the flatpak
|
||||
|
||||
sudo apt install -y flatpak flatpak-builder p7zip-full xmlstarlet bzip2 curl
|
||||
flatpak remote-add --user --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
|
||||
flatpak remote-add --user --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
|
||||
flatpak remote-add --user --if-not-exists flathub-beta https://flathub.org/beta-repo/flathub-beta.flatpakrepo
|
|
@ -3,20 +3,43 @@
|
|||
# For the file paths to work correctly, call this script with this command from the cloned repo folder root:
|
||||
# sh automation_tools/pre_build_automation.sh
|
||||
# Different actions need different information in the task list file
|
||||
# branch: This changes the placeholder text to the currently-detected GIT branch if an automated build was started from a PR environment.
|
||||
# hash: Finds the SHA256 hash of a file online and updates the placeholder in the manifest.
|
||||
# Needs the URL of the file, in this line format: hash^PLACEHOLDERTEXT^url
|
||||
# latestcommit: Finds the most recent commit of a git repo and updated the placeholder in the manifest.
|
||||
# Needs the URL of the repo and the branch to find the latest commit from, in this line format: latestcommit^PLACEHOLDERTEXT^url^branch
|
||||
# latestappimage: Finds the download URL and SHA256 hash of the latest AppImage release from a git repo
|
||||
# Needs the API URL of the repo, in this line format: latestappimage^PLACEHOLDERTEXT^https://api.github.com/repos/<owner-name>/<repo-name>/releases/latest
|
||||
# latestghrelease: Finds the download URL and SHA256 hash of the latest release from a git repo.
|
||||
# Needs the API URL of the repo, in this line format: latestappimage^PLACEHOLDERTEXT^https://api.github.com/repos/<owner-name>/<repo-name>/releases/latest^<file suffix>
|
||||
# As this command updates two different placeholders (one for the URL, one for the file hash) in the manifest,
|
||||
# the URL that would be used in the above example is "PLACEHOLDERTEXT" and the hash placeholder text would be "HASHPLACEHOLDERTEXT"
|
||||
# The "HASH" prefix of the placeholder text is hardcoded in the script
|
||||
# The <file_suffix> will be the file extension or other identifying suffix at the end of the file name that can be used to select from multiple releases.
|
||||
# Example: If there are these file options for a given release:
|
||||
# yuzu-mainline-20240205-149629642.AppImage
|
||||
# yuzu-linux-20240205-149629642-source.tar.xz
|
||||
# yuzu-linux-20240205-149629642-debug.tar.xz
|
||||
# Entering "AppImage" (without quotes) for the <file_suffix> will identify yuzu-mainline-20240205-149629642.AppImage
|
||||
# Entering "source-.tar.xz" (without quotes) for the <file_suffix> will identify yuzu-linux-20240205-149629642-source.tar.xz
|
||||
# Entering "debug-tar.xz" (without quotes) for the <file_suffix> will identify yuzu-linux-20240205-149629642-debug.tar.xz
|
||||
# As a file extension like ".tar.zx" can apply to multiple file options, the entire part that is appended to each release name should be included.
|
||||
# The <file_suffix> will also only consider entries where the given suffix is at the end of the file name. So "AppImage" will identify "file.AppImage" but not "file.AppImage.zsync"
|
||||
# outside_file: Prints the contents of a file from the build environment (such as the buildid file) and replaces the placeholder text with those contents.
|
||||
# outside_env_var: Gets the value of an environmental variable from the build environment (the output of "echo $var" from the terminal) and replaces the placeholder text with that value.
|
||||
# custom_command: Runs a single command explicitly as written in the $URL field of the task list, including variable and command expansion. This should work the same as if you were runnig the command directly from the terminal.
|
||||
# This command does not need a PLACEHOLDERTEXT field in the task list, so needs to be in this syntax: custom_command^^$COMMAND
|
||||
# url: This is used to calculate a dynamic URL and the value to the $caluculated_url environmental variable, for use in other subsequent commands.
|
||||
|
||||
rd_manifest=${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml
|
||||
automation_task_list=${GITHUB_WORKSPACE}/automation_tools/automation_task_list.cfg
|
||||
current_branch=$(git rev-parse --abbrev-ref HEAD)
|
||||
|
||||
# During the PR automated tests instead of the branch name is returned "HEAD", fixing it
|
||||
if [ $current_branch == "HEAD" ]; then
|
||||
echo "Looks like we are on a PR environment, retrieving the branch name from which the PR is raised."
|
||||
current_branch=$(echo $GITHUB_REF | sed 's@refs/heads/@@')
|
||||
echo "The branch name from which the PR is raised is \"$current_branch\"."
|
||||
fi
|
||||
|
||||
echo "Manifest location: $rd_manifest"
|
||||
echo "Automation task list location: $automation_task_list"
|
||||
echo
|
||||
|
@ -28,21 +51,28 @@ echo
|
|||
while IFS="^" read -r action placeholder url branch
|
||||
do
|
||||
if [[ ! $action == "#"* ]] && [[ ! -z "$action" ]]; then
|
||||
if [[ "$action" == "branch" ]]; then
|
||||
case "$action" in
|
||||
|
||||
"branch" )
|
||||
echo
|
||||
echo "Placeholder text: $placeholder"
|
||||
echo "Current branch:" "$current_branch"
|
||||
echo
|
||||
/bin/sed -i 's^'"$placeholder"'^'"$current_branch"'^g' $rd_manifest
|
||||
elif [[ "$action" == "hash" ]]; then
|
||||
;;
|
||||
|
||||
"hash" )
|
||||
echo
|
||||
echo "Placeholder text: $placeholder"
|
||||
echo "URL to hash: $url"
|
||||
calculated_url=$(eval echo "$url") # in case the url has to be calculated from an expression
|
||||
echo "URL to hash: $calculated_url"
|
||||
echo
|
||||
hash=$(curl -sL "$url" | sha256sum | cut -d ' ' -f1)
|
||||
hash=$(curl -sL "$calculated_url" | sha256sum | cut -d ' ' -f1)
|
||||
echo "Hash found: $hash"
|
||||
/bin/sed -i 's^'"$placeholder"'^'"$hash"'^' $rd_manifest
|
||||
elif [[ "$action" == "latestcommit" ]]; then
|
||||
;;
|
||||
|
||||
"latestcommit" )
|
||||
echo
|
||||
echo "Placeholder text: $placeholder"
|
||||
echo "Repo to get latest commit from: $url branch: $branch"
|
||||
|
@ -50,18 +80,22 @@ do
|
|||
commit=$(git ls-remote "$url" "$branch" | cut -f1)
|
||||
echo "Commit found: $commit"
|
||||
/bin/sed -i 's^'"$placeholder"'^'"$commit"'^' $rd_manifest
|
||||
elif [[ "$action" == "latestappimage" ]]; then
|
||||
;;
|
||||
|
||||
"latestghrelease" )
|
||||
echo
|
||||
echo "Placeholder text: $placeholder"
|
||||
echo "Repo to look for AppImage releases: $url"
|
||||
echo
|
||||
appimageurl=$(curl -s "$url" | grep browser_download_url | grep "\.AppImage\"" | cut -d : -f 2,3 | tr -d \" | sed -n 1p | tr -d ' ')
|
||||
echo "AppImage URL found: $appimageurl"
|
||||
/bin/sed -i 's^'"$placeholder"'^'"$appimageurl"'^' $rd_manifest
|
||||
appimagehash=$(curl -sL "$appimageurl" | sha256sum | cut -d ' ' -f1)
|
||||
echo "AppImage hash found: $appimagehash"
|
||||
/bin/sed -i 's^'"HASHFOR$placeholder"'^'"$appimagehash"'^' $rd_manifest
|
||||
elif [[ "$action" == "outside_info" ]]; then
|
||||
ghreleaseurl=$(curl -s "$url" | grep browser_download_url | grep "$branch\""$ | cut -d : -f 2,3 | tr -d \" | sed -n 1p | tr -d ' ')
|
||||
echo "GitHub release URL found: $ghreleaseurl"
|
||||
/bin/sed -i 's^'"$placeholder"'^'"$ghreleaseurl"'^' $rd_manifest
|
||||
ghreleasehash=$(curl -sL "$ghreleaseurl" | sha256sum | cut -d ' ' -f1)
|
||||
echo "GitHub release hash found: $ghreleasehash"
|
||||
/bin/sed -i 's^'"HASHFOR$placeholder"'^'"$ghreleasehash"'^' $rd_manifest
|
||||
;;
|
||||
|
||||
"outside_file" )
|
||||
if [[ "$url" = \$* ]]; then # If value is a reference to a variable name
|
||||
eval url="$url"
|
||||
fi
|
||||
|
@ -70,6 +104,36 @@ do
|
|||
echo "Information being injected: $(cat $url)"
|
||||
echo
|
||||
/bin/sed -i 's^'"$placeholder"'^'"$(cat $url)"'^' $rd_manifest
|
||||
fi
|
||||
;;
|
||||
|
||||
"outside_env_var" )
|
||||
if [[ "$url" = \$* ]]; then # If value is a reference to a variable name
|
||||
eval url="$url"
|
||||
fi
|
||||
echo
|
||||
echo "Placeholder text: $placeholder"
|
||||
echo "Information being injected: $(echo $url)"
|
||||
echo
|
||||
/bin/sed -i 's^'"$placeholder"'^'"$(echo $url)"'^' $rd_manifest
|
||||
;;
|
||||
|
||||
"custom_command" )
|
||||
echo
|
||||
echo "Command to run: $url"
|
||||
echo
|
||||
eval "$url"
|
||||
;;
|
||||
|
||||
"url" )
|
||||
# this is used to calculate a dynamic url
|
||||
echo
|
||||
echo "Placeholder text: $placeholder"
|
||||
calculated_url=$(eval echo "$url")
|
||||
echo "Information being injected: $calculated_url"
|
||||
echo
|
||||
/bin/sed -i 's^'"$placeholder"'^'"$calculated_url"'^' $rd_manifest
|
||||
;;
|
||||
|
||||
esac
|
||||
fi
|
||||
done < "$automation_task_list"
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
#!/bin/bash
|
||||
|
||||
# TODO: FEDORA
|
||||
# sudo dnf install -y flatpak flatpak-builder p7zip p7zip-plugins xmlstarlet bzip2 curl
|
||||
|
||||
export GITHUB_WORKSPACE="."
|
||||
cp net.retrodeck.retrodeck.appdata.xml net.retrodeck.retrodeck.appdata.xml.bak
|
||||
cp net.retrodeck.retrodeck.yml net.retrodeck.retrodeck.yml.bak
|
||||
|
|
26
docs/assets/img/rd-esde-logo.svg
Normal file
After Width: | Height: | Size: 16 KiB |
116
docs/index.html
|
@ -44,11 +44,12 @@
|
|||
<ul class="navbar-nav ms-auto">
|
||||
<li class="nav-item"><a class="nav-link" href="#top" style="color: rgb(49,52,55);">Home</a></li>
|
||||
<li class="nav-item"><a class="nav-link" href="#features" style="color: rgb(49,52,55);">features</a></li>
|
||||
<li class="nav-item"><a class="nav-link" href="https://github.com/XargonWan/RetroDECK/wiki" style="color: rgb(49,52,55);" target="_blank">wiki</a></li>
|
||||
<li class="nav-item"><a class="nav-link" href="https://github.com/XargonWan/RetroDECK-cooker/" style="color: rgb(49,52,55);" target="_blank">cooker</a></li>
|
||||
<li class="nav-item"><a class="nav-link" href="https://retrodeck.readthedocs.io/en/latest/blog/" style="color: rgb(49,52,55);" target="_blank">blog</a></li>
|
||||
<li class="nav-item"><a class="nav-link" href="https://discord.gg/tbmBpJbpur" target="_blank" style="color: rgb(49,52,55);">Discord</a></li>
|
||||
<li class="nav-item"><a class="nav-link" href="https://retrodeck.readthedocs.io/en/latest/" style="color: rgb(49,52,55);" target="_blank">wiki</a></li>
|
||||
<li class="nav-item"><a class="nav-link" href="https://github.com/XargonWan/RetroDECK" target="_blank" style="color: rgb(49,52,55);">github</a></li>
|
||||
<li class="nav-item"><a class="nav-link" href="https://www.patreon.com/RetroDECK" target="_blank" style="color: rgb(49,52,55);">patreon</a></li>
|
||||
<li class="nav-item"><a class="nav-link" href="https://discord.gg/tbmBpJbpur" target="_blank" style="color: rgb(49,52,55);">connect with us</a></li>
|
||||
<li class="nav-item"><a class="nav-link" href="https://github.com/XargonWan/RetroDECK-cooker/" style="color: rgb(49,52,55);" target="_blank">cooker</a></li>
|
||||
<li class="nav-item"><a class="nav-link" href="https://retrodeck.readthedocs.io/en/latest/wiki_about/donations-licenses/" target="_blank" style="color: rgb(49,52,55);">donations</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -58,8 +59,8 @@
|
|||
<div class="container">
|
||||
<!-- Start: Intro -->
|
||||
<div class="intro">
|
||||
<h2 class="text-center" style="font-size: 60px;margin-bottom: 0px;"><img class="img-fluid" src="assets/img/logo_stacked_esde.png" style="margin-bottom: 25px;"></h2>
|
||||
<p class="text-center" style="font-size: 20px;color: rgb(255,255,255);"><span style="color: rgb(220, 221, 222); background-color: rgba(4, 4, 5, 0.07);">RetroDECK is a polished and beginner-friendly environment for playing your retro games on Steam Deck, available with just one click from the Discover app.</span></p>
|
||||
<h2 class="text-center" style="font-size: 60px;margin-bottom: 0px;"><img class="img-fluid" src="assets/img/rd-esde-logo.svg" style="margin-bottom: 25px;"></h2>
|
||||
<p class="text-center" style="font-size: 20px;color: rgb(255,255,255);"><span style="color: rgb(220, 221, 222); background-color: rgba(4, 4, 5, 0.07);">RetroDECK is a polished and beginner-friendly environment for playing your retro games on Steam Deck and Linux Desktop, available with just one click from the Discover app or wherever you get your flatpaks.</span></p>
|
||||
</div><!-- End: Intro -->
|
||||
<!-- Start: Buttons -->
|
||||
<div class="buttons" style="margin-bottom: 0px;"><a class="btn btn-secondary" role="button" target="_blank" style="color: black;background: white;border-top-left-radius: 5px;border-top-right-radius: 5px;border-bottom-right-radius: 5px;border-bottom-left-radius: 5px;" href="https://flathub.org/apps/details/net.retrodeck.retrodeck"><i class="fas fa-download"></i> Get retrodeck</a></div><!-- End: Buttons -->
|
||||
|
@ -94,8 +95,8 @@
|
|||
<div class="container">
|
||||
<div class="text-white bg-primary border rounded border-0 border-primary d-flex flex-column justify-content-between align-items-center align-items-sm-center align-items-md-center flex-lg-row justify-content-lg-center justify-content-xl-center justify-content-xxl-center p-4 p-md-5" style="background: linear-gradient(-95deg, #1a9fff, #946beb);">
|
||||
<div class="pb-2 pb-lg-1">
|
||||
<h2 class="fw-bold mb-2" style="color: rgb(255,255,255);text-align: center;">POWERED BY EMULATIONSTATION-DE</h2>
|
||||
<p class="mb-0" style="color: rgb(255,255,255);text-align: center;">RetroDECK teamed up with ES-DE to bring you the best retro launcher out there!</p>
|
||||
<h2 class="fw-bold mb-2" style="color: rgb(255,255,255);text-align: center;">POWERED BY ES-DE & THE RETRODECK FRAMEWORK</h2>
|
||||
<p class="mb-0" style="color: rgb(255,255,255);text-align: center;">Together with ES-DE, other software and RetroDECK's own Framework. We are trying to bring you the best all-in-one system out there.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -110,32 +111,40 @@
|
|||
<!-- Start: Features -->
|
||||
<div class="row justify-content-center features">
|
||||
<div class="col-sm-6 col-lg-4 item"><i class="fas fa-play-circle icon" style="background: linear-gradient(-95deg, #1a9fff, #946beb);-webkit-background-clip: text;-webkit-text-fill-color: transparent;"></i>
|
||||
<h3 class="name">ready, set, go!</h3>
|
||||
<p class="description">No configuration, just play!</p>
|
||||
<h3 class="name">pickup and play</h3>
|
||||
<p class="description">No configuration is needed to start. You provide the games and we provide the play.</p>
|
||||
</div>
|
||||
<div class="col-sm-6 col-lg-4 item"><i class="fas fa-exchange-alt icon" style="background: linear-gradient(-95deg, #1a9fff, #946beb);-webkit-background-clip: text;-webkit-text-fill-color: transparent;"></i>
|
||||
<h3 class="name"><strong>instant pickup</strong></h3>
|
||||
<p class="description">Close your game? No worries! Pick up exactly where you left off!</p>
|
||||
<h3 class="name"><strong>quick resume</strong></h3>
|
||||
<p class="description">Quit your game and pick it up exactly where you left off.</p>
|
||||
</div>
|
||||
<div class="col-sm-6 col-lg-4 item"><i class="fas fa-backward icon" style="background: linear-gradient(-95deg, #1a9fff, #946beb);-webkit-background-clip: text;-webkit-text-fill-color: transparent;"></i>
|
||||
<h3 class="name"><strong>rewind</strong></h3>
|
||||
<p class="description">Seems like you died! Go back in time and retry without having to restart your game or lose a life. <em>(Must be manually enabled during the beta)</em></p>
|
||||
<h3 class="name"><strong>rewind & fast forward</strong></h3>
|
||||
<p class="description"> Go back in time and retry without having to restart your game or skip over that long conversation.</p>
|
||||
</div>
|
||||
<div class="col-sm-6 col-lg-4 item"><i class="fas fa-wrench icon" style="background: linear-gradient(-95deg, #1a9fff, #946beb);-webkit-background-clip: text;-webkit-text-fill-color: transparent;"></i>
|
||||
<h3 class="name">The Configurator</h3>
|
||||
<p class="description">A super powerful multi-tool interface that allows you to have quick access to the advanced functions and tweak them to your desire.</p>
|
||||
</div>
|
||||
<div class="col-sm-6 col-lg-4 item"><i class="fas fa-box icon" style="background: linear-gradient(-95deg, #1a9fff, #946beb);-webkit-background-clip: text;-webkit-text-fill-color: transparent;"></i>
|
||||
<h3 class="name">Flatpak</h3>
|
||||
<p class="description">Everything is contained within one application and not over your entire filesystem. Only one place to look and one place to backu.!</p>
|
||||
</div>
|
||||
<div class="col-sm-6 col-lg-4 item"><i class="fa fa-linux icon" style="background: linear-gradient(-95deg, #1a9fff, #946beb);-webkit-background-clip: text;-webkit-text-fill-color: transparent;"></i>
|
||||
<h3 class="name">Use your system</h3>
|
||||
<p class="description">With RetroDECK there is no need to replace your existing Linux / SteamOS to get a all-in-one retro gaming solution. Install it on what you already have. </p>
|
||||
</div>
|
||||
<div class="col-sm-6 col-lg-4 item"><i class="fas fa-gamepad icon" style="background: linear-gradient(-95deg, #1a9fff, #946beb);-webkit-background-clip: text;-webkit-text-fill-color: transparent;"></i>
|
||||
<h3 class="name">Hotkey System</h3>
|
||||
<p class="description">Features a in-depth global hotkey system with radial menus in addition to button combos via Steam Input. </p>
|
||||
</div>
|
||||
<div class="col-sm-6 col-lg-4 item"><i class="fas fa-ghost icon" style="background: linear-gradient(-95deg, #1a9fff, #946beb);-webkit-background-clip: text;-webkit-text-fill-color: transparent;"></i>
|
||||
<h3 class="name"><strong>cheats</strong></h3>
|
||||
<p class="description">Wanna be that guy? You can.</p>
|
||||
</div>
|
||||
<div class="col-sm-6 col-lg-4 item"><i class="fas fa-wifi icon" style="background: linear-gradient(-95deg, #1a9fff, #946beb);-webkit-background-clip: text;-webkit-text-fill-color: transparent;"></i>
|
||||
<h3 class="name">online gaming <em>(Coming soon)</em><br></h3>
|
||||
<p class="description">Thanks to RetroArch's Netplay you will be able to play online with your friends, stay tuned for this feature!<br></p>
|
||||
<p class="description">Can't surpass THAT point? Don't want to farm? Enable cheats and play smoothly. </p>
|
||||
</div>
|
||||
<div class="col-sm-6 col-lg-4 item"><i class="fas fa-database icon" style="background: linear-gradient(-95deg, #1a9fff, #946beb);-webkit-background-clip: text;-webkit-text-fill-color: transparent;"></i>
|
||||
<h3 class="name"><strong>metadata</strong></h3>
|
||||
<p class="description">RetroDECK pulls information from your library to create a beautiful user experience!<br></p>
|
||||
</div>
|
||||
<div class="col-sm-6 col-lg-4 item"><i class="fas fa-cloud-download-alt icon" style="background: linear-gradient(-95deg, #1a9fff, #946beb);-webkit-background-clip: text;-webkit-text-fill-color: transparent;"></i>
|
||||
<h3 class="name"><strong>cloud saves <em>(coming soon)</em></strong></h3>
|
||||
<p class="description">RetroDECK will backup your progression and sync it across multiple devices. <em>(User configuration may be needed)</em><br></p>
|
||||
<h3 class="name"><strong>metadata & Images</strong></h3>
|
||||
<p class="description">From the ES-DE frontend you can pull information to your library to create a beautiful user experience from various sources, that fits your style.<br></p>
|
||||
</div>
|
||||
<div class="col-sm-6 col-lg-4 item"><i class="fas fa-medal icon" style="background: linear-gradient(-95deg, #1a9fff, #946beb);-webkit-background-clip: text;-webkit-text-fill-color: transparent;"></i>
|
||||
<h3 class="name">Retro Achievements</h3>
|
||||
|
@ -143,16 +152,63 @@
|
|||
</div>
|
||||
</div><!-- End: Features -->
|
||||
</div>
|
||||
</section><!-- End: Features Clean -->
|
||||
<!-- Start: Banner Color -->
|
||||
<section class="py-4 py-xl-5">
|
||||
<div class="container">
|
||||
<div class="text-white bg-primary border rounded border-0 border-primary d-flex flex-column justify-content-between align-items-center align-items-sm-center align-items-md-center flex-lg-row justify-content-lg-center justify-content-xl-center justify-content-xxl-center p-4 p-md-5" style="background: linear-gradient(-95deg, #1a9fff, #946beb);">
|
||||
<div class="pb-2 pb-lg-1">
|
||||
<h2 class="fw-bold mb-2" style="color: rgb(255,255,255);text-align: center;">Always evolving & Improving </h2>
|
||||
<p class="mb-0" style="color: rgb(255,255,255);text-align: center;">The RetroDECK Team always have several things in the works, what follows is just a tiny selection. To stay up to date on latest RetroDECK news check the the Wiki and join the Discord.</p>
|
||||
</div>
|
||||
<div class="my-2"><a class="btn btn-light fs-5 py-2 px-4" role="button" href="https://retrodeck.readthedocs.io/en/latest/wiki_development/what-are-you-working.on/" target="_blank">News</a></div>
|
||||
</div>
|
||||
</div>
|
||||
</section><!-- End: Banner Color -->
|
||||
<section id="pl-features" class="features-clean">
|
||||
<div class="container">
|
||||
<!-- Start: Intro -->
|
||||
<div class="intro">
|
||||
<h2 class="text-center" style="background: linear-gradient(-95deg, #1a9fff, #946beb);-webkit-background-clip: text;-webkit-text-fill-color: transparent;">Planned / In-progress Features </h2>
|
||||
</div><!-- End: Intro -->
|
||||
<!-- Start: Features -->
|
||||
<div class="row justify-content-center features">
|
||||
<div class="col-sm-6 col-lg-4 item"><i class="fas fa-wifi icon" style="background: linear-gradient(-95deg, #1a9fff, #946beb);-webkit-background-clip: text;-webkit-text-fill-color: transparent;"></i>
|
||||
<h3 class="name">online gaming <br></h3>
|
||||
<p class="description">Tools to make it easier to play with your friends online. <br></p>
|
||||
</div>
|
||||
<div class="col-sm-6 col-lg-4 item"><i class="fas fa-cloud-download-alt icon" style="background: linear-gradient(-95deg, #1a9fff, #946beb);-webkit-background-clip: text;-webkit-text-fill-color: transparent;"></i>
|
||||
<h3 class="name"><strong>cloud saves and backup </strong></h3>
|
||||
<p class="description">RetroDECK will backup your progression and sync it across multiple devices. <br></p>
|
||||
</div>
|
||||
<div class="col-sm-6 col-lg-4 item"><i class="fas fa-users icon" style="background: linear-gradient(-95deg, #1a9fff, #946beb);-webkit-background-clip: text;-webkit-text-fill-color: transparent;"></i>
|
||||
<h3 class="name"><strong>Multi-User System</strong></h3>
|
||||
<p class="description">Use local RetroDECK users or bind Steam Deck users to your own saves and emulator configurations. <br></p>
|
||||
</div>
|
||||
<div class="col-sm-6 col-lg-4 item"><i class="fas fa-wrench icon" style="background: linear-gradient(-95deg, #1a9fff, #946beb);-webkit-background-clip: text;-webkit-text-fill-color: transparent;"></i>
|
||||
<h3 class="name"><strong>Configurator Godot Edition</strong></h3>
|
||||
<p class="description">The new controller friendly configurator with even more advanced tools. <br></p>
|
||||
</div>
|
||||
<div class="col-sm-6 col-lg-4 item"><i class="fas fa-flask icon" style="background: linear-gradient(-95deg, #1a9fff, #946beb);-webkit-background-clip: text;-webkit-text-fill-color: transparent;"></i>
|
||||
<h3 class="name"><strong>Add seperate games to Steam</strong></h3>
|
||||
<p class="description">Tools for adding all your favorite games as seperate entries in Steam with the click of a button. <br></p>
|
||||
</div>
|
||||
<div class="col-sm-6 col-lg-4 item"><i class="fas fa-dice icon" style="background: linear-gradient(-95deg, #1a9fff, #946beb);-webkit-background-clip: text;-webkit-text-fill-color: transparent;"></i>
|
||||
<h3 class="name"><strong>More Content</strong></h3>
|
||||
<p class="description">RetroDECK will support even more Emulators / Game Engines / Tools and Systems. <br></p>
|
||||
</div>
|
||||
</div><!-- End: Features -->
|
||||
</div>
|
||||
</section><!-- End: Features Clean -->
|
||||
<!-- Start: Banner Color -->
|
||||
<section class="py-4 py-xl-5">
|
||||
<div class="container">
|
||||
<div class="text-white bg-primary border rounded border-0 border-primary d-flex flex-column justify-content-between flex-lg-row p-4 p-md-5" style="background: linear-gradient(-95deg, #1a9fff, #946beb);">
|
||||
<div class="pb-2 pb-lg-1">
|
||||
<h2 class="fw-bold mb-2" style="color: rgb(255,255,255);">Support us oN patreon!</h2>
|
||||
<p class="mb-0" style="color: rgb(255,255,255);">Help us keep our servers running by donating to our Patreon!</p>
|
||||
<h2 class="fw-bold mb-2" style="color: rgb(255,255,255);">Support RetroDECK or the software we use </h2>
|
||||
<p class="mb-0" style="color: rgb(255,255,255);">Help us keep the game preservation ecosystem alive and healthy.</p>
|
||||
</div>
|
||||
<div class="my-2"><a class="btn btn-light fs-5 py-2 px-4" role="button" href="https://www.patreon.com/RetroDECK" target="_blank">donate</a></div>
|
||||
<div class="my-2"><a class="btn btn-light fs-5 py-2 px-4" role="button" href="https://retrodeck.readthedocs.io/en/latest/wiki_about/donations-licenses/" target="_blank">donate</a></div>
|
||||
</div>
|
||||
</div>
|
||||
</section><!-- End: Banner Color -->
|
||||
|
@ -161,7 +217,7 @@
|
|||
<!-- Start: Social Icons -->
|
||||
<div class="social"><a href="https://discord.gg/tbmBpJbpur" target="_blank"><i class="fab fa-discord"></i></a><a href="https://github.com/XargonWan/RetroDECK" target="_blank"><i class="icon ion-social-github"></i></a></div><!-- End: Social Icons -->
|
||||
<!-- Start: Copyright -->
|
||||
<p class="copyright">Made with <i class="fa fa-heart"></i> by gabeee_boii#5232</p><!-- End: Copyright -->
|
||||
<p class="copyright">Made with <i class="fa fa-heart"></i> by gabeee_boii#5232 and RetroDECK Team</p><!-- End: Copyright -->
|
||||
</footer><!-- End: Footer Basic -->
|
||||
<script src="assets/bootstrap/js/bootstrap.min.js"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/baguettebox.js/1.11.1/baguetteBox.min.js"></script>
|
||||
|
@ -171,4 +227,4 @@
|
|||
<script src="assets/js/Simple-Slider.js"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
</html>
|
||||
|
|
Before Width: | Height: | Size: 36 KiB |
Before Width: | Height: | Size: 44 KiB |
Before Width: | Height: | Size: 45 KiB |
Before Width: | Height: | Size: 46 KiB |
Before Width: | Height: | Size: 50 KiB |
Before Width: | Height: | Size: 48 KiB |
Before Width: | Height: | Size: 57 KiB |
Before Width: | Height: | Size: 58 KiB |
Before Width: | Height: | Size: 42 KiB |
Before Width: | Height: | Size: 46 KiB |
Before Width: | Height: | Size: 48 KiB |
Before Width: | Height: | Size: 41 KiB |
Before Width: | Height: | Size: 36 KiB |
|
@ -44,7 +44,7 @@ Bios=RETRODECKHOMEDIR/roms/bios
|
|||
Snapshots=RETRODECKHOMEDIR/screenshots
|
||||
Savestates=RETRODECKHOMEDIR/states/ps2/pcsx2
|
||||
MemoryCards=RETRODECKHOMEDIR/saves/ps2/memcards
|
||||
Logs=RETRODECKHOMEDIR/.logs
|
||||
Logs=RETRODECKHOMEDIR/logs
|
||||
Langs=/app/share/PCSX2/resources/locale
|
||||
Cheats=/var/config/PCSX2/cheats
|
||||
CheatsWS=/var/config/PCSX2/cheats_ws
|
||||
|
|
|
@ -239,8 +239,8 @@ filter_mode=true
|
|||
filter_mode\default=true
|
||||
large_screen_proportion=@Variant(\0\0\0\x87@\x80\0\0)
|
||||
large_screen_proportion\default=true
|
||||
layout_option=5
|
||||
layout_option\default=false
|
||||
layout_option=0
|
||||
layout_option\default=true
|
||||
mono_render_option=0
|
||||
mono_render_option\default=true
|
||||
pp_shader_name=none (builtin)
|
||||
|
|
|
@ -1,20 +1,20 @@
|
|||
"controller_mappings"
|
||||
{
|
||||
"version" "3"
|
||||
"revision" "72"
|
||||
"title" "RetroDECK: Official Layout - Switch Pro"
|
||||
"description" "RetroDECK: Switch Pro"
|
||||
"revision" "83"
|
||||
"title" "RetroDECK: Switch Pro v.1b"
|
||||
"description" "RetroDECK: Switch - Pro Controller - v.1b"
|
||||
"creator" ""
|
||||
"progenitor" ""
|
||||
"url" ""
|
||||
"export_type" ""
|
||||
"controller_type" "controller_switch_pro"
|
||||
"controller_caps" "68699135"
|
||||
"controller_caps" "77087743"
|
||||
"major_revision" "0"
|
||||
"minor_revision" "0"
|
||||
"Timestamp" "-643537072"
|
||||
"Timestamp" "-936017792"
|
||||
"actions"
|
||||
{
|
||||
{
|
||||
"Default"
|
||||
{
|
||||
"title" "RetroDECK - Set"
|
||||
|
@ -488,8 +488,8 @@
|
|||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press LEFT_CONTROL, Pause / Resume, , "
|
||||
"binding" "key_press P, Pause / Resume, , "
|
||||
"binding" "key_press LEFT_CONTROL, Take Screenshot, , "
|
||||
"binding" "key_press X, Take Screenshot, , "
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -505,8 +505,8 @@
|
|||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press LEFT_CONTROL, Take Screenshot, , "
|
||||
"binding" "key_press X, Take Screenshot, , "
|
||||
"binding" "key_press LEFT_CONTROL, Pause / Resume, , "
|
||||
"binding" "key_press P, Pause / Resume, , "
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -522,8 +522,8 @@
|
|||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press LEFT_CONTROL, Fullscreen Toggle, , "
|
||||
"binding" "key_press RETURN, Fullscreen Toggle, , "
|
||||
"binding" "key_press LEFT_CONTROL, Open Menu, , "
|
||||
"binding" "key_press M, Open Menu, , "
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -539,8 +539,8 @@
|
|||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press LEFT_CONTROL, Open Menu, , "
|
||||
"binding" "key_press M, Open Menu, , "
|
||||
"binding" "key_press LEFT_CONTROL, Fullscreen Toggle, , "
|
||||
"binding" "key_press RETURN, Fullscreen Toggle, , "
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -809,7 +809,7 @@
|
|||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press ESCAPE, Escape, , "
|
||||
"binding" "controller_action SHOW_KEYBOARD, Show Keyboard, , "
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -833,6 +833,22 @@
|
|||
{
|
||||
}
|
||||
}
|
||||
"dpad_west"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
"Full_Press"
|
||||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press ESCAPE, Escape, , "
|
||||
}
|
||||
}
|
||||
}
|
||||
"disabled_activators"
|
||||
{
|
||||
}
|
||||
}
|
||||
"click"
|
||||
{
|
||||
"activators"
|
||||
|
@ -871,7 +887,7 @@
|
|||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "mouse_button LEFT, , "
|
||||
"binding" "mouse_button LEFT, Left Click, , "
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -886,6 +902,426 @@
|
|||
}
|
||||
}
|
||||
"group"
|
||||
{
|
||||
"id" "22"
|
||||
"mode" "radial_menu"
|
||||
"name" "Global Radial"
|
||||
"description" ""
|
||||
"inputs"
|
||||
{
|
||||
"touch_menu_button_0"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
"Full_Press"
|
||||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "mouse_button RIGHT, RetroDECK, RD-icon_circle_2_180x180.png, "
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"haptic_intensity" "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
"disabled_activators"
|
||||
{
|
||||
}
|
||||
}
|
||||
"touch_menu_button_1"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
"Full_Press"
|
||||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press ESCAPE, Escape, RD-ESC.png, "
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"haptic_intensity" "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
"disabled_activators"
|
||||
{
|
||||
}
|
||||
}
|
||||
"touch_menu_button_2"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
"Full_Press"
|
||||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press RETURN, Enter, RD-Enter.png, "
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"haptic_intensity" "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
"disabled_activators"
|
||||
{
|
||||
}
|
||||
}
|
||||
"touch_menu_button_3"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
"Full_Press"
|
||||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press TAB, Tab, RD-Tab.png, "
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"haptic_intensity" "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
"disabled_activators"
|
||||
{
|
||||
}
|
||||
}
|
||||
"touch_menu_button_4"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
"Full_Press"
|
||||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press LEFT_CONTROL, Control, RD-ctrl.png, "
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"haptic_intensity" "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
"disabled_activators"
|
||||
{
|
||||
}
|
||||
}
|
||||
"touch_menu_button_5"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
"Full_Press"
|
||||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press SPACE, Space, RD-space.png, "
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"haptic_intensity" "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
"disabled_activators"
|
||||
{
|
||||
}
|
||||
}
|
||||
"touch_menu_button_6"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
"Full_Press"
|
||||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press FORWARD_SLASH, /, RD-frontslash.png, "
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"haptic_intensity" "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
"disabled_activators"
|
||||
{
|
||||
}
|
||||
}
|
||||
"touch_menu_button_7"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
"Full_Press"
|
||||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press LEFT_ALT, Alt, RD-alt.png, "
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"haptic_intensity" "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
"disabled_activators"
|
||||
{
|
||||
}
|
||||
}
|
||||
"touch_menu_button_8"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
"Full_Press"
|
||||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press F1, F1, RD-F1.png, "
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"haptic_intensity" "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
"disabled_activators"
|
||||
{
|
||||
}
|
||||
}
|
||||
"touch_menu_button_9"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
"Full_Press"
|
||||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press F4, F4, RD-F4.png, "
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"haptic_intensity" "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
"disabled_activators"
|
||||
{
|
||||
}
|
||||
}
|
||||
"touch_menu_button_10"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
"Full_Press"
|
||||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press F5, F5, RD-F5.png, "
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"haptic_intensity" "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
"disabled_activators"
|
||||
{
|
||||
}
|
||||
}
|
||||
"touch_menu_button_11"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
"Full_Press"
|
||||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press F7, F7, RD-F7.png, "
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"haptic_intensity" "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
"disabled_activators"
|
||||
{
|
||||
}
|
||||
}
|
||||
"touch_menu_button_12"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
"Full_Press"
|
||||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press F8, F8, RD-F8.png, "
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"haptic_intensity" "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
"disabled_activators"
|
||||
{
|
||||
}
|
||||
}
|
||||
"touch_menu_button_13"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
"Full_Press"
|
||||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press F10, F10, RD-F10.png, "
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"haptic_intensity" "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
"disabled_activators"
|
||||
{
|
||||
}
|
||||
}
|
||||
"touch_menu_button_14"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
"Full_Press"
|
||||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press LEFT_CONTROL, Restart / Reset, RD-system-reboot.png, "
|
||||
"binding" "key_press R, Restart / Reset, RD-system-reboot.png, "
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"haptic_intensity" "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
"disabled_activators"
|
||||
{
|
||||
}
|
||||
}
|
||||
"touch_menu_button_15"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
"Full_Press"
|
||||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press LEFT_ALT, Wii Sync Button, RD-notification-network-wireless.png, "
|
||||
"binding" "key_press W, Wii Sync Button, RD-notification-network-wireless.png, "
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"haptic_intensity" "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
"disabled_activators"
|
||||
{
|
||||
}
|
||||
}
|
||||
"touch_menu_button_16"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
"Full_Press"
|
||||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press LEFT_CONTROL, Swap Dual - Screens, RD-system-switch-user.png, "
|
||||
"binding" "key_press TAB, Swap Dual - Screens, RD-system-switch-user.png, "
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"haptic_intensity" "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
"disabled_activators"
|
||||
{
|
||||
}
|
||||
}
|
||||
"touch_menu_button_17"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
"Full_Press"
|
||||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press LEFT_CONTROL, Change Dual Screen - Layout, RD-preferences-system-windows-actions.png, "
|
||||
"binding" "key_press L, Change Dual Screen - Layout, RD-preferences-system-windows-actions.png, "
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"haptic_intensity" "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
"disabled_activators"
|
||||
{
|
||||
}
|
||||
}
|
||||
"touch_menu_button_18"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
"Full_Press"
|
||||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press LEFT_CONTROL, Widescreen / Aspect Ratio, RD-preferences-desktop-display.png, "
|
||||
"binding" "key_press W, Widescreen / Aspect Ratio, RD-preferences-desktop-display.png, "
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"haptic_intensity" "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
"disabled_activators"
|
||||
{
|
||||
}
|
||||
}
|
||||
"touch_menu_button_19"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
"Full_Press"
|
||||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press LEFT_CONTROL, Swap Disc, RD-application-x-iso.png, "
|
||||
"binding" "key_press D, Swap Disc, RD-application-x-iso.png, "
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"haptic_intensity" "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
"disabled_activators"
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"touchmenu_button_fire_type" "0"
|
||||
}
|
||||
}
|
||||
"group"
|
||||
{
|
||||
"id" "7"
|
||||
"mode" "switches"
|
||||
|
@ -918,7 +1354,7 @@
|
|||
"bindings"
|
||||
{
|
||||
"binding" "xinput_button SELECT, , "
|
||||
"binding" "controller_action CHANGE_PRESET 2 0 1, , "
|
||||
"binding" "controller_action CHANGE_PRESET 2 0 0, , "
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1041,7 +1477,7 @@
|
|||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "controller_action CHANGE_PRESET 1 0 1, , "
|
||||
"binding" "controller_action CHANGE_PRESET 1 0 0, , "
|
||||
}
|
||||
}
|
||||
"Full_Press"
|
||||
|
@ -1140,6 +1576,40 @@
|
|||
}
|
||||
}
|
||||
}
|
||||
"group"
|
||||
{
|
||||
"id" "24"
|
||||
"mode" "dpad"
|
||||
"name" ""
|
||||
"description" ""
|
||||
"inputs"
|
||||
{
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"requires_click" "0"
|
||||
}
|
||||
"gameactions"
|
||||
{
|
||||
}
|
||||
}
|
||||
"group"
|
||||
{
|
||||
"id" "25"
|
||||
"mode" "dpad"
|
||||
"name" ""
|
||||
"description" ""
|
||||
"inputs"
|
||||
{
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"requires_click" "0"
|
||||
}
|
||||
"gameactions"
|
||||
{
|
||||
}
|
||||
}
|
||||
"preset"
|
||||
{
|
||||
"id" "0"
|
||||
|
@ -1153,6 +1623,7 @@
|
|||
"5" "right_trigger active"
|
||||
"8" "right_joystick active"
|
||||
"9" "dpad active"
|
||||
"24" "gyro active"
|
||||
}
|
||||
}
|
||||
"preset"
|
||||
|
@ -1164,12 +1635,14 @@
|
|||
"11" "switch active"
|
||||
"12" "button_diamond active"
|
||||
"13" "joystick inactive"
|
||||
"19" "joystick active"
|
||||
"19" "joystick inactive"
|
||||
"22" "joystick active"
|
||||
"14" "left_trigger active"
|
||||
"15" "right_trigger active"
|
||||
"16" "right_joystick inactive"
|
||||
"20" "right_joystick active"
|
||||
"17" "dpad active"
|
||||
"25" "gyro active"
|
||||
}
|
||||
}
|
||||
"settings"
|
452
emu-configs/defaults/retrodeck/controller_configs/RetroDECK_controller_xbox360.vdf
Normal file → Executable file
|
@ -2,8 +2,8 @@
|
|||
{
|
||||
"version" "3"
|
||||
"revision" "84"
|
||||
"title" "RetroDECK: Official Layout - Xbox 360"
|
||||
"description" "RetroDECK: Xbox 360"
|
||||
"title" "RetroDECK: Xbox 360 v.1b"
|
||||
"description" "RetroDECK: Xbox 360 - v.1b"
|
||||
"creator" ""
|
||||
"progenitor" ""
|
||||
"url" ""
|
||||
|
@ -796,8 +796,6 @@
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
"disabled_activators"
|
||||
{
|
||||
}
|
||||
|
@ -841,7 +839,7 @@
|
|||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press ESCAPE, Escape, , "
|
||||
"binding" "controller_action SHOW_KEYBOARD, Show Keyboard, , "
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -865,6 +863,22 @@
|
|||
{
|
||||
}
|
||||
}
|
||||
"dpad_west"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
"Full_Press"
|
||||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press ESCAPE, Escape, , "
|
||||
}
|
||||
}
|
||||
}
|
||||
"disabled_activators"
|
||||
{
|
||||
}
|
||||
}
|
||||
"click"
|
||||
{
|
||||
"activators"
|
||||
|
@ -920,7 +934,7 @@
|
|||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "controller_action CHANGE_PRESET 1 0 1, RetroDECK - Set, , "
|
||||
"binding" "controller_action CHANGE_PRESET 1 0 0, RetroDECK - Set, , "
|
||||
}
|
||||
}
|
||||
"Full_Press"
|
||||
|
@ -1042,7 +1056,7 @@
|
|||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "controller_action CHANGE_PRESET 2 0 1, , "
|
||||
"binding" "controller_action CHANGE_PRESET 2 0 0, , "
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1116,6 +1130,426 @@
|
|||
}
|
||||
}
|
||||
}
|
||||
"group"
|
||||
{
|
||||
"id" "19"
|
||||
"mode" "radial_menu"
|
||||
"name" "dial"
|
||||
"description" ""
|
||||
"inputs"
|
||||
{
|
||||
"touch_menu_button_0"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
"Full_Press"
|
||||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "mouse_button RIGHT, RetroDECK, RD-icon_circle_2_180x180.png, "
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"haptic_intensity" "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
"disabled_activators"
|
||||
{
|
||||
}
|
||||
}
|
||||
"touch_menu_button_1"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
"Full_Press"
|
||||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press ESCAPE, Escape, RD-ESC.png, "
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"haptic_intensity" "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
"disabled_activators"
|
||||
{
|
||||
}
|
||||
}
|
||||
"touch_menu_button_2"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
"Full_Press"
|
||||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press RETURN, Enter, RD-Enter.png, "
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"haptic_intensity" "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
"disabled_activators"
|
||||
{
|
||||
}
|
||||
}
|
||||
"touch_menu_button_3"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
"Full_Press"
|
||||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press TAB, Tab, RD-Tab.png, "
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"haptic_intensity" "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
"disabled_activators"
|
||||
{
|
||||
}
|
||||
}
|
||||
"touch_menu_button_4"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
"Full_Press"
|
||||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press LEFT_CONTROL, Control, RD-ctrl.png, "
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"haptic_intensity" "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
"disabled_activators"
|
||||
{
|
||||
}
|
||||
}
|
||||
"touch_menu_button_5"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
"Full_Press"
|
||||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press SPACE, Space, RD-space.png, "
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"haptic_intensity" "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
"disabled_activators"
|
||||
{
|
||||
}
|
||||
}
|
||||
"touch_menu_button_6"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
"Full_Press"
|
||||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press FORWARD_SLASH, /, RD-frontslash.png, "
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"haptic_intensity" "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
"disabled_activators"
|
||||
{
|
||||
}
|
||||
}
|
||||
"touch_menu_button_7"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
"Full_Press"
|
||||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press LEFT_ALT, Alt, RD-alt.png, "
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"haptic_intensity" "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
"disabled_activators"
|
||||
{
|
||||
}
|
||||
}
|
||||
"touch_menu_button_8"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
"Full_Press"
|
||||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press F1, F1, RD-F1.png, "
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"haptic_intensity" "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
"disabled_activators"
|
||||
{
|
||||
}
|
||||
}
|
||||
"touch_menu_button_9"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
"Full_Press"
|
||||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press F4, F4, RD-F4.png, "
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"haptic_intensity" "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
"disabled_activators"
|
||||
{
|
||||
}
|
||||
}
|
||||
"touch_menu_button_10"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
"Full_Press"
|
||||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press F5, F5, RD-F5.png, "
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"haptic_intensity" "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
"disabled_activators"
|
||||
{
|
||||
}
|
||||
}
|
||||
"touch_menu_button_11"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
"Full_Press"
|
||||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press F7, F7, RD-F7.png, "
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"haptic_intensity" "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
"disabled_activators"
|
||||
{
|
||||
}
|
||||
}
|
||||
"touch_menu_button_12"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
"Full_Press"
|
||||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press F8, F8, RD-F8.png, "
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"haptic_intensity" "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
"disabled_activators"
|
||||
{
|
||||
}
|
||||
}
|
||||
"touch_menu_button_13"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
"Full_Press"
|
||||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press F10, F10, RD-F10.png, "
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"haptic_intensity" "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
"disabled_activators"
|
||||
{
|
||||
}
|
||||
}
|
||||
"touch_menu_button_14"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
"Full_Press"
|
||||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press LEFT_CONTROL, Restart / Reset, RD-system-reboot.png, "
|
||||
"binding" "key_press R, Restart / Reset, RD-system-reboot.png, "
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"haptic_intensity" "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
"disabled_activators"
|
||||
{
|
||||
}
|
||||
}
|
||||
"touch_menu_button_15"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
"Full_Press"
|
||||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press LEFT_ALT, Wii Sync Button, RD-notification-network-wireless.png, "
|
||||
"binding" "key_press W, Wii Sync Button, RD-notification-network-wireless.png, "
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"haptic_intensity" "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
"disabled_activators"
|
||||
{
|
||||
}
|
||||
}
|
||||
"touch_menu_button_16"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
"Full_Press"
|
||||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press LEFT_CONTROL, Swap Dual - Screens, RD-system-switch-user.png, "
|
||||
"binding" "key_press TAB, Swap Dual - Screens, RD-system-switch-user.png, "
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"haptic_intensity" "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
"disabled_activators"
|
||||
{
|
||||
}
|
||||
}
|
||||
"touch_menu_button_17"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
"Full_Press"
|
||||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press LEFT_CONTROL, Change Dual Screen - Layout, RD-preferences-system-windows-actions.png, "
|
||||
"binding" "key_press L, Change Dual Screen - Layout, RD-preferences-system-windows-actions.png, "
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"haptic_intensity" "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
"disabled_activators"
|
||||
{
|
||||
}
|
||||
}
|
||||
"touch_menu_button_18"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
"Full_Press"
|
||||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press LEFT_CONTROL, Widescreen / Aspect Ratio, RD-preferences-desktop-display.png, "
|
||||
"binding" "key_press W, Widescreen / Aspect Ratio, RD-preferences-desktop-display.png, "
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"haptic_intensity" "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
"disabled_activators"
|
||||
{
|
||||
}
|
||||
}
|
||||
"touch_menu_button_19"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
"Full_Press"
|
||||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press LEFT_CONTROL, Swap Disc, RD-application-x-iso.png, "
|
||||
"binding" "key_press D, Swap Disc, RD-application-x-iso.png, "
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"haptic_intensity" "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
"disabled_activators"
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"touchmenu_button_fire_type" "0"
|
||||
}
|
||||
}
|
||||
"preset"
|
||||
{
|
||||
"id" "0"
|
||||
|
@ -1140,7 +1574,8 @@
|
|||
"10" "switch active"
|
||||
"11" "button_diamond active"
|
||||
"12" "joystick inactive"
|
||||
"18" "joystick active"
|
||||
"18" "joystick inactive"
|
||||
"19" "joystick active"
|
||||
"13" "left_trigger active"
|
||||
"14" "right_trigger active"
|
||||
"15" "right_joystick inactive"
|
||||
|
@ -1154,3 +1589,4 @@
|
|||
"right_trackpad_mode" "0"
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,18 +1,18 @@
|
|||
"controller_mappings"
|
||||
{
|
||||
"version" "3"
|
||||
"revision" "93"
|
||||
"title" "RetroDECK: Official Layout - Xbox One/S/X"
|
||||
"description" "RetroDECK: Xbox One/S/X"
|
||||
"revision" "101"
|
||||
"title" "RetroDECK: Xbox Wireless v.1b"
|
||||
"description" "RetroDECK: One/S/X - Xbox Wireless v.1b"
|
||||
"creator" ""
|
||||
"progenitor" ""
|
||||
"url" ""
|
||||
"export_type" ""
|
||||
"export_type" "personal_cloud"
|
||||
"controller_type" "controller_xboxone"
|
||||
"controller_caps" "1590271"
|
||||
"controller_caps" "9978879"
|
||||
"major_revision" "0"
|
||||
"minor_revision" "0"
|
||||
"Timestamp" "-5320"
|
||||
"Timestamp" "1079645600"
|
||||
"actions"
|
||||
{
|
||||
"Default"
|
||||
|
@ -828,7 +828,21 @@
|
|||
"description" ""
|
||||
"inputs"
|
||||
{
|
||||
"dpad_north"
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"requires_click" "0"
|
||||
}
|
||||
}
|
||||
"group"
|
||||
{
|
||||
"id" "20"
|
||||
"mode" "radial_menu"
|
||||
"name" "Global Radial"
|
||||
"description" ""
|
||||
"inputs"
|
||||
{
|
||||
"touch_menu_button_0"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
|
@ -836,8 +850,11 @@
|
|||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press LEFT_CONTROL, Swap Screens, , "
|
||||
"binding" "key_press TAB, Swap Screens, , "
|
||||
"binding" "mouse_button RIGHT, RetroDECK, RD-icon_circle_2_180x180.png, "
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"haptic_intensity" "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -845,7 +862,7 @@
|
|||
{
|
||||
}
|
||||
}
|
||||
"dpad_south"
|
||||
"touch_menu_button_1"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
|
@ -853,7 +870,11 @@
|
|||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press ESCAPE, , "
|
||||
"binding" "key_press ESCAPE, Escape, RD-ESC.png, "
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"haptic_intensity" "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -861,7 +882,7 @@
|
|||
{
|
||||
}
|
||||
}
|
||||
"dpad_east"
|
||||
"touch_menu_button_2"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
|
@ -869,7 +890,11 @@
|
|||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press RETURN, , "
|
||||
"binding" "key_press RETURN, Enter, RD-Enter.png, "
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"haptic_intensity" "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -877,7 +902,7 @@
|
|||
{
|
||||
}
|
||||
}
|
||||
"click"
|
||||
"touch_menu_button_3"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
|
@ -885,7 +910,337 @@
|
|||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "mouse_button RIGHT, , "
|
||||
"binding" "key_press TAB, Tab, RD-Tab.png, "
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"haptic_intensity" "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
"disabled_activators"
|
||||
{
|
||||
}
|
||||
}
|
||||
"touch_menu_button_4"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
"Full_Press"
|
||||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press LEFT_CONTROL, Control, RD-ctrl.png, "
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"haptic_intensity" "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
"disabled_activators"
|
||||
{
|
||||
}
|
||||
}
|
||||
"touch_menu_button_5"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
"Full_Press"
|
||||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press SPACE, Space, RD-space.png, "
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"haptic_intensity" "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
"disabled_activators"
|
||||
{
|
||||
}
|
||||
}
|
||||
"touch_menu_button_6"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
"Full_Press"
|
||||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press FORWARD_SLASH, /, RD-frontslash.png, "
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"haptic_intensity" "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
"disabled_activators"
|
||||
{
|
||||
}
|
||||
}
|
||||
"touch_menu_button_7"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
"Full_Press"
|
||||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press LEFT_ALT, Alt, RD-alt.png, "
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"haptic_intensity" "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
"disabled_activators"
|
||||
{
|
||||
}
|
||||
}
|
||||
"touch_menu_button_8"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
"Full_Press"
|
||||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press F1, F1, RD-F1.png, "
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"haptic_intensity" "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
"disabled_activators"
|
||||
{
|
||||
}
|
||||
}
|
||||
"touch_menu_button_9"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
"Full_Press"
|
||||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press F4, F4, RD-F4.png, "
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"haptic_intensity" "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
"disabled_activators"
|
||||
{
|
||||
}
|
||||
}
|
||||
"touch_menu_button_10"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
"Full_Press"
|
||||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press F5, F5, RD-F5.png, "
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"haptic_intensity" "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
"disabled_activators"
|
||||
{
|
||||
}
|
||||
}
|
||||
"touch_menu_button_11"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
"Full_Press"
|
||||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press F7, F7, RD-F7.png, "
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"haptic_intensity" "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
"disabled_activators"
|
||||
{
|
||||
}
|
||||
}
|
||||
"touch_menu_button_12"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
"Full_Press"
|
||||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press F8, F8, RD-F8.png, "
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"haptic_intensity" "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
"disabled_activators"
|
||||
{
|
||||
}
|
||||
}
|
||||
"touch_menu_button_13"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
"Full_Press"
|
||||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press F10, F10, RD-F10.png, "
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"haptic_intensity" "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
"disabled_activators"
|
||||
{
|
||||
}
|
||||
}
|
||||
"touch_menu_button_14"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
"Full_Press"
|
||||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press LEFT_CONTROL, Restart / Reset, RD-system-reboot.png, "
|
||||
"binding" "key_press R, Restart / Reset, RD-system-reboot.png, "
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"haptic_intensity" "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
"disabled_activators"
|
||||
{
|
||||
}
|
||||
}
|
||||
"touch_menu_button_15"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
"Full_Press"
|
||||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press LEFT_ALT, Wii Sync Button, RD-notification-network-wireless.png, "
|
||||
"binding" "key_press W, Wii Sync Button, RD-notification-network-wireless.png, "
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"haptic_intensity" "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
"disabled_activators"
|
||||
{
|
||||
}
|
||||
}
|
||||
"touch_menu_button_16"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
"Full_Press"
|
||||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press LEFT_CONTROL, Swap Dual - Screens, RD-system-switch-user.png, "
|
||||
"binding" "key_press TAB, Swap Dual - Screens, RD-system-switch-user.png, "
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"haptic_intensity" "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
"disabled_activators"
|
||||
{
|
||||
}
|
||||
}
|
||||
"touch_menu_button_17"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
"Full_Press"
|
||||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press LEFT_CONTROL, Change Dual Screen - Layout, RD-preferences-system-windows-actions.png, "
|
||||
"binding" "key_press L, Change Dual Screen - Layout, RD-preferences-system-windows-actions.png, "
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"haptic_intensity" "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
"disabled_activators"
|
||||
{
|
||||
}
|
||||
}
|
||||
"touch_menu_button_18"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
"Full_Press"
|
||||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press LEFT_CONTROL, Widescreen / Aspect Ratio, RD-preferences-desktop-display.png, "
|
||||
"binding" "key_press W, Widescreen / Aspect Ratio, RD-preferences-desktop-display.png, "
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"haptic_intensity" "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
"disabled_activators"
|
||||
{
|
||||
}
|
||||
}
|
||||
"touch_menu_button_19"
|
||||
{
|
||||
"activators"
|
||||
{
|
||||
"Full_Press"
|
||||
{
|
||||
"bindings"
|
||||
{
|
||||
"binding" "key_press LEFT_CONTROL, Swap Disc, RD-application-x-iso.png, "
|
||||
"binding" "key_press D, Swap Disc, RD-application-x-iso.png, "
|
||||
}
|
||||
"settings"
|
||||
{
|
||||
"haptic_intensity" "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -896,7 +1251,7 @@
|
|||
}
|
||||
"settings"
|
||||
{
|
||||
"requires_click" "0"
|
||||
"touchmenu_button_fire_type" "0"
|
||||
}
|
||||
}
|
||||
"group"
|
||||
|
@ -1096,7 +1451,7 @@
|
|||
"binding" "controller_action CHANGE_PRESET 1 0 1, , "
|
||||
}
|
||||
}
|
||||
"release"
|
||||
"Full_Press"
|
||||
{
|
||||
"bindings"
|
||||
{
|
||||
|
@ -1248,7 +1603,8 @@
|
|||
"10" "switch active"
|
||||
"11" "button_diamond active"
|
||||
"12" "joystick inactive"
|
||||
"19" "joystick active"
|
||||
"19" "joystick inactive"
|
||||
"20" "joystick active"
|
||||
"13" "left_trigger active"
|
||||
"14" "right_trigger active"
|
||||
"15" "right_joystick inactive"
|
||||
|
|
|
@ -1,9 +1,7 @@
|
|||
config_file_format^citra
|
||||
target_file^$citraconf
|
||||
defaults_file^$emuconfigs/citra/qt-config.ini
|
||||
change^ask_to_exit^confirmClose^true^UI
|
||||
change^ask_to_exit^confirmClose\default^true^UI
|
||||
change^nintendo_button_layout^profiles\1\button_a^button:1,engine:sdl,guid:030079f6de280000ff11000001000000,port:0^Controls
|
||||
change^nintendo_button_layout^profiles\1\button_b^button:0,engine:sdl,guid:030079f6de280000ff11000001000000,port:0^Controls
|
||||
change^nintendo_button_layout^profiles\1\button_x^button:3,engine:sdl,guid:030079f6de280000ff11000001000000,port:0^Controls
|
||||
change^nintendo_button_layout^profiles\1\button_y^button:2,engine:sdl,guid:030079f6de280000ff11000001000000,port:0^Controls
|
||||
change^ask_to_exit^confirmClose^true^UI^$citraconf^$emuconfigs/citra/qt-config.ini
|
||||
change^ask_to_exit^confirmClose\default^true^UI^$citraconf^$emuconfigs/citra/qt-config.ini
|
||||
change^abxy_button_swap^profiles\1\button_a^button:1,engine:sdl,guid:030079f6de280000ff11000001000000,port:0^Controls^$citraconf^$emuconfigs/citra/qt-config.ini
|
||||
change^abxy_button_swap^profiles\1\button_b^button:0,engine:sdl,guid:030079f6de280000ff11000001000000,port:0^Controls^$citraconf^$emuconfigs/citra/qt-config.ini
|
||||
change^abxy_button_swap^profiles\1\button_x^button:3,engine:sdl,guid:030079f6de280000ff11000001000000,port:0^Controls^$citraconf^$emuconfigs/citra/qt-config.ini
|
||||
change^abxy_button_swap^profiles\1\button_y^button:2,engine:sdl,guid:030079f6de280000ff11000001000000,port:0^Controls^$citraconf^$emuconfigs/citra/qt-config.ini
|
||||
|
|
|
@ -1,4 +1,2 @@
|
|||
config_file_format^dolphin
|
||||
target_file^$dolphinconf
|
||||
defaults_file^$emuconfigs/dolphin/Dolphin.ini
|
||||
change^ask_to_exit^ConfirmStop^True^Interface
|
||||
change^ask_to_exit^ConfirmStop^True^Interface^$dolphinconf^$emuconfigs/dolphin/Dolphin.ini
|
||||
|
|
|
@ -1,10 +1,8 @@
|
|||
config_file_format^duckstation
|
||||
target_file^$duckstationconf
|
||||
defaults_file^$emuconfigs/duckstation/settings.ini
|
||||
change^cheevos^Enabled^true^Cheevos
|
||||
change^cheevos^Username^$cheevos_username^Cheevos
|
||||
change^cheevos^Token^$cheevos_token^Cheevos
|
||||
change^cheevos^LoginTimestamp^$cheevos_login_timestamp^Cheevos
|
||||
change^cheevos_hardcore^ChallengeMode^true^Cheevos
|
||||
change^savestate_auto_save^SaveStateOnExit^true^Main
|
||||
change^ask_to_exit^ConfirmPowerOff^true^Main
|
||||
change^cheevos^Enabled^true^Cheevos^$duckstationconf^$emuconfigs/duckstation/settings.ini
|
||||
change^cheevos^Username^$cheevos_username^Cheevos^$duckstationconf^$emuconfigs/duckstation/settings.ini
|
||||
change^cheevos^Token^$cheevos_token^Cheevos^$duckstationconf^$emuconfigs/duckstation/settings.ini
|
||||
change^cheevos^LoginTimestamp^$cheevos_login_timestamp^Cheevos^$duckstationconf^$emuconfigs/duckstation/settings.ini
|
||||
change^cheevos_hardcore^ChallengeMode^true^Cheevos^$duckstationconf^$emuconfigs/duckstation/settings.ini
|
||||
change^savestate_auto_save^SaveStateOnExit^true^Main^$duckstationconf^$emuconfigs/duckstation/settings.ini
|
||||
change^ask_to_exit^ConfirmPowerOff^true^Main^$duckstationconf^$emuconfigs/duckstation/settings.ini
|
||||
|
|
|
@ -1,9 +1,7 @@
|
|||
config_file_format^retroarch # This is the config file format, used in functions like get_setting_value and set_setting_value
|
||||
target_file^$examplefile # This is the target file that should be updated. This will be the actively-used config file by whatever emulator is being set up. This can be a variable name as well!
|
||||
defaults_file^$emuconfigs/retroarch/retroarch.cfg # This is the file that is referenced when presets are disabled. This should be the "shipped" config file for this emulator
|
||||
change^cheevos^Enabled^true^Cheevos # This is a preset configuration line. The syntax is <action>^<preset name (as defined in retrodeck.cfg)>^<setting name>^<setting value when enabled>^<setting section in emulator config file, if there is one>
|
||||
change^borders^overlay_file^/var/config/retroarch/overlays/borders/snes.cfg # This is another preset configuration line, for the preset section called "borders" in retrodeck.cfg. Also, there is no defined "setting section" on this line
|
||||
|
||||
change^cheevos^Enabled^true^Cheevos^$target_file^$defaults_file # This is a preset configuration line. The syntax is <action>^<preset name (as defined in retrodeck.cfg)>^<setting name>^<setting value when enabled>^<setting section in emulator config file, if there is one>^<target file to be changed?^<defaults file for disabling the preset>
|
||||
change^borders^overlay_file^/var/config/retroarch/overlays/borders/snes.cfg^^target_file^defaults_file # This is another preset configuration line, for the preset section called "borders" in retrodeck.cfg. Also, there is no defined "setting section" on this line, but there must be an empty field between ^^
|
||||
enable^abxy_button_swap^/var/config/retroarch/config/remaps/Snes9x/snes.rmp # This will remove the ".disabled" suffix from the target file, or add ".disabled" to the suffix of the target file if the preset is being disabled
|
||||
|
||||
OTHER NOTES:
|
||||
- The name of the presets configuration file for any given system MUST be <system name>_presets.cfg
|
||||
|
|
|
@ -1,14 +1,12 @@
|
|||
config_file_format^retroarch
|
||||
target_file^/var/config/retroarch/config/Gambatte/gb.cfg
|
||||
defaults_file^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^borders^aspect_ratio_index^23
|
||||
change^borders^custom_viewport_height^576
|
||||
change^borders^custom_viewport_width^640
|
||||
change^borders^custom_viewport_x^320
|
||||
change^borders^custom_viewport_y^20
|
||||
change^borders^input_overlay^/var/config/retroarch/overlays/borders/pegasus/gb.cfg
|
||||
change^borders^input_overlay_aspect_adjust_landscape^0.110000
|
||||
change^borders^input_overlay_enable^true
|
||||
change^borders^input_overlay_scale_landscape^1.205000
|
||||
change^borders^input_overlay_y_offset_landscape^0.005000
|
||||
enable^nintendo_button_layout^/var/config/retroarch/config/remaps/Gambatte/gb.rmp
|
||||
change^borders^aspect_ratio_index^23^^/var/config/retroarch/config/Gambatte/gb.cfg^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^borders^custom_viewport_height^576^^/var/config/retroarch/config/Gambatte/gb.cfg^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^borders^custom_viewport_width^640^^/var/config/retroarch/config/Gambatte/gb.cfg^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^borders^custom_viewport_x^320^^/var/config/retroarch/config/Gambatte/gb.cfg^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^borders^custom_viewport_y^20^^/var/config/retroarch/config/Gambatte/gb.cfg^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^borders^input_overlay^/var/config/retroarch/overlays/borders/pegasus/gb.cfg^^/var/config/retroarch/config/Gambatte/gb.cfg^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^borders^input_overlay_aspect_adjust_landscape^0.110000^^/var/config/retroarch/config/Gambatte/gb.cfg^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^borders^input_overlay_enable^true^^/var/config/retroarch/config/Gambatte/gb.cfg^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^borders^input_overlay_scale_landscape^1.205000^^/var/config/retroarch/config/Gambatte/gb.cfg^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^borders^input_overlay_y_offset_landscape^0.005000^^/var/config/retroarch/config/Gambatte/gb.cfg^$emuconfigs/retroarch/retroarch.cfg
|
||||
enable^abxy_button_swap^/var/config/retroarch/config/remaps/Gambatte/gb.rmp
|
||||
|
|
|
@ -1,14 +1,12 @@
|
|||
config_file_format^retroarch
|
||||
target_file^/var/config/retroarch/config/mGBA/gba.cfg
|
||||
defaults_file^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^borders^aspect_ratio_index^23
|
||||
change^borders^custom_viewport_height^640
|
||||
change^borders^custom_viewport_width^960
|
||||
change^borders^custom_viewport_x^160
|
||||
change^borders^custom_viewport_y^0
|
||||
change^borders^input_overlay_enable^true
|
||||
change^borders^input_overlay^/var/config/retroarch/overlays/borders/pegasus/gba.cfg
|
||||
change^borders^input_overlay_aspect_adjust_landscape^0.110000
|
||||
change^borders^input_overlay_scale_landscape^1.2150000
|
||||
change^borders^input_overlay_y_offset_landscape^0.020000
|
||||
enable^nintendo_button_layout^/var/config/retroarch/config/remaps/Gambatte/gbc.rmp
|
||||
change^borders^aspect_ratio_index^23^^/var/config/retroarch/config/mGBA/gba.cfg^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^borders^custom_viewport_height^640^^/var/config/retroarch/config/mGBA/gba.cfg^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^borders^custom_viewport_width^960^^/var/config/retroarch/config/mGBA/gba.cfg^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^borders^custom_viewport_x^160^^/var/config/retroarch/config/mGBA/gba.cfg^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^borders^custom_viewport_y^0^^/var/config/retroarch/config/mGBA/gba.cfg^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^borders^input_overlay_enable^true^^/var/config/retroarch/config/mGBA/gba.cfg^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^borders^input_overlay^/var/config/retroarch/overlays/borders/pegasus/gba.cfg^^/var/config/retroarch/config/mGBA/gba.cfg^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^borders^input_overlay_aspect_adjust_landscape^0.110000^^/var/config/retroarch/config/mGBA/gba.cfg^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^borders^input_overlay_scale_landscape^1.2150000^^/var/config/retroarch/config/mGBA/gba.cfg^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^borders^input_overlay_y_offset_landscape^0.020000^^/var/config/retroarch/config/mGBA/gba.cfg^$emuconfigs/retroarch/retroarch.cfg
|
||||
enable^abxy_button_swap^/var/config/retroarch/config/remaps/Gambatte/gbc.rmp
|
||||
|
|
|
@ -1,14 +1,12 @@
|
|||
config_file_format^retroarch
|
||||
target_file^/var/config/retroarch/config/Gambatte/gbc.cfg
|
||||
defaults_file^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^borders^aspect_ratio_index^23
|
||||
change^borders^custom_viewport_height^576
|
||||
change^borders^custom_viewport_width^640
|
||||
change^borders^custom_viewport_x^320
|
||||
change^borders^custom_viewport_y^20
|
||||
change^borders^input_overlay^/var/config/retroarch/overlays/borders/pegasus/gbc.cfg
|
||||
change^borders^input_overlay_aspect_adjust_landscape^0.110000
|
||||
change^borders^input_overlay_enable^true
|
||||
change^borders^input_overlay_scale_landscape^1.205000
|
||||
change^borders^input_overlay_y_offset_landscape^-0.040000
|
||||
enable^nintendo_button_layout^/var/config/retroarch/config/remaps/Gambatte/gbc.rmp
|
||||
change^borders^aspect_ratio_index^23^^/var/config/retroarch/config/Gambatte/gbc.cfg^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^borders^custom_viewport_height^576^^/var/config/retroarch/config/Gambatte/gbc.cfg^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^borders^custom_viewport_width^640^^/var/config/retroarch/config/Gambatte/gbc.cfg^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^borders^custom_viewport_x^320^^/var/config/retroarch/config/Gambatte/gbc.cfg^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^borders^custom_viewport_y^20^^/var/config/retroarch/config/Gambatte/gbc.cfg^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^borders^input_overlay^/var/config/retroarch/overlays/borders/pegasus/gbc.cfg^^/var/config/retroarch/config/Gambatte/gbc.cfg^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^borders^input_overlay_aspect_adjust_landscape^0.110000^^/var/config/retroarch/config/Gambatte/gbc.cfg^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^borders^input_overlay_enable^true^^/var/config/retroarch/config/Gambatte/gbc.cfg^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^borders^input_overlay_scale_landscape^1.205000^^/var/config/retroarch/config/Gambatte/gbc.cfg^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^borders^input_overlay_y_offset_landscape^-0.040000^^/var/config/retroarch/config/Gambatte/gbc.cfg^$emuconfigs/retroarch/retroarch.cfg
|
||||
enable^abxy_button_swap^/var/config/retroarch/config/remaps/Gambatte/gbc.rmp
|
||||
|
|
|
@ -1,8 +1,6 @@
|
|||
config_file_format^retroarch
|
||||
target_file^/var/config/retroarch/config/Genesis Plus GX/genesis.cfg
|
||||
defaults_file^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^borders^input_overlay^/var/config/retroarch/overlays/borders/pegasus/genesis.cfg
|
||||
change^borders^input_overlay_aspect_adjust_landscape^0.100000
|
||||
change^borders^input_overlay_enable^true
|
||||
change^borders^input_overlay_scale_landscape^1.040000
|
||||
change^widescreen^aspect_ratio_index^24
|
||||
change^borders^input_overlay^/var/config/retroarch/overlays/borders/pegasus/genesis.cfg^^/var/config/retroarch/config/Genesis Plus GX/genesis.cfg^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^borders^input_overlay_aspect_adjust_landscape^0.100000^^/var/config/retroarch/config/Genesis Plus GX/genesis.cfg^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^borders^input_overlay_enable^true^^/var/config/retroarch/config/Genesis Plus GX/genesis.cfg^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^borders^input_overlay_scale_landscape^1.040000^^/var/config/retroarch/config/Genesis Plus GX/genesis.cfg^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^widescreen^aspect_ratio_index^24^^/var/config/retroarch/config/Genesis Plus GX/genesis.cfg^$emuconfigs/retroarch/retroarch.cfg
|
||||
|
|
|
@ -1,13 +1,11 @@
|
|||
config_file_format^retroarch
|
||||
target_file^/var/config/retroarch/config/Genesis Plus GX/gg.cfg
|
||||
defaults_file^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^borders^aspect_ratio_index^23
|
||||
change^borders^custom_viewport_width^960
|
||||
change^borders^custom_viewport_height^720
|
||||
change^borders^custom_viewport_x^160
|
||||
change^borders^custom_viewport_y^24
|
||||
change^borders^input_overlay^/var/config/retroarch/overlays/borders/pegasus/gg.cfg
|
||||
change^borders^input_overlay_aspect_adjust_landscape^0.110000
|
||||
change^borders^input_overlay_enable^true
|
||||
change^borders^input_overlay_scale_landscape^1.350000
|
||||
change^borders^input_overlay_y_offset_landscape^0.020000
|
||||
change^borders^aspect_ratio_index^23^^/var/config/retroarch/config/Genesis Plus GX/gg.cfg^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^borders^custom_viewport_width^960^^/var/config/retroarch/config/Genesis Plus GX/gg.cfg^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^borders^custom_viewport_height^720^^/var/config/retroarch/config/Genesis Plus GX/gg.cfg^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^borders^custom_viewport_x^160^^/var/config/retroarch/config/Genesis Plus GX/gg.cfg^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^borders^custom_viewport_y^24^^/var/config/retroarch/config/Genesis Plus GX/gg.cfg^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^borders^input_overlay^/var/config/retroarch/overlays/borders/pegasus/gg.cfg^^/var/config/retroarch/config/Genesis Plus GX/gg.cfg^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^borders^input_overlay_aspect_adjust_landscape^0.110000^^/var/config/retroarch/config/Genesis Plus GX/gg.cfg^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^borders^input_overlay_enable^true^^/var/config/retroarch/config/Genesis Plus GX/gg.cfg^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^borders^input_overlay_scale_landscape^1.350000^^/var/config/retroarch/config/Genesis Plus GX/gg.cfg^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^borders^input_overlay_y_offset_landscape^0.020000^^/var/config/retroarch/config/Genesis Plus GX/gg.cfg^$emuconfigs/retroarch/retroarch.cfg
|
||||
|
|
|
@ -1,8 +1,6 @@
|
|||
config_file_format^retroarch
|
||||
target_file^/var/config/retroarch/config/Mupen64Plus-Next/n64.cfg
|
||||
defaults_file^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^borders^input_overlay^/var/config/retroarch/overlays/borders/pegasus/N64.cfg
|
||||
change^borders^input_overlay_aspect_adjust_landscape^0.145000
|
||||
change^borders^input_overlay_enable^true
|
||||
change^widescreen^aspect_ratio_index^24
|
||||
enable^nintendo_button_layout^/var/config/retroarch/config/remaps/Snes9x/snes.rmp
|
||||
change^borders^input_overlay^/var/config/retroarch/overlays/borders/pegasus/N64.cfg^^/var/config/retroarch/config/Mupen64Plus-Next/n64.cfg^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^borders^input_overlay_aspect_adjust_landscape^0.145000^^/var/config/retroarch/config/Mupen64Plus-Next/n64.cfg^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^borders^input_overlay_enable^true^^/var/config/retroarch/config/Mupen64Plus-Next/n64.cfg^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^widescreen^aspect_ratio_index^24^^/var/config/retroarch/config/Mupen64Plus-Next/n64.cfg^$emuconfigs/retroarch/retroarch.cfg
|
||||
enable^abxy_button_swap^/var/config/retroarch/config/remaps/Snes9x/snes.rmp
|
||||
|
|
|
@ -1,10 +1,8 @@
|
|||
config_file_format^pcsx2
|
||||
target_file^$pcsx2conf
|
||||
defaults_file^$emuconfigs/PCSX2/PCSX2.ini
|
||||
change^cheevos^Enabled^true^Achievements
|
||||
change^cheevos^Username^$cheevos_username^Achievements
|
||||
change^cheevos^Token^$cheevos_token^Achievements
|
||||
change^cheevos^LoginTimestamp^$cheevos_login_timestamp^Achievements
|
||||
change^cheevos_hardcore^ChallengeMode^true^Achievements
|
||||
change^savestate_auto_save^SaveStateOnShutdown^true^EmuCore
|
||||
change^ask_to_exit^ConfirmShutdown^true^UI
|
||||
change^cheevos^Enabled^true^Achievements^$pcsx2conf^$emuconfigs/PCSX2/PCSX2.ini
|
||||
change^cheevos^Username^$cheevos_username^Achievements^$pcsx2conf^$emuconfigs/PCSX2/PCSX2.ini
|
||||
change^cheevos^Token^$cheevos_token^Achievements^$pcsx2conf^$emuconfigs/PCSX2/PCSX2.ini
|
||||
change^cheevos^LoginTimestamp^$cheevos_login_timestamp^Achievements^$pcsx2conf^$emuconfigs/PCSX2/PCSX2.ini
|
||||
change^cheevos_hardcore^ChallengeMode^true^Achievements^$pcsx2conf^$emuconfigs/PCSX2/PCSX2.ini
|
||||
change^savestate_auto_save^SaveStateOnShutdown^true^EmuCore^$pcsx2conf^$emuconfigs/PCSX2/PCSX2.ini
|
||||
change^ask_to_exit^ConfirmShutdown^true^UI^$pcsx2conf^$emuconfigs/PCSX2/PCSX2.ini
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
config_file_format^ppsspp
|
||||
target_file^$ppssppconf
|
||||
defaults_file^$emuconfigs/PCSX2/PCSX2.ini
|
||||
change^savestate_auto_load^AutoLoadSaveState^2^General
|
||||
change^savestate_auto_load^AutoLoadSaveState^2^General^$ppssppconf^$emuconfigs/ppssppdl/ppsspp.ini
|
||||
change^cheevos^AchievementsEnable^True^Achievements^$ppssppconf^$emuconfigs/ppssppdl/ppsspp.ini
|
||||
change^cheevos^AchievementsUserName^Achievements^$cheevos_username^$ppssppconf^$emuconfigs/ppssppdl/ppsspp.ini
|
||||
change^cheevos_hardcore^AchievementsChallengeMode^True^Achievements^$ppssppconf^$emuconfigs/ppssppdl/ppsspp.ini
|
||||
|
|
|
@ -1,4 +1,2 @@
|
|||
config_file_format^primehack
|
||||
target_file^$primehackconf
|
||||
defaults_file^$emuconfigs/primehack/Dolphin.ini
|
||||
change^ask_to_exit^ConfirmStop^True^Interface
|
||||
change^ask_to_exit^ConfirmStop^True^Interface^$primehackconf^$emuconfigs/primehack/Dolphin.ini
|
||||
|
|
|
@ -1,8 +1,6 @@
|
|||
config_file_format^retroarch
|
||||
target_file^/var/config/retroarch/config/SwanStation/psx.cfg
|
||||
defaults_file^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^borders^input_overlay^/var/config/retrodeck/overlays/borders/pegasus/psx.cfg
|
||||
change^borders^input_overlay_aspect_adjust_landscape^0.120000
|
||||
change^borders^input_overlay_enable^true
|
||||
change^borders^input_overlay_scale_landscape^1.040000
|
||||
change^widescreen^aspect_ratio_index^24
|
||||
change^borders^input_overlay^/var/config/retrodeck/overlays/borders/pegasus/psx.cfg^^/var/config/retroarch/config/SwanStation/psx.cfg^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^borders^input_overlay_aspect_adjust_landscape^0.120000^^/var/config/retroarch/config/SwanStation/psx.cfg^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^borders^input_overlay_enable^true^^/var/config/retroarch/config/SwanStation/psx.cfg^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^borders^input_overlay_scale_landscape^1.040000^^/var/config/retroarch/config/SwanStation/psx.cfg^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^widescreen^aspect_ratio_index^24^^/var/config/retroarch/config/SwanStation/psx.cfg^$emuconfigs/retroarch/retroarch.cfg
|
||||
|
|
|
@ -1,9 +1,7 @@
|
|||
config_file_format^retroarch-all
|
||||
target_file^$raconf
|
||||
defaults_file^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^cheevos^cheevos_enable^true
|
||||
change^cheevos^cheevos_token^$cheevos_token
|
||||
change^cheevos^cheevos_username^$cheevos_username
|
||||
change^cheevos_hardcore^cheevos_hardcore_mode_enable^true
|
||||
change^savestate_auto_load^savestate_auto_load^true
|
||||
change^savestate_auto_save^savestate_auto_save^true
|
||||
change^cheevos^cheevos_enable^true^^$raconf^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^cheevos^cheevos_token^$cheevos_token^^$raconf^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^cheevos^cheevos_username^$cheevos_username^^$raconf^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^cheevos_hardcore^cheevos_hardcore_mode_enable^true^^$raconf^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^savestate_auto_load^savestate_auto_load^true^^$raconf^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^savestate_auto_save^savestate_auto_save^true^^$raconf^$emuconfigs/retroarch/retroarch.cfg
|
||||
|
|
|
@ -1,9 +1,7 @@
|
|||
config_file_format^retroarch
|
||||
target_file^/var/config/retroarch/config/Snes9x/snes.cfg
|
||||
defaults_file^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^borders^input_overlay^/var/config/retroarch/overlays/borders/pegasus/snes87.cfg
|
||||
change^borders^input_overlay_aspect_adjust_landscape^0.305000
|
||||
change^borders^input_overlay_scale_landscape^1.050000
|
||||
change^borders^input_overlay_enable^true
|
||||
change^widescreen^aspect_ratio_index^24
|
||||
enable^nintendo_button_layout^/var/config/retroarch/config/remaps/Snes9x/snes.rmp
|
||||
change^borders^input_overlay^/var/config/retroarch/overlays/borders/pegasus/snes87.cfg^^/var/config/retroarch/config/Snes9x/snes.cfg^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^borders^input_overlay_aspect_adjust_landscape^0.305000^^/var/config/retroarch/config/Snes9x/snes.cfg^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^borders^input_overlay_scale_landscape^1.050000^^/var/config/retroarch/config/Snes9x/snes.cfg^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^borders^input_overlay_enable^true^^/var/config/retroarch/config/Snes9x/snes.cfg^$emuconfigs/retroarch/retroarch.cfg
|
||||
change^widescreen^aspect_ratio_index^24^^/var/config/retroarch/config/Snes9x/snes.cfg^$emuconfigs/retroarch/retroarch.cfg
|
||||
enable^abxy_button_swap^/var/config/retroarch/config/remaps/Snes9x/snes.rmp
|
||||
|
|
|
@ -1,9 +1,7 @@
|
|||
config_file_format^yuzu
|
||||
target_file^$yuzuconf
|
||||
defaults_file^$emuconfigs/yuzu/qt-config.ini
|
||||
change^ask_to_exit^confirmClose^true^UI
|
||||
change^ask_to_exit^confirmClose\default^true^UI
|
||||
change^nintendo_button_layout^player_0_button_a^"engine:sdl,guid:03000000de280000ff11000001000000,port:0,button:0,pad:0"^Controls
|
||||
change^nintendo_button_layout^player_0_button_b^"engine:sdl,guid:03000000de280000ff11000001000000,port:0,button:1,pad:0"^Controls
|
||||
change^nintendo_button_layout^player_0_button_x^"engine:sdl,guid:03000000de280000ff11000001000000,port:0,button:2,pad:0"^Controls
|
||||
change^nintendo_button_layout^player_0_button_y^"engine:sdl,guid:03000000de280000ff11000001000000,port:0,button:3,pad:0"^Controls
|
||||
change^ask_to_exit^confirmClose^true^UI^$yuzuconf^$emuconfigs/yuzu/qt-config.ini
|
||||
change^ask_to_exit^confirmClose\default^true^UI^$yuzuconf^$emuconfigs/yuzu/qt-config.ini
|
||||
change^abxy_button_swap^player_0_button_a^"engine:sdl,guid:03000000de280000ff11000001000000,port:0,button:0,pad:0"^Controls^$yuzuconf^$emuconfigs/yuzu/qt-config.ini
|
||||
change^abxy_button_swap^player_0_button_b^"engine:sdl,guid:03000000de280000ff11000001000000,port:0,button:1,pad:0"^Controls^$yuzuconf^$emuconfigs/yuzu/qt-config.ini
|
||||
change^abxy_button_swap^player_0_button_x^"engine:sdl,guid:03000000de280000ff11000001000000,port:0,button:2,pad:0"^Controls^$yuzuconf^$emuconfigs/yuzu/qt-config.ini
|
||||
change^abxy_button_swap^player_0_button_y^"engine:sdl,guid:03000000de280000ff11000001000000,port:0,button:3,pad:0"^Controls^$yuzuconf^$emuconfigs/yuzu/qt-config.ini
|
||||
|
|
|
@ -6,6 +6,7 @@ megacd
|
|||
neogeocd
|
||||
pcenginecd
|
||||
pcfx
|
||||
psp
|
||||
psx
|
||||
ps2
|
||||
saturn
|
||||
|
@ -29,7 +30,13 @@ gba
|
|||
gbc
|
||||
genesis
|
||||
mastersystem
|
||||
n64
|
||||
nds
|
||||
nes
|
||||
ngp
|
||||
ngpc
|
||||
sega32x
|
||||
sega32xjp
|
||||
sega32xna
|
||||
snes
|
||||
snesna
|
||||
|
|
|
@ -1 +1,4 @@
|
|||
1201^1231^0000^2359^RetroDECK-Xmas-splash.svg
|
||||
1201^1231^0000^2359^rd-xmas-splash.svg
|
||||
0209^0212^0000^2359^rd-lunar-dragon-splash.svg
|
||||
0214^0214^0001^2359^rd-valentines-splash.svg
|
||||
0317^0317^0000^2359^rd-stpatricks-splash.svg
|
||||
|
|
|
@ -5,19 +5,22 @@ If you feel you have contributed to the project but lacks mention, please contac
|
|||
|
||||
The Team
|
||||
XargonWan
|
||||
RetroDECK project founder and also one of the founding members of AmberELEC
|
||||
RetroDECK project founder and also one of the founding members of AmberELEC.
|
||||
|
||||
IceNine451
|
||||
Creator of the RetroDECK configurator and various awesome features.
|
||||
Creator of the RetroDECK configurator and the RetroDECK Framework.
|
||||
|
||||
Lazorne
|
||||
Community management/outreach, testing, documentation, feature suggestions and some design.
|
||||
Community management/outreach, testing, documentation and Wiki Lord.
|
||||
|
||||
dottormac
|
||||
Beta Tester
|
||||
WallK
|
||||
Works on Godot Features.
|
||||
|
||||
LX32
|
||||
Junior code contributor, Beta Tester
|
||||
Works on a many projects.
|
||||
|
||||
dottormac
|
||||
Tester
|
||||
|
||||
|
||||
Collaborators
|
||||
|
|
|
@ -8,7 +8,7 @@ states_folder=/home/deck/retrodeck/states
|
|||
bios_folder=/home/deck/retrodeck/bios
|
||||
media_folder=/home/deck/retrodeck/downloaded_media
|
||||
themes_folder=/home/deck/retrodeck/themes
|
||||
logs_folder=/home/deck/retrodeck/.logs
|
||||
logs_folder=/home/deck/retrodeck/logs
|
||||
screenshots_folder=/home/deck/retrodeck/screenshots
|
||||
mods_folder=/home/deck/retrodeck/mods
|
||||
texture_packs_folder=/home/deck/retrodeck/texture_packs
|
||||
|
@ -54,7 +54,7 @@ n64=false
|
|||
psx_ra=false
|
||||
snes=false
|
||||
|
||||
[nintendo_button_layout]
|
||||
[abxy_button_swap]
|
||||
citra=false
|
||||
gb=false
|
||||
gba=false
|
||||
|
|
|
@ -4,7 +4,7 @@ Buttons/A = SOUTH
|
|||
Buttons/B = EAST
|
||||
Buttons/X = NORTH
|
||||
Buttons/Y = WEST
|
||||
Buttons/Z = TR
|
||||
Buttons/Z = `TR` | `TL`
|
||||
Buttons/Start = START
|
||||
Main Stick/Up = `Axis 1-`
|
||||
Main Stick/Down = `Axis 1+`
|
||||
|
|
|
@ -21,4 +21,9 @@ Other State Hotkeys/Increase Selected State Slot = @(Ctrl+K)
|
|||
Other State Hotkeys/Decrease Selected State Slot = @(Ctrl+J)
|
||||
General/Toggle Fullscreen = @(Ctrl+Return)
|
||||
General/Control NetPlay Golf Mode = @(Alt+H)
|
||||
Wii/Press Sync Button = @(Alt+W)
|
||||
Wii/Press Sync Button = @(Alt+W)
|
||||
Wii/Connect Wii Remote 1 = @(Alt+W+`1`)
|
||||
Wii/Connect Wii Remote 2 = @(Alt+W+`2`)
|
||||
Wii/Connect Wii Remote 3 = @(Alt+W+`3`)
|
||||
Wii/Connect Wii Remote 4 = @(Alt+W+`4`)
|
||||
Wii/Connect Balance Board = @(Alt+W+`5`)
|
|
@ -10,7 +10,7 @@ Drums/Stick/Modifier/Range = 50.0
|
|||
Turntable/Stick/Modifier/Range = 50.0
|
||||
uDraw/Stylus/Modifier/Range = 50.0
|
||||
Drawsome/Stylus/Modifier/Range = 50.0
|
||||
Buttons/A = SOUTH
|
||||
Buttons/A = `SOUTH` | `Click 1` | `XInput2/0/Virtual core pointer:Click 1`
|
||||
Buttons/B = EAST
|
||||
Buttons/1 = WEST
|
||||
Buttons/2 = NORTH
|
||||
|
|
|
@ -1,48 +1,118 @@
|
|||
#!/bin/bash
|
||||
|
||||
LOG_FILE="$rdhome/.logs/gzdoom.log"
|
||||
|
||||
if [ -e "$LOG_FILE" ]; then
|
||||
rm "$LOG_FILE"
|
||||
fi
|
||||
|
||||
echo "RetroDECK GZDOOM wrapper init." | tee -a "$LOG_FILE"
|
||||
|
||||
# List of IWAD files
|
||||
# Define the IWAD files list
|
||||
IWAD_FILES=("DOOM1.WAD" "DOOM.WAD" "DOOM2.WAD" "DOOM2F.WAD" "DOOM64.WAD" "TNT.WAD"
|
||||
"PLUTONIA.WAD" "HERETIC1.WAD" "HERETIC.WAD" "HEXEN.WAD" "HEXDD.WAD"
|
||||
"STRIFE0.WAD" "STRIFE1.WAD" "VOICES.WAD" "CHEX.WAD"
|
||||
"CHEX3.WAD" "HACX.WAD" "freedoom1.wad" "freedoom2.wad" "freedm.wad" # unlicensed iwads
|
||||
"doom_complete.pk3" # this includes them all
|
||||
)
|
||||
"CHEX3.WAD" "HACX.WAD" "freedoom1.wad" "freedoom2.wad" "freedm.wad"
|
||||
"doom_complete.pk3"
|
||||
)
|
||||
|
||||
echo "Trying to load \"$1\"." | tee -a "$LOG_FILE"
|
||||
# Function to log messages to terminal and a log file
|
||||
log() {
|
||||
local message="$1"
|
||||
local logfile="$rdhome/logs/gzdoom.log"
|
||||
local timestamp="$(date +[%Y-%m-%d\ %H:%M:%S])"
|
||||
|
||||
if [ ! -e "$1" ]; then
|
||||
echo "$1 not found. Quitting." | tee -a "$LOG_FILE"
|
||||
exit 0
|
||||
fi
|
||||
echo "$timestamp $message" | tee -a "$logfile"
|
||||
}
|
||||
|
||||
filename=$(basename "$1") # Extracts only the filename from the full path
|
||||
extension="${filename##*.}" # Extracts the file extension
|
||||
|
||||
if [ "$extension" == "doom" ]; then
|
||||
map_file="$1"
|
||||
iwad="-iwad $(head -n 1 "$map_file")"
|
||||
file="-file $(tail -n +2 "$map_file" | sed 's/.*/-file &/')"
|
||||
# Function to check if a file is an IWAD
|
||||
is_iwad() {
|
||||
local file="$1"
|
||||
local lowercase_file="$(basename "${file,,}")"
|
||||
|
||||
for iwad in "${IWAD_FILES[@]}"; do
|
||||
if [[ "${iwad,,}" == "$lowercase_file" ]]; then
|
||||
echo "true"
|
||||
return
|
||||
fi
|
||||
done
|
||||
echo "false"
|
||||
}
|
||||
|
||||
echo "Found a .doom file: $1, parsing it." | tee -a "$LOG_FILE"
|
||||
echo "Calling GZDoom with: \"$iwad $file\"." | tee -a "$LOG_FILE"
|
||||
gzdoom -config /var/config/gzdoom/gzdoom.ini $iwad $file | tee -a "$LOG_FILE"
|
||||
else
|
||||
shopt -s nocasematch # Enable case-insensitive matching
|
||||
if [[ "${IWAD_FILES[@]}" =~ "$filename" ]]; then
|
||||
type="iwad"
|
||||
# Function to search for files recursively
|
||||
search_file_recursive() {
|
||||
local file="$1"
|
||||
local directory="$2"
|
||||
local found_file=""
|
||||
|
||||
# Check if the file exists in the current directory
|
||||
if [[ -e "$directory/$file" ]]; then
|
||||
found_file="$directory/$file"
|
||||
else
|
||||
type="file"
|
||||
# Search recursively
|
||||
local lowercase_file="$(echo "$file" | tr '[:upper:]' '[:lower:]')"
|
||||
found_file=$(find "$directory" -type f -iname "$lowercase_file" | head -n 1)
|
||||
fi
|
||||
shopt -u nocasematch # Disable case-insensitive matching after use
|
||||
echo "$found_file"
|
||||
}
|
||||
|
||||
echo "Found $type: $1, loading it." | tee -a "$LOG_FILE"
|
||||
gzdoom -config /var/config/gzdoom/gzdoom.ini -$type "$1" | tee -a "$LOG_FILE"
|
||||
# Main script
|
||||
log "[INFO] RetroDECK GZDOOM wrapper init"
|
||||
|
||||
# Check if $1 is not a .doom file
|
||||
if [[ "${1##*.}" != "doom" ]]; then
|
||||
# Check if the file is in the IWAD list
|
||||
if [[ $(is_iwad "$1") == "true" ]]; then
|
||||
command="gzdoom -config /var/config/gzdoom/gzdoom.ini -iwad $1"
|
||||
else
|
||||
command="gzdoom -config /var/config/gzdoom/gzdoom.ini -file $1"
|
||||
fi
|
||||
|
||||
# Log the command
|
||||
log "[INFO] Loading: \"$1\""
|
||||
log "[INFO] Executing command \"$command\""
|
||||
|
||||
# Execute the command
|
||||
eval "$command"
|
||||
|
||||
# Check if $1 is a .doom file
|
||||
else
|
||||
doom_file="$1"
|
||||
log "[INFO] Found a doom file: \"$1\""
|
||||
|
||||
# Check if the .doom file exists
|
||||
if [[ ! -e "$doom_file" ]]; then
|
||||
log "[Error] doom file not found in \"$doom_file\""
|
||||
zenity --error --no-wrap \
|
||||
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
|
||||
--title "RetroDECK" \
|
||||
--text="File \"$doom_file\" not found. Quitting."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Read the .doom file and compose the command
|
||||
command="gzdoom -config /var/config/gzdoom/gzdoom.ini"
|
||||
|
||||
while IFS= read -r line; do
|
||||
# Search for the file recursively
|
||||
found_file=$(search_file_recursive "$line" "$(dirname "$doom_file")")
|
||||
|
||||
# If the file is not found, exit with an error
|
||||
if [[ -z "$found_file" ]]; then
|
||||
log "[ERROR] File not found in \"$line\""
|
||||
zenity --error --no-wrap \
|
||||
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
|
||||
--title "RetroDECK" \
|
||||
--text="File \"$doom_file\" not found. Quitting."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check if the file is an IWAD
|
||||
if [[ $(is_iwad "$found_file") == "true" ]]; then
|
||||
command+=" -iwad $found_file"
|
||||
log "[INFO] Appending the param \"-iwad $found_file\""
|
||||
else
|
||||
command+=" -file $found_file"
|
||||
log "[INFO] Appending the param \"-file $found_file\""
|
||||
fi
|
||||
done < "$doom_file"
|
||||
|
||||
# Log the command
|
||||
log "[INFO] Executing command \"$command\""
|
||||
|
||||
# Execute the command
|
||||
eval "$command"
|
||||
fi
|
||||
|
|
|
@ -8,10 +8,10 @@ writeconfig 0
|
|||
# CORE SEARCH PATH OPTIONS
|
||||
#
|
||||
homepath /var/config/mame
|
||||
rompath /home/deck/retrodeck/roms/arcade
|
||||
rompath RETRODECKROMSDIR
|
||||
hashpath /app/share/mame/hash
|
||||
samplepath /app/share/mame/samples
|
||||
artpath $HOME/retrodeck/downloaded_media/arcade/screenshots/
|
||||
artpath RETRODECKHOMEDIR/downloaded_media/arcade/screenshots/
|
||||
ctrlrpath /app/share/mame/ctrlr
|
||||
inipath /var/config/mame
|
||||
fontpath /app/bin/
|
||||
|
@ -27,7 +27,7 @@ swpath /app/share/mame/software
|
|||
cfg_directory /var/config/mame/cfg
|
||||
nvram_directory /var/config/mame/nvram
|
||||
input_directory /var/config/mame/inp
|
||||
state_directory /var/config/mame/sta
|
||||
state_directory RETRODECKSAVESDIR/mame-sa/states
|
||||
snapshot_directory RETRODECKHOMEDIR/screenshots
|
||||
diff_directory /var/config/mame/diff
|
||||
comment_directory /var/config/mame/comments
|
||||
|
|
|
@ -9,7 +9,7 @@ pcbs_directory pcb
|
|||
flyers_directory flyers
|
||||
titles_directory titles
|
||||
ends_directory ends
|
||||
marquees_directory marquees;$HOME/retrodeck/downloaded_media/arcade/marquees
|
||||
marquees_directory marquees;RETRODECKHOMEDIR/downloaded_media/arcade/marquees
|
||||
artwork_preview_directory "artwork preview;artpreview"
|
||||
bosses_directory bosses
|
||||
logos_directory logo
|
||||
|
@ -19,7 +19,7 @@ gameover_directory gameover
|
|||
howto_directory howto
|
||||
select_directory select
|
||||
icons_directory icons
|
||||
covers_directory covers;$HOME/retrodeck/downloaded_media/arcade/covers
|
||||
covers_directory covers;RETRODECKHOMEDIR/downloaded_media/arcade/covers
|
||||
ui_path ui
|
||||
|
||||
#
|
||||
|
|
|
@ -18,8 +18,8 @@ An.Right = 1-40,10-4000
|
|||
Analog limiter = 1-60
|
||||
RapidFire = 1-113:1-48
|
||||
Fast-forward = 1-113:1-157
|
||||
SpeedToggle = 1-68
|
||||
Pause = 1-111
|
||||
SpeedToggle = 1-113:1-144
|
||||
Pause = 1-113:1-41
|
||||
Rewind = 1-113:1-156
|
||||
Save State = 1-113:1-47
|
||||
Load State = 1-113:1-29
|
||||
|
@ -31,4 +31,6 @@ Toggle Fullscreen = 1-113:1-66
|
|||
RightAn.Up = 10-4007
|
||||
RightAn.Down = 10-4006
|
||||
RightAn.Left = 10-4005
|
||||
RightAn.Right = 10-4004
|
||||
RightAn.Right = 10-4004
|
||||
Previous Slot = 1-113:1-38
|
||||
Exit App = 1-113:1-45
|
|
@ -12,7 +12,7 @@ Language = en_US
|
|||
ForceLagSync2 = False
|
||||
DiscordPresence = True
|
||||
UISound = False
|
||||
AutoLoadSaveState = 0
|
||||
AutoLoadSaveState = 2
|
||||
EnableCheats = False
|
||||
CwCheatRefreshRate = 77
|
||||
CwCheatScrollPosition = 0.000000
|
||||
|
@ -165,6 +165,10 @@ SkipGPUReadbacks = False
|
|||
GpuLogProfiler = False
|
||||
iShowStatusFlags = 0
|
||||
DisplayIntegerScale = False
|
||||
VSync = False
|
||||
MultiThreading = True
|
||||
UberShaderVertex = True
|
||||
UberShaderFragment = True
|
||||
[Sound]
|
||||
Enable = True
|
||||
AudioBackend = 0
|
||||
|
@ -332,6 +336,100 @@ Custom6Repeat = False
|
|||
Custom7Repeat = False
|
||||
Custom8Repeat = False
|
||||
Custom9Repeat = False
|
||||
Custom10Mapping = 0x0000000000000000
|
||||
Custom10Image = 0
|
||||
Custom10Shape = 2
|
||||
Custom10Toggle = False
|
||||
Custom10Repeat = False
|
||||
Custom11Mapping = 0x0000000000000000
|
||||
Custom11Image = 1
|
||||
Custom11Shape = 2
|
||||
Custom11Toggle = False
|
||||
Custom11Repeat = False
|
||||
Custom12Mapping = 0x0000000000000000
|
||||
Custom12Image = 2
|
||||
Custom12Shape = 2
|
||||
Custom12Toggle = False
|
||||
Custom12Repeat = False
|
||||
Custom13Mapping = 0x0000000000000000
|
||||
Custom13Image = 3
|
||||
Custom13Shape = 2
|
||||
Custom13Toggle = False
|
||||
Custom13Repeat = False
|
||||
Custom14Mapping = 0x0000000000000000
|
||||
Custom14Image = 4
|
||||
Custom14Shape = 2
|
||||
Custom14Toggle = False
|
||||
Custom14Repeat = False
|
||||
Custom15Mapping = 0x0000000000000000
|
||||
Custom15Image = 0
|
||||
Custom15Shape = 9
|
||||
Custom15Toggle = False
|
||||
Custom15Repeat = False
|
||||
Custom16Mapping = 0x0000000000000000
|
||||
Custom16Image = 1
|
||||
Custom16Shape = 9
|
||||
Custom16Toggle = False
|
||||
Custom16Repeat = False
|
||||
Custom17Mapping = 0x0000000000000000
|
||||
Custom17Image = 2
|
||||
Custom17Shape = 9
|
||||
Custom17Toggle = False
|
||||
Custom17Repeat = False
|
||||
Custom18Mapping = 0x0000000000000000
|
||||
Custom18Image = 3
|
||||
Custom18Shape = 9
|
||||
Custom18Toggle = False
|
||||
Custom18Repeat = False
|
||||
Custom19Mapping = 0x0000000000000000
|
||||
Custom19Image = 4
|
||||
Custom19Shape = 9
|
||||
Custom19Toggle = False
|
||||
Custom19Repeat = False
|
||||
fcombo10X = 0.643378
|
||||
fcombo10Y = 0.581952
|
||||
comboKeyScale10 = 1.150000
|
||||
ShowComboKey10 = False
|
||||
fcombo11X = 0.763295
|
||||
fcombo11Y = 0.581952
|
||||
comboKeyScale11 = 1.150000
|
||||
ShowComboKey11 = False
|
||||
fcombo12X = 0.883212
|
||||
fcombo12Y = 0.581952
|
||||
comboKeyScale12 = 1.150000
|
||||
ShowComboKey12 = False
|
||||
fcombo13X = 0.643378
|
||||
fcombo13Y = 0.416206
|
||||
comboKeyScale13 = 1.150000
|
||||
ShowComboKey13 = False
|
||||
fcombo14X = 0.763295
|
||||
fcombo14Y = 0.416206
|
||||
comboKeyScale14 = 1.150000
|
||||
ShowComboKey14 = False
|
||||
fcombo15X = 0.355579
|
||||
fcombo15Y = 0.581952
|
||||
comboKeyScale15 = 1.150000
|
||||
ShowComboKey15 = False
|
||||
fcombo16X = 0.235662
|
||||
fcombo16Y = 0.581952
|
||||
comboKeyScale16 = 1.150000
|
||||
ShowComboKey16 = False
|
||||
fcombo17X = 0.115746
|
||||
fcombo17Y = 0.581952
|
||||
comboKeyScale17 = 1.150000
|
||||
ShowComboKey17 = False
|
||||
fcombo18X = 0.355579
|
||||
fcombo18Y = 0.416206
|
||||
comboKeyScale18 = 1.150000
|
||||
ShowComboKey18 = False
|
||||
fcombo19X = 0.235662
|
||||
fcombo19Y = 0.416206
|
||||
comboKeyScale19 = 1.150000
|
||||
ShowComboKey19 = False
|
||||
AllowMappingCombos = True
|
||||
RapidFileInterval = 5
|
||||
AnalogGesture = False
|
||||
AnalogGestureSensibility = 1.000000
|
||||
[Network]
|
||||
EnableWlan = False
|
||||
EnableAdhocServer = False
|
||||
|
@ -367,6 +465,7 @@ WlanPowerSave = False
|
|||
EncryptSave = True
|
||||
SavedataUpgradeVersion = True
|
||||
MemStickSize = 16
|
||||
GameLanguage = -1
|
||||
[Debugger]
|
||||
DisasmWindowX = -1
|
||||
DisasmWindowY = -1
|
||||
|
@ -390,6 +489,7 @@ DrawFrameGraph = False
|
|||
GEWindowTabsBL = 0x00000000
|
||||
GEWindowTabsBR = 0x00000000
|
||||
GEWindowTabsTR = 0x00000000
|
||||
SkipFuncHashMap =
|
||||
[Upgrade]
|
||||
UpgradeMessage =
|
||||
UpgradeVersion =
|
||||
|
@ -516,6 +616,8 @@ VRCameraPitch = 0
|
|||
VRHeadRotationScale = 5.000000
|
||||
VRHeadRotationEnabled = False
|
||||
VRHeadRotationSmoothing = False
|
||||
VRPassthrough = False
|
||||
VRCanvas3DDistance = 3.000000
|
||||
[Achievements]
|
||||
AchievementsEnable = False
|
||||
AchievementsChallengeMode = False
|
||||
|
|
|
@ -4,7 +4,7 @@ gdbstub: false
|
|||
log-active-shaders: false
|
||||
log-uniforms: false
|
||||
log-compat-warn: false
|
||||
validation-layer: true
|
||||
validation-layer: false
|
||||
pstv-mode: false
|
||||
show-mode: false
|
||||
demo-mode: false
|
||||
|
|
|
@ -511,7 +511,7 @@
|
|||
<name>doom</name>
|
||||
<fullname>Doom</fullname>
|
||||
<path>%ROMPATH%/doom</path>
|
||||
<extension>.doom .DOOM .desktop .iwad .IWAD .pk4 .PK4 .pk3 .PK3 .pwad .PWAD .sh .wad .WAD</extension>
|
||||
<extension>.doom .DOOM .desktop .iwad .IWAD .pk4 .PK4 .pk3 .PK3 .pwad .PWAD .sh .wad .WAD .ipk3 .IPK3</extension>
|
||||
<command label="GZDoom (Standalone)">gzdoom.sh %ROM%</command>
|
||||
<command label="PrBoom">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%/prboom_libretro.so %ROM%</command>
|
||||
<!-- <command label="PrBoom+ (Standalone)">%EMULATOR_PRBOOM-PLUS% -iwad %ROM%</command> -->
|
||||
|
@ -1129,7 +1129,7 @@
|
|||
<platform>msxturbor</platform>
|
||||
<theme>msxturbor</theme>
|
||||
</system>
|
||||
<!--
|
||||
|
||||
<system>
|
||||
<name>mugen</name>
|
||||
<fullname>M.U.G.E.N Game Engine</fullname>
|
||||
|
@ -1139,7 +1139,7 @@
|
|||
<platform>mugen</platform>
|
||||
<theme>mugen</theme>
|
||||
</system>
|
||||
-->
|
||||
|
||||
<system>
|
||||
<name>multivision</name>
|
||||
<fullname>Othello Multivision</fullname>
|
||||
|
@ -1329,7 +1329,7 @@
|
|||
<platform>odyssey2</platform>
|
||||
<theme>odyssey2</theme>
|
||||
</system>
|
||||
<!--
|
||||
|
||||
<system>
|
||||
<name>openbor</name>
|
||||
<fullname>OpenBOR Game Engine</fullname>
|
||||
|
@ -1339,7 +1339,7 @@
|
|||
<platform>openbor</platform>
|
||||
<theme>openbor</theme>
|
||||
</system>
|
||||
-->
|
||||
|
||||
<!--
|
||||
<system>
|
||||
<name>oric</name>
|
||||
|
@ -1471,8 +1471,8 @@
|
|||
<fullname>Sony PlayStation 3</fullname>
|
||||
<path>%ROMPATH%/ps3</path>
|
||||
<extension>.desktop .ps3 .PS3 .ps3dir .PS3DIR</extension>
|
||||
<command label="RPCS3 Directory (Standalone)">%EMULATOR_RPCS3% --no-gui %ROM%</command>
|
||||
<command label="RPCS3 Shortcut (Standalone)">%ENABLESHORTCUTS% %EMULATOR_OS-SHELL% %ROM%</command>
|
||||
<command label="RPCS3 Directory (Standalone)">%EMULATOR_RPCS3% --no-gui %ROM%</command>
|
||||
<platform>ps3</platform>
|
||||
<theme>ps3</theme>
|
||||
</system>
|
||||
|
|
|
@ -30,7 +30,7 @@ save_migration() {
|
|||
# Doing the dir prep as we don't know from which version we came
|
||||
dir_prep "$media_folder" "/var/config/emulationstation/.emulationstation/downloaded_media"
|
||||
dir_prep "$themes_folder" "/var/config/emulationstation/.emulationstation/themes"
|
||||
mkdir -pv $rdhome/.logs #this was added later, maybe safe to remove in a few versions
|
||||
mkdir -pv $rdhome/logs #this was added later, maybe safe to remove in a few versions
|
||||
|
||||
# Resetting es_settings, now we need it but in the future I should think a better solution, maybe with sed
|
||||
cp -fv /app/retrodeck/es_settings.xml /var/config/emulationstation/.emulationstation/es_settings.xml
|
||||
|
@ -50,7 +50,7 @@ save_migration() {
|
|||
versionwheresaveschanged="0.4.5b" # Hardcoded break point between unsorted and sorted saves
|
||||
|
||||
if [[ $(sed -e "s/\.//g" <<< $hard_version) > $(sed -e "s/\.//g" <<< $versionwheresaveschanged) ]] && [[ ! $(sed -e "s/\.//g" <<< $version) > $(sed -e "s/\.//g" <<< $versionwheresaveschanged) ]]; then # Check if user is upgrading from the version where save organization was changed. Try not to reuse this, it things 0.4.5b is newer than 0.4.5
|
||||
migration_logfile=$rdhome/.logs/savemove_"$(date +"%Y_%m_%d_%I_%M_%p").log"
|
||||
migration_logfile=$rdhome/logs/savemove_"$(date +"%Y_%m_%d_%I_%M_%p").log"
|
||||
save_backup_file=$rdhome/savebackup_"$(date +"%Y_%m_%d_%I_%M_%p").zip"
|
||||
state_backup_file=$rdhome/statesbackup_"$(date +"%Y_%m_%d_%I_%M_%p").zip"
|
||||
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
#!/bin/bash
|
||||
|
||||
source /app/libexec/functions.sh
|
||||
|
||||
debug_dialog() {
|
||||
# This function is for displaying commands run by the Configurator without actually running them
|
||||
# USAGE: debug_dialog "command"
|
||||
|
@ -21,8 +23,7 @@ configurator_process_complete_dialog() {
|
|||
if [ ! $? == 0 ]; then # OK button clicked
|
||||
configurator_welcome_dialog
|
||||
elif [ ! $? == 1 ]; then # Quit button clicked
|
||||
pkill -f retrodeck
|
||||
pkill -f emulationstation
|
||||
quit_retrodeck
|
||||
fi
|
||||
}
|
||||
|
||||
|
@ -117,9 +118,9 @@ configurator_move_folder_dialog() {
|
|||
if [[ -d "$dest_root/$rd_dir_path" ]]; then # If the move succeeded
|
||||
declare -g "$rd_dir_name=$dest_root/$rd_dir_path" # Set the new path for that folder variable in retrodeck.cfg
|
||||
if [[ "$rd_dir_name" == "rdhome" ]]; then # If the whole retrodeck folder was moved...
|
||||
prepare_emulator "postmove" "retrodeck"
|
||||
prepare_component "postmove" "retrodeck"
|
||||
fi
|
||||
prepare_emulator "postmove" "all" # Update all the appropriate emulator path settings
|
||||
prepare_component "postmove" "all" # Update all the appropriate emulator path settings
|
||||
conf_write # Write the settings to retrodeck.cfg
|
||||
if [[ -z $(ls -1 "$source_root/retrodeck") ]]; then # Cleanup empty old_path/retrodeck folder if it was left behind
|
||||
rmdir "$source_root/retrodeck"
|
||||
|
@ -149,7 +150,7 @@ configurator_move_folder_dialog() {
|
|||
configurator_generic_dialog "RetroDECK Configurator - Move Folder" "The $(basename $dir_to_move) folder was not found at the expected location.\n\nThis may have happened if the folder was moved manually.\n\nPlease select the current location of the folder."
|
||||
dir_to_move=$(directory_browse "RetroDECK $(basename $dir_to_move) directory location")
|
||||
declare -g "$rd_dir_name=$dir_to_move"
|
||||
prepare_emulator "postmove" "all"
|
||||
prepare_component "postmove" "all"
|
||||
conf_write
|
||||
configurator_generic_dialog "RetroDECK Configurator - Move Folder" "RetroDECK $(basename $dir_to_move) folder now configured at\n$dir_to_move."
|
||||
configurator_move_folder_dialog "$rd_dir_name"
|
||||
|
|
|
@ -100,6 +100,43 @@ move() {
|
|||
fi
|
||||
}
|
||||
|
||||
download_file() {
|
||||
# Function to download file from the Internet, with Zenity progress bar
|
||||
# USAGE: download_file $source_url $file_dest $file_name
|
||||
# source_url is the location the file is downloaded from
|
||||
# file_dest is the destination the file should be in the filesystem, needs filename included!
|
||||
# file_name is a user-readable file name or description to be put in the Zenity dialog
|
||||
|
||||
# Run wget in the background and redirect the progress to a temporary file
|
||||
(
|
||||
wget "$1" -O "$2" -q --show-progress --progress=dot 2>&1 | sed -n -e 's/^.* \([0-9]*\)%.*$/\1/p' > "/var/cache/tmp/download_progress" &
|
||||
wget_pid=$!
|
||||
|
||||
progress="0"
|
||||
echo "$progress" # Initial progress value. sent to Zenity
|
||||
while true; do
|
||||
progress=$(tail -n 2 "/var/cache/tmp/download_progress" | head -1) # Read the second-to-last value written to the pipe, to avoid reading data that is half written
|
||||
echo "$progress" # Send value to Zenity
|
||||
if [[ "$(tail -n 1 "/var/cache/tmp/download_progress")" == "100" ]]; then # Read last line every time to check for download completion
|
||||
echo "100"
|
||||
break
|
||||
fi
|
||||
sleep 0.5
|
||||
done
|
||||
|
||||
# Wait for wget process to finish
|
||||
wait "$wget_pid"
|
||||
) |
|
||||
zenity --progress \
|
||||
--title="Downloading File" \
|
||||
--text="Downloading $3..." \
|
||||
--percentage=0 \
|
||||
--auto-close
|
||||
|
||||
# Cleanup temp file
|
||||
rm -f "/var/cache/tmp/download_progress"
|
||||
}
|
||||
|
||||
update_rd_conf() {
|
||||
# This function will import a default retrodeck.cfg file and update it with any current settings. This will allow us to expand the file over time while retaining current user settings.
|
||||
# USAGE: update_rd_conf
|
||||
|
@ -247,15 +284,9 @@ dir_prep() {
|
|||
}
|
||||
|
||||
update_rpcs3_firmware() {
|
||||
(
|
||||
mkdir -p "$roms_folder/ps3/tmp"
|
||||
chmod 777 "$roms_folder/ps3/tmp"
|
||||
wget "$rpcs3_firmware" -P "$roms_folder/ps3/tmp/"
|
||||
) |
|
||||
zenity --icon-name=net.retrodeck.retrodeck --progress --no-cancel --pulsate --auto-close \
|
||||
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
|
||||
--title "RetroDECK RPCS3 Firmware Download" \
|
||||
--text="RetroDECK downloading the RPCS3 firmware, please wait."
|
||||
download_file "$rpcs3_firmware" "$roms_folder/ps3/tmp/PS3UPDAT.PUP" "RPCS3 Firmware"
|
||||
rpcs3 --installfw "$roms_folder/ps3/tmp/PS3UPDAT.PUP"
|
||||
rm -rf "$roms_folder/ps3/tmp"
|
||||
}
|
||||
|
@ -294,7 +325,7 @@ do
|
|||
zenity --question --no-wrap --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" --title "RetroDECK" --cancel-label="No" --ok-label "Yes" --text="Do you want to quit?"
|
||||
if [ $? == 0 ] # yes, quit
|
||||
then
|
||||
exit 2
|
||||
quit_retrodeck
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
@ -304,7 +335,7 @@ do
|
|||
--title "RetroDECK" \
|
||||
--ok-label "Quit" \
|
||||
--text="No location was selected. Please run RetroDECK again to retry."
|
||||
exit 2
|
||||
quit_retrodeck
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
@ -337,6 +368,9 @@ finit() {
|
|||
|
||||
echo "Executing finit"
|
||||
|
||||
# Placing the default retrodeck.cfg
|
||||
cp -vf $rd_defaults $rd_conf
|
||||
|
||||
# Internal or SD Card?
|
||||
local finit_dest_choice=$(configurator_destination_choice_dialog "RetroDECK data" "Welcome to the first configuration of RetroDECK.\nThe setup will be quick but please READ CAREFULLY each message in order to avoid misconfigurations.\n\nWhere do you want your RetroDECK data folder to be located?\n\nThis folder will contain all ROMs, BIOSs and scraped data." )
|
||||
echo "Choice is $finit_dest_choice"
|
||||
|
@ -346,7 +380,7 @@ finit() {
|
|||
"Back" | "" ) # Back or X button quits
|
||||
rm -f "$rd_conf" # Cleanup unfinished retrodeck.cfg if first install is interrupted
|
||||
echo "Now quitting"
|
||||
exit 2
|
||||
quit_retrodeck
|
||||
;;
|
||||
|
||||
"Internal Storage" ) # Internal
|
||||
|
@ -382,7 +416,7 @@ finit() {
|
|||
--text="SD card was found but is not writable\nThis can happen with cards formatted on PC.\nPlease format the SD card through the Steam Deck's Game Mode and run RetroDECK again."
|
||||
rm -f "$rd_conf" # Cleanup unfinished retrodeck.cfg if first install is interrupted
|
||||
echo "Now quitting"
|
||||
exit 2
|
||||
quit_retrodeck
|
||||
else
|
||||
rdhome="$sdcard/retrodeck"
|
||||
fi
|
||||
|
@ -404,7 +438,7 @@ finit() {
|
|||
|
||||
esac
|
||||
|
||||
prepare_emulator "reset" "retrodeck" # Parse the [paths] section of retrodeck.cfg and set the value of / create all needed folders
|
||||
prepare_component "reset" "retrodeck" # Parse the [paths] section of retrodeck.cfg and set the value of / create all needed folders
|
||||
|
||||
conf_write # Write the new values to retrodeck.cfg
|
||||
|
||||
|
@ -420,7 +454,7 @@ finit() {
|
|||
--text="RetroDECK will now install the needed files, which can take up to one minute.\nRetroDECK will start once the process is completed.\n\nPress OK to continue."
|
||||
|
||||
(
|
||||
prepare_emulator "reset" "all"
|
||||
prepare_component "reset" "all"
|
||||
build_retrodeck_current_presets
|
||||
deploy_helper_files
|
||||
|
||||
|
@ -467,7 +501,8 @@ install_retrodeck_controller_profile() {
|
|||
# USAGE: install_retrodeck_controller_profile
|
||||
if [[ -d "$HOME/.steam/steam/tenfoot/resource/images/library/controller/binding_icons/" && -d "$HOME/.steam/steam/controller_base/templates/" ]]; then
|
||||
rsync -rlD --mkpath "/app/retrodeck/binding_icons/" "$HOME/.steam/steam/tenfoot/resource/images/library/controller/binding_icons/"
|
||||
cp -f "$emuconfigs/defaults/retrodeck/controller_configs/*.vdf" "$HOME/.steam/steam/controller_base/templates"
|
||||
rsync -rlD --mkpath "$emuconfigs/defaults/retrodeck/controller_configs/" "$HOME/.steam/steam/controller_base/templates/"
|
||||
# TODO: delete older files Issue#672
|
||||
else
|
||||
configurator_generic_dialog "RetroDECK Controller Profile Install" "The target directories for the controller profile do not exist.\n\nThis may happen if you do not have Steam installed or the location is does not have permission to be read."
|
||||
fi
|
||||
|
@ -513,7 +548,7 @@ easter_eggs() {
|
|||
if [[ ! -z $(cat $easter_egg_checklist) ]]; then
|
||||
while IFS="^" read -r start_date end_date start_time end_time splash_file # Read Easter Egg checklist file and separate values
|
||||
do
|
||||
if [[ $current_day -ge "$start_date" && $current_day -le "$end_date" && $current_time -ge "$start_time" && $current_time -le "$end_time" ]]; then # If current line specified date/time matches current date/time, set $splash_file to be deployed
|
||||
if [[ "$((10#$current_day))" -ge "$((10#$start_date))" && "$((10#$current_day))" -le "$((10#$end_date))" && "$((10#$current_time))" -ge "$((10#$start_time))" && "$((10#$current_time))" -le "$((10#$end_time))" ]]; then # If current line specified date/time matches current date/time, set $splash_file to be deployed
|
||||
new_splash_file="$splashscreen_dir/$splash_file"
|
||||
break
|
||||
else # When there are no matches, the default splash screen is set to deploy
|
||||
|
@ -527,6 +562,11 @@ easter_eggs() {
|
|||
cp -f "$new_splash_file" "$current_splash_file" # Deploy assigned splash screen
|
||||
}
|
||||
|
||||
quit_retrodeck() {
|
||||
pkill -f retrodeck
|
||||
pkill -f emulationstation
|
||||
}
|
||||
|
||||
start_retrodeck() {
|
||||
easter_eggs # Check if today has a surprise splashscreen and load it if so
|
||||
# normal startup
|
||||
|
|
|
@ -10,7 +10,7 @@ source /app/libexec/functions.sh
|
|||
source /app/libexec/multi_user.sh
|
||||
source /app/libexec/patching.sh
|
||||
source /app/libexec/post_update.sh
|
||||
source /app/libexec/prepare_emulator.sh
|
||||
source /app/libexec/prepare_component.sh
|
||||
source /app/libexec/presets.sh
|
||||
|
||||
# Static variables
|
||||
|
@ -177,8 +177,8 @@ else
|
|||
new_home_path=$(directory_browse "RetroDECK folder location")
|
||||
set_setting_value $rd_conf "rdhome" "$new_home_path" retrodeck "paths"
|
||||
conf_read
|
||||
prepare_emulator "retrodeck" "postmove"
|
||||
prepare_emulator "all" "postmove"
|
||||
prepare_component "retrodeck" "postmove"
|
||||
prepare_component "all" "postmove"
|
||||
conf_write
|
||||
fi
|
||||
|
||||
|
|
|
@ -208,7 +208,7 @@ multi_user_setup_new_user() {
|
|||
do
|
||||
if [[ ! -z $(grep "^$emu_conf$" "$multi_user_emulator_config_dirs") ]]; then
|
||||
unlink "/var/config/$emu_conf"
|
||||
prepare_emulator "reset" "$emu_conf"
|
||||
prepare_component "reset" "$emu_conf"
|
||||
fi
|
||||
done
|
||||
for emu_conf in $(find "/var/config" -mindepth 1 -maxdepth 1 -type d -printf '%f\n') # For all the currently non-linked config folders, like from a newly-added emulator
|
||||
|
@ -238,7 +238,7 @@ multi_user_link_current_user_files() {
|
|||
if [[ -d "$multi_user_data_folder/$SteamAppUser/config/$emu_conf" ]]; then # If the current user already has a config folder for this emulator
|
||||
ln -sfT "$multi_user_data_folder/$SteamAppUser/config/$emu_conf" "retrodeck/config/$emu_conf"
|
||||
else # If the current user doesn't have a config folder for this emulator, init it and then link it
|
||||
prepare_emulator "reset" "$emu_conf"
|
||||
prepare_component "reset" "$emu_conf"
|
||||
dir_prep "$multi_user_data_folder/$SteamAppUser/config/$emu_conf" "/var/config/$emu_conf"
|
||||
fi
|
||||
fi
|
||||
|
|
|
@ -21,7 +21,7 @@ post_update() {
|
|||
# - Fix PICO-8 folder structure. ROM and save folders are now sane and binary files will go into ~/retrodeck/bios/pico-8/
|
||||
|
||||
rm -rf /var/config/primehack # Purge old Primehack config files. Saves are safe as they are linked into /var/data/primehack.
|
||||
prepare_emulator "reset" "primehack"
|
||||
prepare_component "reset" "primehack"
|
||||
|
||||
dir_prep "$rdhome/saves/duckstation" "/var/data/duckstation/memcards"
|
||||
dir_prep "$rdhome/states/duckstation" "/var/data/duckstation/savestates"
|
||||
|
@ -212,14 +212,14 @@ post_update() {
|
|||
|
||||
set_setting_value "$ppssppconf" "AutoLoadSaveState" "0" "ppsspp" "General"
|
||||
|
||||
prepare_emulator "reset" "cemu"
|
||||
prepare_component "reset" "cemu"
|
||||
|
||||
prepare_emulator "reset" "pico8"
|
||||
prepare_component "reset" "pico8"
|
||||
|
||||
configurator_generic_dialog "RetroDECK 0.7.0b Upgrade" "Would you like to install the official controller profile?\n(this will reset your custom emulator settings)\n\nAfter installation you can enable it from from Controller Settings -> Templates."
|
||||
if [[ $(configurator_generic_question_dialog "RetroDECK Official Controller Profile" "Would you like to install the official RetroDECK controller profile?") == "true" ]]; then
|
||||
install_retrodeck_controller_profile
|
||||
prepare_emulator "reset" "all"
|
||||
prepare_component "reset" "all"
|
||||
fi
|
||||
fi
|
||||
if [[ $prev_version -le "071" ]]; then
|
||||
|
@ -234,6 +234,15 @@ post_update() {
|
|||
emulationstation --home /var/config/emulationstation --create-system-dirs
|
||||
fi
|
||||
|
||||
if [[ $prev_version -le "080" ]]; then
|
||||
# In version 0.8.0b, the following changes were made that required config file updates/reset or other changes to the filesystem:
|
||||
# - Remove RetroDECK controller profile from existing template location TODO
|
||||
# - Determine if Steam is installed via normal desktop application / Flatpak / SteamOS TODO
|
||||
# - Install RetroDECK controller profile in desired location TODO
|
||||
# - Change section name in retrodeck.cfg for ABXY button swap preset
|
||||
sed -i 's^nintendo_button_layout^abxy_button_swap^' "$rd_conf" # This is a one-off sed statement as there are no functions for replacing section names
|
||||
fi
|
||||
|
||||
# The following commands are run every time.
|
||||
|
||||
if [[ -d "/var/data/dolphin-emu/Load/DynamicInputTextures" ]]; then # Refresh installed textures if they have been enabled
|
||||
|
@ -264,4 +273,31 @@ post_update() {
|
|||
else
|
||||
changelog_dialog "$version"
|
||||
fi
|
||||
|
||||
if [[ $prev_version -le "075" ]]; then
|
||||
# In version 0.7.5b, the following changes were made:
|
||||
prepare_component "reset" "vita3k"
|
||||
prepare_component "reset" "mame"
|
||||
prepare_component "reset" "boilr"
|
||||
if [ -d "$rdhome/.logs" ]; then
|
||||
mv "$rdhome/.logs" "$logs_folder"
|
||||
log i "Logs folder renamed successfully"
|
||||
else
|
||||
log i "The .logs folder does not exist, continuing."
|
||||
fi
|
||||
|
||||
|
||||
|
||||
# The save folder of rpcs3 was inverted so we're moving the saves into the real one
|
||||
echo "RPCS3 saves needs to be migrated, executing."
|
||||
mv "$saves_folder/ps3/rpcs3" "$saves_folder/ps3/rpcs3.bak"
|
||||
mkdir -p "$saves_folder/ps3/rpcs3"
|
||||
mv -v "$saves_folder/ps3/rpcs3.bak"/* "$saves_folder/ps3/rpcs3"
|
||||
mv -v "$bios_folder/rpcs3/dev_hdd0/home/00000001/savedata"/* "$saves_folder/ps3/rpcs3"
|
||||
mv -v "$saves_folder/ps3/rpcs3.bak" "$rdhome/backups/saves/ps3/rpcs3"
|
||||
echo "RPCS3 saves migration completed, a backup was made here: \"$rdhome/backups/saves/ps3/rpcs3\"."
|
||||
source /app/libexec/functions.sh
|
||||
dir_prep "$saves_folder/ps3/rpcs3" "$bios_folder/rpcs3/dev_hdd0/home/00000001/savedata"
|
||||
|
||||
fi
|
||||
}
|
||||
|
|
|
@ -1,19 +1,19 @@
|
|||
#!/bin/bash
|
||||
|
||||
prepare_emulator() {
|
||||
# This function will perform one of several actions on one or more emulators
|
||||
prepare_component() {
|
||||
# This function will perform one of several actions on one or more components
|
||||
# The actions currently include "reset" and "postmove"
|
||||
# The "reset" action will initialize the emulator
|
||||
# The "postmove" action will update the emulator settings after one or more RetroDECK folders were moved
|
||||
# An emulator can be called by name, by parent folder name in the /var/config root or use the option "all" to perform the action on all emulators equally
|
||||
# The "reset" action will initialize the component
|
||||
# The "postmove" action will update the component settings after one or more RetroDECK folders were moved
|
||||
# An component can be called by name, by parent folder name in the /var/config root or use the option "all" to perform the action on all components equally
|
||||
# The function will also behave differently depending on if the initial request was from the Configurator, the CLI interface or a normal function call if needed
|
||||
# USAGE: prepare_emulator "$action" "$emulator" "$call_source(optional)"
|
||||
# USAGE: prepare_component "$action" "$component" "$call_source(optional)"
|
||||
|
||||
action="$1"
|
||||
emulator="$2"
|
||||
component="$2"
|
||||
call_source="$3"
|
||||
|
||||
if [[ "$emulator" == "retrodeck" ]]; then
|
||||
if [[ "$component" == "retrodeck" ]]; then
|
||||
if [[ "$action" == "reset" ]]; then # Update the paths of all folders in retrodeck.cfg and create them
|
||||
while read -r config_line; do
|
||||
local current_setting_name=$(get_setting_name "$config_line" "retrodeck")
|
||||
|
@ -37,7 +37,7 @@ prepare_emulator() {
|
|||
fi
|
||||
fi
|
||||
|
||||
if [[ "$emulator" =~ ^(emulationstation|all)$ ]]; then # For use after ESDE-related folders are moved or a reset
|
||||
if [[ "$component" =~ ^(es-de|ES-DE|all)$ ]]; then # For use after ESDE-related folders are moved or a reset
|
||||
if [[ "$action" == "reset" ]]; then
|
||||
rm -rf /var/config/emulationstation/
|
||||
mkdir -p /var/config/emulationstation/.emulationstation/
|
||||
|
@ -57,7 +57,7 @@ prepare_emulator() {
|
|||
fi
|
||||
fi
|
||||
|
||||
if [[ "$emulator" =~ ^(retroarch|RetroArch|all)$ ]]; then
|
||||
if [[ "$component" =~ ^(retroarch|RetroArch|all)$ ]]; then
|
||||
if [[ "$action" == "reset" ]]; then # Run reset-only commands
|
||||
if [[ $multi_user_mode == "true" ]]; then # Multi-user actions
|
||||
rm -rf "$multi_user_data_folder/$SteamAppUser/config/retroarch"
|
||||
|
@ -132,11 +132,11 @@ prepare_emulator() {
|
|||
set_setting_value "$rd_conf" "n64" "$(get_setting_value "$rd_defaults" "n64" "retrodeck" "widescreen")" "retrodeck" "widescreen"
|
||||
set_setting_value "$rd_conf" "psx_ra" "$(get_setting_value "$rd_defaults" "psx_ra" "retrodeck" "widescreen")" "retrodeck" "widescreen"
|
||||
set_setting_value "$rd_conf" "snes" "$(get_setting_value "$rd_defaults" "snes" "retrodeck" "widescreen")" "retrodeck" "widescreen"
|
||||
set_setting_value "$rd_conf" "gb" "$(get_setting_value "$rd_defaults" "gb" "retrodeck" "nintendo_button_layout")" "retrodeck" "nintendo_button_layout"
|
||||
set_setting_value "$rd_conf" "gba" "$(get_setting_value "$rd_defaults" "gba" "retrodeck" "nintendo_button_layout")" "retrodeck" "nintendo_button_layout"
|
||||
set_setting_value "$rd_conf" "gbc" "$(get_setting_value "$rd_defaults" "gbc" "retrodeck" "nintendo_button_layout")" "retrodeck" "nintendo_button_layout"
|
||||
set_setting_value "$rd_conf" "n64" "$(get_setting_value "$rd_defaults" "gb" "retrodeck" "nintendo_button_layout")" "retrodeck" "nintendo_button_layout"
|
||||
set_setting_value "$rd_conf" "snes" "$(get_setting_value "$rd_defaults" "gba" "retrodeck" "nintendo_button_layout")" "retrodeck" "nintendo_button_layout"
|
||||
set_setting_value "$rd_conf" "gb" "$(get_setting_value "$rd_defaults" "gb" "retrodeck" "abxy_button_swap")" "retrodeck" "abxy_button_swap"
|
||||
set_setting_value "$rd_conf" "gba" "$(get_setting_value "$rd_defaults" "gba" "retrodeck" "abxy_button_swap")" "retrodeck" "abxy_button_swap"
|
||||
set_setting_value "$rd_conf" "gbc" "$(get_setting_value "$rd_defaults" "gbc" "retrodeck" "abxy_button_swap")" "retrodeck" "abxy_button_swap"
|
||||
set_setting_value "$rd_conf" "n64" "$(get_setting_value "$rd_defaults" "gb" "retrodeck" "abxy_button_swap")" "retrodeck" "abxy_button_swap"
|
||||
set_setting_value "$rd_conf" "snes" "$(get_setting_value "$rd_defaults" "gba" "retrodeck" "abxy_button_swap")" "retrodeck" "abxy_button_swap"
|
||||
set_setting_value "$rd_conf" "retroarch" "$(get_setting_value "$rd_defaults" "retroarch" "retrodeck" "savestate_auto_load")" "retrodeck" "savestate_auto_load"
|
||||
set_setting_value "$rd_conf" "retroarch" "$(get_setting_value "$rd_defaults" "retroarch" "retrodeck" "savestate_auto_save")" "retrodeck" "savestate_auto_save"
|
||||
fi
|
||||
|
@ -154,7 +154,7 @@ prepare_emulator() {
|
|||
fi
|
||||
fi
|
||||
|
||||
if [[ "$emulator" =~ ^(cemu|Cemu|all)$ ]]; then
|
||||
if [[ "$component" =~ ^(cemu|Cemu|all)$ ]]; then
|
||||
if [[ "$action" == "reset" ]]; then # Run reset-only commands
|
||||
echo "----------------------"
|
||||
echo "Initializing CEMU"
|
||||
|
@ -183,7 +183,7 @@ prepare_emulator() {
|
|||
fi
|
||||
fi
|
||||
|
||||
if [[ "$emulator" =~ ^(citra|citra-emu|Citra|all)$ ]]; then
|
||||
if [[ "$component" =~ ^(citra|citra-emu|Citra|all)$ ]]; then
|
||||
if [[ "$action" == "reset" ]]; then # Run reset-only commands
|
||||
echo "------------------------"
|
||||
echo "Initializing CITRA"
|
||||
|
@ -215,12 +215,12 @@ prepare_emulator() {
|
|||
dir_prep "$texture_packs_folder/Citra" "/var/data/citra-emu/load/textures"
|
||||
|
||||
# Reset default preset settings
|
||||
set_setting_value "$rd_conf" "citra" "$(get_setting_value "$rd_defaults" "citra" "retrodeck" "nintendo_button_layout")" "retrodeck" "nintendo_button_layout"
|
||||
set_setting_value "$rd_conf" "citra" "$(get_setting_value "$rd_defaults" "citra" "retrodeck" "abxy_button_swap")" "retrodeck" "abxy_button_swap"
|
||||
set_setting_value "$rd_conf" "citra" "$(get_setting_value "$rd_defaults" "citra" "retrodeck" "ask_to_exit")" "retrodeck" "ask_to_exit"
|
||||
fi
|
||||
if [[ "$action" == "postmove" ]]; then # Run only post-move commands
|
||||
dir_prep "$rdhome/bios/citra/sysdata" "/var/data/citra-emu/sysdata"
|
||||
dir_prep "$rdhome/.logs/citra" "/var/data/citra-emu/log"
|
||||
dir_prep "$rdhome/logs/citra" "/var/data/citra-emu/log"
|
||||
dir_prep "$mods_folder/Citra" "/var/data/citra-emu/load/mods"
|
||||
dir_prep "$texture_packs_folder/Citra" "/var/data/citra-emu/load/textures"
|
||||
set_setting_value "$citraconf" "nand_directory" "$saves_folder/n3ds/citra/nand/" "citra" "Data%20Storage"
|
||||
|
@ -230,7 +230,7 @@ prepare_emulator() {
|
|||
fi
|
||||
fi
|
||||
|
||||
if [[ "$emulator" =~ ^(dolphin|dolphin-emu|Dolphin|all)$ ]]; then
|
||||
if [[ "$component" =~ ^(dolphin|dolphin-emu|Dolphin|all)$ ]]; then
|
||||
if [[ "$action" == "reset" ]]; then # Run reset-only commands
|
||||
echo "----------------------"
|
||||
echo "Initializing DOLPHIN"
|
||||
|
@ -285,7 +285,7 @@ prepare_emulator() {
|
|||
fi
|
||||
fi
|
||||
|
||||
if [[ "$emulator" =~ ^(duckstation|Duckstation|all)$ ]]; then
|
||||
if [[ "$component" =~ ^(duckstation|Duckstation|all)$ ]]; then
|
||||
if [[ "$action" == "reset" ]]; then # Run reset-only commands
|
||||
echo "------------------------"
|
||||
echo "Initializing DUCKSTATION"
|
||||
|
@ -301,8 +301,9 @@ prepare_emulator() {
|
|||
set_setting_value "$multi_user_data_folder/$SteamAppUser/data/duckstation/settings.ini" "RecursivePaths" "$roms_folder/psx" "duckstation" "GameList"
|
||||
dir_prep "$multi_user_data_folder/$SteamAppUser/config/duckstation" "/var/config/duckstation"
|
||||
else # Single-user actions
|
||||
rm -rf /var/config/duckstation
|
||||
mkdir -p /var/config/duckstation/
|
||||
rm -rf "/var/config/duckstation"
|
||||
mkdir -p "/var/config/duckstation/"
|
||||
mkdir -p "$saves_folder/psx/duckstation/memcards"
|
||||
cp -fv "$emuconfigs/duckstation/"* /var/config/duckstation
|
||||
set_setting_value "$duckstationconf" "SearchDirectory" "$bios_folder" "duckstation" "BIOS"
|
||||
set_setting_value "$duckstationconf" "Card1Path" "$saves_folder/psx/duckstation/memcards/shared_card_1.mcd" "duckstation" "MemoryCards"
|
||||
|
@ -331,7 +332,7 @@ prepare_emulator() {
|
|||
fi
|
||||
fi
|
||||
|
||||
if [[ "$emulator" =~ ^(melonds|melonDS|MelonDS|all)$ ]]; then
|
||||
if [[ "$component" =~ ^(melonds|melonDS|MelonDS|all)$ ]]; then
|
||||
if [[ "$action" == "reset" ]]; then # Run reset-only commands
|
||||
echo "----------------------"
|
||||
echo "Initializing MELONDS"
|
||||
|
@ -371,7 +372,7 @@ prepare_emulator() {
|
|||
fi
|
||||
fi
|
||||
|
||||
if [[ "$emulator" =~ ^(pcsx2|PCSX2|all)$ ]]; then
|
||||
if [[ "$component" =~ ^(pcsx2|PCSX2|all)$ ]]; then
|
||||
if [[ "$action" == "reset" ]]; then # Run reset-only commands
|
||||
echo "----------------------"
|
||||
echo "Initializing PCSX2"
|
||||
|
@ -417,7 +418,7 @@ prepare_emulator() {
|
|||
fi
|
||||
fi
|
||||
|
||||
if [[ "$emulator" =~ ^(pico8|pico-8|all)$ ]]; then
|
||||
if [[ "$component" =~ ^(pico8|pico-8|all)$ ]]; then
|
||||
if [[ ("$action" == "reset") || ("$action" == "postmove") ]]; then
|
||||
dir_prep "$bios_folder/pico-8" "$HOME/.lexaloffle/pico-8" # Store binary and config files together. The .lexaloffle directory is a hard-coded location for the PICO-8 config file, cannot be changed
|
||||
dir_prep "$roms_folder/pico8" "$bios_folder/pico-8/carts" # Symlink default game location to RD roms for cleanliness (this location is overridden anyway by the --root_path launch argument anyway)
|
||||
|
@ -427,7 +428,7 @@ prepare_emulator() {
|
|||
fi
|
||||
fi
|
||||
|
||||
if [[ "$emulator" =~ ^(ppsspp|PPSSPP|all)$ ]]; then
|
||||
if [[ "$component" =~ ^(ppsspp|PPSSPP|all)$ ]]; then
|
||||
if [[ "$action" == "reset" ]]; then # Run reset-only commands
|
||||
echo "------------------------"
|
||||
echo "Initializing PPSSPPSDL"
|
||||
|
@ -457,7 +458,7 @@ prepare_emulator() {
|
|||
fi
|
||||
fi
|
||||
|
||||
if [[ "$emulator" =~ ^(primehack|Primehack|all)$ ]]; then
|
||||
if [[ "$component" =~ ^(primehack|Primehack|all)$ ]]; then
|
||||
if [[ "$action" == "reset" ]]; then # Run reset-only commands
|
||||
echo "----------------------"
|
||||
echo "Initializing Primehack"
|
||||
|
@ -501,7 +502,7 @@ prepare_emulator() {
|
|||
fi
|
||||
fi
|
||||
|
||||
if [[ "$emulator" =~ ^(rpcs3|RPCS3|all)$ ]]; then
|
||||
if [[ "$component" =~ ^(rpcs3|RPCS3|all)$ ]]; then
|
||||
if [[ "$action" == "reset" ]]; then # Run reset-only commands
|
||||
echo "------------------------"
|
||||
echo "Initializing RPCS3"
|
||||
|
@ -521,7 +522,7 @@ prepare_emulator() {
|
|||
# This is an unfortunate one-off because set_setting_value does not currently support settings with $ in the name.
|
||||
sed -i 's^\^$(EmulatorDir): .*^$(EmulatorDir): '"$bios_folder/rpcs3/"'^' "$rpcs3vfsconf"
|
||||
set_setting_value "$rpcs3vfsconf" "/games/" "$roms_folder/ps3/" "rpcs3"
|
||||
dir_prep "$bios_folder/rpcs3/dev_hdd0/home/00000001/savedata" "$saves_folder/ps3/rpcs3"
|
||||
dir_prep "$saves_folder/ps3/rpcs3" "$bios_folder/rpcs3/dev_hdd0/home/00000001/savedata"
|
||||
fi
|
||||
# Shared actions
|
||||
mkdir -p "$bios_folder/rpcs3/dev_hdd0"
|
||||
|
@ -539,7 +540,7 @@ prepare_emulator() {
|
|||
fi
|
||||
fi
|
||||
|
||||
if [[ "$emulator" =~ ^(ryujunx|Ryujinx|all)$ ]]; then
|
||||
if [[ "$component" =~ ^(ryujunx|Ryujinx|all)$ ]]; then
|
||||
if [[ "$action" == "reset" ]]; then # Run reset-only commands
|
||||
echo "------------------------"
|
||||
echo "Initializing RYUJINX"
|
||||
|
@ -566,7 +567,7 @@ prepare_emulator() {
|
|||
fi
|
||||
fi
|
||||
|
||||
if [[ "$emulator" =~ ^(xemu|XEMU|all)$ ]]; then
|
||||
if [[ "$component" =~ ^(xemu|XEMU|all)$ ]]; then
|
||||
if [[ "$action" == "reset" ]]; then # Run reset-only commands
|
||||
echo "------------------------"
|
||||
echo "Initializing XEMU"
|
||||
|
@ -582,12 +583,12 @@ prepare_emulator() {
|
|||
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/xemu/xemu.toml" "flashrom_path" "'$bios_folder/Complex.bin'" "xemu" "sys.files"
|
||||
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/xemu/xemu.toml" "eeprom_path" "'$saves_folder/xbox/xemu/xbox-eeprom.bin'" "xemu" "sys.files"
|
||||
set_setting_value "$multi_user_data_folder/$SteamAppUser/config/xemu/xemu.toml" "hdd_path" "'$bios_folder/xbox_hdd.qcow2'" "xemu" "sys.files"
|
||||
dir_prep "$multi_user_data_folder/$SteamAppUser/config/xemu" "/var/config/xemu" # Creating config folder in /var/config for consistentcy and linking back to original location where emulator will look
|
||||
dir_prep "$multi_user_data_folder/$SteamAppUser/config/xemu" "/var/config/xemu" # Creating config folder in /var/config for consistentcy and linking back to original location where component will look
|
||||
dir_prep "$multi_user_data_folder/$SteamAppUser/config/xemu" "/var/data/xemu/xemu"
|
||||
else # Single-user actions
|
||||
rm -rf /var/config/xemu
|
||||
rm -rf /var/data/xemu
|
||||
dir_prep "/var/config/xemu" "/var/data/xemu/xemu" # Creating config folder in /var/config for consistentcy and linking back to original location where emulator will look
|
||||
dir_prep "/var/config/xemu" "/var/data/xemu/xemu" # Creating config folder in /var/config for consistentcy and linking back to original location where component will look
|
||||
cp -fv $emuconfigs/xemu/xemu.toml "$xemuconf"
|
||||
set_setting_value "$xemuconf" "screenshot_dir" "'$screenshots_folder'" "xemu" "General"
|
||||
set_setting_value "$xemuconf" "bootrom_path" "'$bios_folder/mcpx_1.0.bin'" "xemu" "sys.files"
|
||||
|
@ -611,7 +612,7 @@ prepare_emulator() {
|
|||
fi
|
||||
fi
|
||||
|
||||
if [[ "$emulator" =~ ^(yuzu|Yuzu|all)$ ]]; then
|
||||
if [[ "$component" =~ ^(yuzu|Yuzu|all)$ ]]; then
|
||||
if [[ "$action" == "reset" ]]; then # Run reset-only commands
|
||||
echo "----------------------"
|
||||
echo "Initializing YUZU"
|
||||
|
@ -649,7 +650,7 @@ prepare_emulator() {
|
|||
fi
|
||||
|
||||
# Reset default preset settings
|
||||
set_setting_value "$rd_conf" "yuzu" "$(get_setting_value "$rd_defaults" "yuzu" "retrodeck" "nintendo_button_layout")" "retrodeck" "nintendo_button_layout"
|
||||
set_setting_value "$rd_conf" "yuzu" "$(get_setting_value "$rd_defaults" "yuzu" "retrodeck" "abxy_button_swap")" "retrodeck" "abxy_button_swap"
|
||||
set_setting_value "$rd_conf" "yuzu" "$(get_setting_value "$rd_defaults" "yuzu" "retrodeck" "ask_to_exit")" "retrodeck" "ask_to_exit"
|
||||
fi
|
||||
if [[ "$action" == "postmove" ]]; then # Run only post-move commands
|
||||
|
@ -667,54 +668,60 @@ prepare_emulator() {
|
|||
fi
|
||||
fi
|
||||
|
||||
if [[ "$emulator" =~ ^(vita3k|Vita3K|all)$ ]]; then
|
||||
if [[ "$component" =~ ^(vita3k|Vita3K|all)$ ]]; then
|
||||
if [[ "$action" == "reset" ]]; then # Run reset-only commands
|
||||
echo "----------------------"
|
||||
echo "Initializing Vita3K"
|
||||
echo "----------------------"
|
||||
if [[ $multi_user_mode == "true" ]]; then # Multi-user actions
|
||||
echo "Figure out what Vita3k needs for multi-user"
|
||||
else # Single-user actions
|
||||
# NOTE: the emulator is writing in "." so it must be placed in the rw filesystem. A symlink of the binary is already placed in /app/bin/Vita3K
|
||||
rm -rf "/var/data/Vita3K"
|
||||
mkdir -p "/var/data/Vita3K"
|
||||
unzip "/app/retrodeck/vita3k.zip" -d "/var/data/Vita3K"
|
||||
chmod +x "/var/data/Vita3K/Vita3K"
|
||||
rm -f "/var/data/Vita3K/update-vita3k.sh"
|
||||
cp -fvr "$emuconfigs/vita3k/config.yml" "/var/data/Vita3K" # Emulator config
|
||||
cp -fvr "$emuconfigs/vita3k/ux0" "$bios_folder/Vita3K/Vita3K" # User config
|
||||
set_setting_value "$vita3kconf" "pref-path" "$rdhome/bios/Vita3K/Vita3K/" "vita3k"
|
||||
fi
|
||||
# Shared actions
|
||||
dir_prep "$saves_folder/psvita/vita3k" "$bios_folder/Vita3K/Vita3K/ux0/user/00/savedata" # Multi-user safe?
|
||||
echo "----------------------"
|
||||
echo "Initializing Vita3K"
|
||||
echo "----------------------"
|
||||
if [[ $multi_user_mode == "true" ]]; then # Multi-user actions
|
||||
echo "Figure out what Vita3k needs for multi-user"
|
||||
else # Single-user actions
|
||||
# NOTE: the component is writing in "." so it must be placed in the rw filesystem. A symlink of the binary is already placed in /app/bin/Vita3K
|
||||
rm -rf "/var/data/Vita3K"
|
||||
mkdir -p "/var/data/Vita3K"
|
||||
unzip "/app/retrodeck/vita3k.zip" -d "/var/data/Vita3K"
|
||||
chmod +x "/var/data/Vita3K/Vita3K"
|
||||
rm -f "/var/data/Vita3K/update-vita3k.sh"
|
||||
cp -fvr "$emuconfigs/vita3k/config.yml" "/var/data/Vita3K" # component config
|
||||
cp -fvr "$emuconfigs/vita3k/ux0" "$bios_folder/Vita3K/Vita3K" # User config
|
||||
set_setting_value "$vita3kconf" "pref-path" "$rdhome/bios/Vita3K/Vita3K/" "vita3k"
|
||||
fi
|
||||
# Shared actions
|
||||
dir_prep "$saves_folder/psvita/vita3k" "$bios_folder/Vita3K/Vita3K/ux0/user/00/savedata" # Multi-user safe?
|
||||
|
||||
# Installing firmware
|
||||
# TODO: at the moment this is here instead of a tool because it seems like it cannot run without Firmware
|
||||
curl "http://dus01.psv.update.playstation.net/update/psv/image/2022_0209/rel_f2c7b12fe85496ec88a0391b514d6e3b/PSVUPDAT.PUP" -po /tmp/PSVUPDAT.PUP
|
||||
curl "http://dus01.psp2.update.playstation.net/update/psp2/image/2019_0924/sd_8b5f60b56c3da8365b973dba570c53a5/PSP2UPDAT.PUP?dest=us" -po /tmp/PSP2UPDAT.PUP
|
||||
Vita3K --firmware /tmp/PSVUPDAT.PUP
|
||||
Vita3K --firmware /tmp/PSP2UPDAT.PUP
|
||||
# Installing firmware
|
||||
# TODO: at the moment this is here instead of a tool because it seems like it cannot run without Firmware
|
||||
curl "http://dus01.psv.update.playstation.net/update/psv/image/2022_0209/rel_f2c7b12fe85496ec88a0391b514d6e3b/PSVUPDAT.PUP" -po /tmp/PSVUPDAT.PUP
|
||||
curl "http://dus01.psp2.update.playstation.net/update/psp2/image/2019_0924/sd_8b5f60b56c3da8365b973dba570c53a5/PSP2UPDAT.PUP?dest=us" -po /tmp/PSP2UPDAT.PUP
|
||||
Vita3K --firmware /tmp/PSVUPDAT.PUP
|
||||
Vita3K --firmware /tmp/PSP2UPDAT.PUP
|
||||
fi
|
||||
if [[ "$action" == "postmove" ]]; then # Run only post-move commands
|
||||
dir_prep "$saves_folder/psvita/vita3k" "$bios_folder/Vita3K/Vita3K/ux0/user/00/savedata" # Multi-user safe?
|
||||
set_setting_value "$vita3kconf" "pref-path" "$rdhome/bios/Vita3K/Vita3K/" "vita3k"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [[ "$emulator" =~ ^(mame|MAME|all)$ ]]; then
|
||||
if [[ "$component" =~ ^(mame|MAME|all)$ ]]; then
|
||||
# TODO: do a proper script
|
||||
# This is just a placeholder script to test the emulator's flow
|
||||
# This is just a placeholder script to test the component's flow
|
||||
echo "----------------------"
|
||||
echo "Initializing MAME"
|
||||
echo "----------------------"
|
||||
|
||||
mkdir -p $saves_folder/mame-sa
|
||||
mkdir -p "/var/config/mame"
|
||||
dir_prep "$saves_folder/mame-sa/hiscore" "/var/config/mame/hiscore"
|
||||
cp -fvr "$emuconfigs/mame/**" "/var/config/mame"
|
||||
sed -i 's#RETRODECKROMSDIR#'$roms_folder'#g' "/var/config/mame/*.ini"
|
||||
sed -i 's#RETRODECKHOMESDIR#'$rdhome'#g' "/var/config/mame/*.ini"
|
||||
sed -i 's#RETRODECKSAVESDIR#'$rdhome'#g' "/var/config/mame/*.ini"
|
||||
|
||||
fi
|
||||
|
||||
if [[ "$emulator" =~ ^(gzdoom|GZDOOM|all)$ ]]; then
|
||||
if [[ "$component" =~ ^(gzdoom|GZDOOM|all)$ ]]; then
|
||||
# TODO: do a proper script
|
||||
# This is just a placeholder script to test the emulator's flow
|
||||
# This is just a placeholder script to test the component's flow
|
||||
echo "----------------------"
|
||||
echo "Initializing GZDOOM"
|
||||
echo "----------------------"
|
||||
|
@ -726,11 +733,20 @@ prepare_emulator() {
|
|||
|
||||
sed -i 's#RETRODECKROMSDIR#'$roms_folder'#g' "/var/config/gzdoom/gzdoom.ini" # This is an unfortunate one-off because set_setting_value does not currently support JSON
|
||||
sed -i 's#RETRODECKSAVESDIR#'$saves_folder'#g' "/var/config/gzdoom/gzdoom.ini" # This is an unfortunate one-off because set_setting_value does not currently support JSON
|
||||
|
||||
fi
|
||||
|
||||
# Update presets for all emulators after any reset or move
|
||||
if [[ ! "$emulator" == "retrodeck" ]]; then
|
||||
if [[ "$component" =~ ^(boilr|BOILR|all)$ ]]; then
|
||||
echo "----------------------"
|
||||
echo "Initializing BOILR"
|
||||
echo "----------------------"
|
||||
|
||||
mkdir -p "/var/config/boilr"
|
||||
cp -fvr "/app/libexec/steam-sync/config.toml" "/var/config/boilr"
|
||||
|
||||
fi
|
||||
|
||||
# Update presets for all components after any reset or move
|
||||
if [[ ! "$component" == "retrodeck" ]]; then
|
||||
build_retrodeck_current_presets
|
||||
fi
|
||||
}
|
|
@ -96,7 +96,7 @@ build_preset_config() {
|
|||
local read_system_name=$(get_setting_name "$system_line")
|
||||
if [[ "$read_system_name" == "$system_being_changed" ]]; then
|
||||
local read_system_enabled=$(get_setting_value "$rd_conf" "$read_system_name" "retrodeck" "$current_preset")
|
||||
while IFS='^' read -r action read_preset read_setting_name new_setting_value section
|
||||
while IFS='^' read -r action read_preset read_setting_name new_setting_value section target_file defaults_file
|
||||
do
|
||||
case "$action" in
|
||||
|
||||
|
@ -109,22 +109,16 @@ build_preset_config() {
|
|||
fi
|
||||
;;
|
||||
|
||||
"target_file" )
|
||||
if [[ "$read_preset" = \$* ]]; then
|
||||
eval read_preset=$read_preset
|
||||
fi
|
||||
local read_target_file="$read_preset"
|
||||
;;
|
||||
|
||||
"defaults_file" )
|
||||
if [[ "$read_preset" = \$* ]]; then
|
||||
eval read_preset=$read_preset
|
||||
fi
|
||||
local read_defaults_file="$read_preset"
|
||||
;;
|
||||
|
||||
"change" )
|
||||
if [[ "$read_preset" == "$current_preset" ]]; then
|
||||
if [[ "$target_file" = \$* ]]; then # Read current target file and resolve if it is a variable
|
||||
declare -g "target_file=$target_file"
|
||||
fi
|
||||
local read_target_file="$target_file"
|
||||
if [[ "$defaults_file" = \$* ]]; then #Read current defaults file and resolve if it is a variable
|
||||
declare -g "defaults_file=$defaults_file"
|
||||
fi
|
||||
local read_defaults_file="$defaults_file"
|
||||
if [[ "$read_system_enabled" == "true" ]]; then
|
||||
if [[ "$new_setting_value" = \$* ]]; then
|
||||
eval new_setting_value=$new_setting_value
|
||||
|
|
61
functions/steam-sync/config.toml
Normal file
|
@ -0,0 +1,61 @@
|
|||
debug = false
|
||||
config_version = 1
|
||||
blacklisted_games = []
|
||||
boilr_tag = "retrodeck"
|
||||
|
||||
[steamgrid_db]
|
||||
enabled = true
|
||||
prefer_animated = false
|
||||
banned_images = []
|
||||
only_download_boilr_images = false
|
||||
allow_nsfw = false
|
||||
|
||||
[steam]
|
||||
create_collections = false
|
||||
optimize_for_big_picture = false
|
||||
stop_steam = false
|
||||
start_steam = false
|
||||
|
||||
[bottles]
|
||||
enabled = false
|
||||
|
||||
[epic_games]
|
||||
enabled = false
|
||||
safe_launch = []
|
||||
|
||||
[flatpak]
|
||||
enabled = false
|
||||
|
||||
[gog]
|
||||
enabled = false
|
||||
create_symlinks = true
|
||||
|
||||
[heroic]
|
||||
enabled = false
|
||||
launch_games_through_heroic = []
|
||||
default_launch_through_heroic = true
|
||||
|
||||
[itch]
|
||||
enabled = false
|
||||
create_symlinks = true
|
||||
|
||||
[legendary]
|
||||
enabled = false
|
||||
|
||||
[lutris]
|
||||
enabled = false
|
||||
executable = "lutris"
|
||||
flatpak = true
|
||||
flatpak_image = "net.lutris.Lutris"
|
||||
installed = true
|
||||
|
||||
[origin]
|
||||
enabled = false
|
||||
|
||||
[uplay]
|
||||
enabled = false
|
||||
|
||||
[minigalaxy]
|
||||
enabled = true
|
||||
create_symlinks = false
|
||||
games_folder = "/var/config/boilr/sync/"
|
|
@ -5,8 +5,9 @@ import re
|
|||
import shlex
|
||||
import shutil
|
||||
import glob
|
||||
import vdf
|
||||
import sys
|
||||
import time
|
||||
import hashlib
|
||||
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
|
@ -267,123 +268,75 @@ alt_command_list={
|
|||
"Beetle PCE": "flatpak run --command=retroarch net.retrodeck.retrodeck -L /var/config/retroarch/cores/mednafen_pce_libretro.so"
|
||||
}
|
||||
|
||||
STEAM_DATA_DIRS = (
|
||||
"~/.steam/debian-installation",
|
||||
"~/.steam",
|
||||
"~/.local/share/steam",
|
||||
"~/.local/share/Steam",
|
||||
"~/.steam/steam",
|
||||
"~/.var/app/com.valvesoftware.Steam/data/steam",
|
||||
"~/.var/app/com.valvesoftware.Steam/data/Steam",
|
||||
"/usr/share/steam",
|
||||
"/usr/local/share/steam",
|
||||
)
|
||||
exit_file="/tmp/retrodeck_steam_sync_exit"
|
||||
rdhome=""
|
||||
roms_folder=""
|
||||
|
||||
def create_shortcut(games, launch_config_name=None):
|
||||
shortcut_path = get_shortcuts_vdf_path()
|
||||
if os.path.exists(shortcut_path):
|
||||
with open(shortcut_path, "rb") as shortcut_file:
|
||||
shortcuts = vdf.binary_loads(shortcut_file.read())['shortcuts'].values()
|
||||
else:
|
||||
shortcuts = []
|
||||
def create_shortcut_new(games):
|
||||
changes=0
|
||||
old_games=os.listdir(rdhome+"/.sync/")
|
||||
|
||||
old_shortcuts=[]
|
||||
for shortcut in shortcuts:
|
||||
if "net.retrodeck.retrodeck" in shortcut["Exe"]:
|
||||
keep=False
|
||||
for game in games:
|
||||
gameid=generate_shortcut_id(game[0])
|
||||
if gameid==shortcut["appid"]:
|
||||
shortcut["Exe"]=game[1]
|
||||
game[0]="###"
|
||||
keep=True
|
||||
break
|
||||
if keep:
|
||||
old_shortcuts.append(shortcut)
|
||||
else:
|
||||
old_shortcuts.append(shortcut)
|
||||
|
||||
new_shortcuts=[]
|
||||
for game in games:
|
||||
if not game[0]=="###":
|
||||
new_shortcuts=new_shortcuts+[generate_shortcut(game, launch_config_name)]
|
||||
try:
|
||||
i=old_games.index(game[0])
|
||||
old_games[i]=0
|
||||
except ValueError:
|
||||
print(game[0]+" is a new game!")
|
||||
changes=1
|
||||
|
||||
shortcuts = list(old_shortcuts) + list(new_shortcuts)
|
||||
path=rdhome+"/.sync/"+game[0]
|
||||
print("Go to path: "+path)
|
||||
if not os.path.exists(path):
|
||||
os.makedirs(path)
|
||||
fl=open(path+"/goggame-0.info","w")
|
||||
fl.write('{\n')
|
||||
fl.write(' "buildId": "",\n')
|
||||
fl.write(' "clientId": "",\n')
|
||||
fl.write(' "gameId": "",\n')
|
||||
fl.write(' "name": "'+game[0]+'",\n')
|
||||
fl.write(' "playTasks": [\n')
|
||||
fl.write(' {\n')
|
||||
fl.write(' "category": "launcher",\n')
|
||||
fl.write(' "isPrimary": true,\n')
|
||||
fl.write(' "languages": [\n')
|
||||
fl.write(' "en-US"\n')
|
||||
fl.write(' ],\n')
|
||||
fl.write(' "name": "'+game[0]+'",\n')
|
||||
fl.write(' "path": "launch.sh",\n')
|
||||
fl.write(' "type": "FileTask"\n')
|
||||
fl.write(' }\n')
|
||||
fl.write(' ]\n')
|
||||
fl.write('}\n')
|
||||
fl.close()
|
||||
|
||||
updated_shortcuts = {
|
||||
'shortcuts': {
|
||||
str(index): elem for index, elem in enumerate(shortcuts)
|
||||
}
|
||||
}
|
||||
with open(shortcut_path, "wb") as shortcut_file:
|
||||
shortcut_file.write(vdf.binary_dumps(updated_shortcuts))
|
||||
fl=open(path+"/launch.sh","w")
|
||||
fl.write("#!/bin/bash\n\n")
|
||||
fl.write('if test "$(whereis flatpak)" = "flatpak:"\n')
|
||||
fl.write("then\n")
|
||||
fl.write("flatpak-spawn --host "+game[1]+"\n")
|
||||
fl.write("else\n")
|
||||
fl.write(game[1]+"\n")
|
||||
fl.write("fi\n")
|
||||
fl.close()
|
||||
|
||||
def get_config_path():
|
||||
config_paths = search_recursive_in_steam_dirs("userdata/**/config/")
|
||||
if not config_paths:
|
||||
return None
|
||||
return config_paths[0]
|
||||
st=os.stat(path+"/launch.sh")
|
||||
os.chmod(path+"/launch.sh", st.st_mode | 0o0111)
|
||||
|
||||
def get_shortcuts_vdf_path():
|
||||
config_path = get_config_path()
|
||||
if not config_path:
|
||||
return None
|
||||
return os.path.join(config_path, "shortcuts.vdf")
|
||||
print("Start removing")
|
||||
print(old_games)
|
||||
for game in old_games:
|
||||
if game:
|
||||
shutil.rmtree(rdhome+"/.sync/"+game)
|
||||
changes=1
|
||||
|
||||
def search_recursive_in_steam_dirs(path_suffix):
|
||||
"""Perform a recursive search based on glob and returns a
|
||||
list of hits"""
|
||||
results = []
|
||||
for candidate in STEAM_DATA_DIRS:
|
||||
glob_path = os.path.join(os.path.expanduser(candidate), path_suffix)
|
||||
for path in glob.glob(glob_path):
|
||||
results.append(path)
|
||||
return results
|
||||
if changes:
|
||||
os.system("boilr --no-ui")
|
||||
|
||||
def generate_shortcut(game, launch_config_name):
|
||||
return {
|
||||
'appid': generate_shortcut_id(game[0]),
|
||||
'appname': f'{game[0]}',
|
||||
'Exe': f'{game[1]}',
|
||||
'StartDir': f'{os.path.expanduser("~")}',
|
||||
'icon': "",
|
||||
'LaunchOptions': "",
|
||||
'IsHidden': 0,
|
||||
'AllowDesktopConfig': 1,
|
||||
'AllowOverlay': 1,
|
||||
'OpenVR': 0,
|
||||
'Devkit': 0,
|
||||
'DevkitOverrideAppID': 0,
|
||||
'LastPlayTime': 0,
|
||||
}
|
||||
|
||||
def generate_preliminary_id(name):
|
||||
unique_id = ''.join(["RetroDECK", name])
|
||||
top = binascii.crc32(str.encode(unique_id, 'utf-8')) | 0x80000000
|
||||
return (top << 32) | 0x02000000
|
||||
|
||||
def generate_shortcut_id(name):
|
||||
return (generate_preliminary_id(name) >> 32) - 0x100000000
|
||||
|
||||
def addToSteam():
|
||||
print("Open RetroDECK config file: {}".format(os.path.expanduser("~/.var/app/net.retrodeck.retrodeck/config/retrodeck/retrodeck.cfg")))
|
||||
|
||||
fl=open(os.path.expanduser("~/.var/app/net.retrodeck.retrodeck/config/retrodeck/retrodeck.cfg"),"r")
|
||||
lines=fl.readlines()
|
||||
for line in lines:
|
||||
if "rdhome" in line:
|
||||
rdhome=line[7:-1]
|
||||
elif "roms_folder" in line:
|
||||
roms_folder=line[12:-1]
|
||||
fl.close()
|
||||
def addToSteam(systems):
|
||||
games=[]
|
||||
|
||||
command_list_default["pico8"]=command_list_default["pico8"].replace("{GAMEDIR}",roms_folder+"/pico8")
|
||||
alt_command_list["PICO-8 Splore (Standalone)"]=alt_command_list["PICO-8 Splore (Standalone)"].replace("{GAMEDIR}",roms_folder+"/pico8")
|
||||
|
||||
for system in os.listdir(rdhome+"/gamelists/"):
|
||||
for system in systems:
|
||||
print("Start parsing system: {}".format(system))
|
||||
|
||||
|
||||
f=open(rdhome+"/gamelists/"+system+"/gamelist.xml","r")
|
||||
f.readline()
|
||||
parser=ET.XMLParser()
|
||||
|
@ -392,7 +345,7 @@ def addToSteam():
|
|||
parser.feed(b'</root>')
|
||||
root=parser.close()
|
||||
f.close()
|
||||
|
||||
|
||||
globalAltEmu=""
|
||||
for subroot in root:
|
||||
if subroot.tag=="alternativeEmulator":
|
||||
|
@ -404,7 +357,7 @@ def addToSteam():
|
|||
name=""
|
||||
favorite=""
|
||||
altemulator=globalAltEmu
|
||||
for tag in game:
|
||||
for tag in game:
|
||||
if tag.tag=="path":
|
||||
path=tag.text
|
||||
elif tag.tag=="name":
|
||||
|
@ -413,7 +366,7 @@ def addToSteam():
|
|||
favorite=tag.text
|
||||
elif tag.tag=="altemulator":
|
||||
altemulator=tag.text
|
||||
|
||||
|
||||
if favorite=="true" and altemulator=="":
|
||||
print("Find favorite game: {}".format(name))
|
||||
games.append([name,command_list_default[system]+" '"+roms_folder+"/"+system+path[1:]+"'"])
|
||||
|
@ -428,8 +381,76 @@ def addToSteam():
|
|||
else:
|
||||
games.append([name,alt_command_list[altemulator]+" '"+roms_folder+"/"+system+path[1:]+"'"])
|
||||
print(alt_command_list[altemulator]+" '"+roms_folder+"/"+system+path[1:]+"'")
|
||||
|
||||
create_shortcut(games)
|
||||
if not games==[]:
|
||||
create_shortcut_new(games)
|
||||
|
||||
def start_config():
|
||||
global rdhome
|
||||
global roms_folder
|
||||
global command_list_default
|
||||
global alt_command_list
|
||||
|
||||
if os.path.isfile(exit_file):
|
||||
os.remove(exit_file)
|
||||
|
||||
print("Open RetroDECK config file: {}".format(os.path.expanduser("~/.var/app/net.retrodeck.retrodeck/config/retrodeck/retrodeck.cfg")))
|
||||
|
||||
fl=open(os.path.expanduser("~/.var/app/net.retrodeck.retrodeck/config/retrodeck/retrodeck.cfg"),"r")
|
||||
lines=fl.readlines()
|
||||
for line in lines:
|
||||
if "rdhome" in line:
|
||||
rdhome=line[7:-1]
|
||||
elif "roms_folder" in line:
|
||||
roms_folder=line[12:-1]
|
||||
fl.close()
|
||||
|
||||
command_list_default["pico8"]=command_list_default["pico8"].replace("{GAMEDIR}",roms_folder+"/pico8")
|
||||
alt_command_list["PICO-8 Splore (Standalone)"]=alt_command_list["PICO-8 Splore (Standalone)"].replace("{GAMEDIR}",roms_folder+"/pico8")
|
||||
|
||||
if not os.path.exists(rdhome+"/.sync/"):
|
||||
os.makedirs(rdhome+"/.sync/")
|
||||
|
||||
boilr_path=os.path.expanduser("~/.var/app/net.retrodeck.retrodeck/config/boilr/config.toml")
|
||||
if os.path.isfile(boilr_path):
|
||||
with open(boilr_path,"r") as f:
|
||||
data=f.read()
|
||||
data=re.sub("\"games_folder.*","games_folder = "+rdhome+"/.sync/\"",data)
|
||||
with open(boilr_path,"w") as f:
|
||||
f.write(data)
|
||||
else:
|
||||
print("Error! BoilR config not initialized.")
|
||||
|
||||
if __name__=="__main__":
|
||||
addToSteam()
|
||||
start_config()
|
||||
|
||||
new_hash={}
|
||||
for system in os.listdir(rdhome+"/gamelists/"):
|
||||
new_hash[system]=hashlib.md5(open(rdhome+"/gamelists/"+system+"/gamelist.xml","rb").read()).hexdigest()
|
||||
|
||||
running=True
|
||||
|
||||
while running:
|
||||
time.sleep(30)
|
||||
systems=[]
|
||||
|
||||
for system in os.listdir(rdhome+"/gamelists/"):
|
||||
if not system in systems:
|
||||
if system in new_hash.keys():
|
||||
old_hash=new_hash[system]
|
||||
new_hash[system]=hashlib.md5(open(rdhome+"/gamelists/"+system+"/gamelist.xml","rb").read()).hexdigest()
|
||||
if not new_hash[system] == old_hash:
|
||||
print("System {} changed!".format(system))
|
||||
systems.append(system)
|
||||
else:
|
||||
print("System {} not changed!".format(system))
|
||||
else:
|
||||
new_hash[system]=hashlib.md5(open(rdhome+"/gamelists/"+system+"/gamelist.xml","rb").read()).hexdigest()
|
||||
print("System {} added!".format(system))
|
||||
systems.append(system)
|
||||
|
||||
if os.path.isfile(exit_file):
|
||||
running=False
|
||||
os.remove(exit_file)
|
||||
|
||||
addToSteam(systems)
|
||||
print("Finish!")
|
||||
|
|
|
@ -1,467 +0,0 @@
|
|||
"""
|
||||
Module for deserializing/serializing to and from VDF
|
||||
|
||||
https://github.com/ValvePython/vdf
|
||||
|
||||
MIT License
|
||||
"""
|
||||
# pylint: disable=raise-missing-from
|
||||
|
||||
__version__ = "3.2"
|
||||
__author__ = "Rossen Georgiev"
|
||||
|
||||
import re
|
||||
import struct
|
||||
from binascii import crc32
|
||||
from io import StringIO as unicodeIO
|
||||
|
||||
string_type = str
|
||||
int_type = int
|
||||
BOMS = '\ufffe\ufeff'
|
||||
|
||||
|
||||
def strip_bom(line):
|
||||
return line.lstrip(BOMS)
|
||||
|
||||
|
||||
# string escaping
|
||||
_unescape_char_map = {
|
||||
r"\n": "\n",
|
||||
r"\t": "\t",
|
||||
r"\v": "\v",
|
||||
r"\b": "\b",
|
||||
r"\r": "\r",
|
||||
r"\f": "\f",
|
||||
r"\a": "\a",
|
||||
r"\\": "\\",
|
||||
r"\?": "?",
|
||||
r"\"": "\"",
|
||||
r"\'": "\'",
|
||||
}
|
||||
_escape_char_map = {v: k for k, v in _unescape_char_map.items()}
|
||||
|
||||
|
||||
def _re_escape_match(m):
|
||||
return _escape_char_map[m.group()]
|
||||
|
||||
|
||||
def _re_unescape_match(m):
|
||||
return _unescape_char_map[m.group()]
|
||||
|
||||
|
||||
def _escape(text):
|
||||
return re.sub(r"[\n\t\v\b\r\f\a\\\?\"']", _re_escape_match, text)
|
||||
|
||||
|
||||
def _unescape(text):
|
||||
return re.sub(r"(\\n|\\t|\\v|\\b|\\r|\\f|\\a|\\\\|\\\?|\\\"|\\')", _re_unescape_match, text)
|
||||
|
||||
# parsing and dumping for KV1
|
||||
|
||||
|
||||
def parse(fp, mapper=dict, merge_duplicate_keys=True, escaped=True):
|
||||
"""
|
||||
Deserialize ``s`` (a ``str`` or ``unicode`` instance containing a VDF)
|
||||
to a Python object.
|
||||
|
||||
``mapper`` specifies the Python object used after deserializetion. ``dict` is
|
||||
used by default. Alternatively, ``collections.OrderedDict`` can be used if you
|
||||
wish to preserve key order. Or any object that acts like a ``dict``.
|
||||
|
||||
``merge_duplicate_keys`` when ``True`` will merge multiple KeyValue lists with the
|
||||
same key into one instead of overwriting. You can se this to ``False`` if you are
|
||||
using ``VDFDict`` and need to preserve the duplicates.
|
||||
"""
|
||||
if not issubclass(mapper, dict):
|
||||
raise TypeError("Expected mapper to be subclass of dict, got %s" % type(mapper))
|
||||
if not hasattr(fp, 'readline'):
|
||||
raise TypeError("Expected fp to be a file-like object supporting line iteration")
|
||||
|
||||
lineno = 0
|
||||
stack = [mapper()]
|
||||
expect_bracket = False
|
||||
|
||||
re_keyvalue = re.compile(r'^("(?P<qkey>(?:\\.|[^\\"])+)"|(?P<key>#?[a-z0-9\-\_\\\?]+))'
|
||||
r'([ \t]*('
|
||||
r'"(?P<qval>(?:\\.|[^\\"])*)(?P<vq_end>")?'
|
||||
r'|(?P<val>[a-z0-9\-\_\\\?\*\.]+)'
|
||||
r'))?',
|
||||
flags=re.I)
|
||||
|
||||
for lineno, line in enumerate(fp, 1):
|
||||
if lineno == 1:
|
||||
line = strip_bom(line)
|
||||
|
||||
line = line.lstrip()
|
||||
|
||||
# skip empty and comment lines
|
||||
if line == "" or line[0] == '/':
|
||||
continue
|
||||
|
||||
# one level deeper
|
||||
if line[0] == "{":
|
||||
expect_bracket = False
|
||||
continue
|
||||
|
||||
if expect_bracket:
|
||||
raise SyntaxError("vdf.parse: expected openning bracket",
|
||||
(getattr(fp, 'name', '<%s>' % fp.__class__.__name__), lineno, 1, line))
|
||||
|
||||
# one level back
|
||||
if line[0] == "}":
|
||||
if len(stack) > 1:
|
||||
stack.pop()
|
||||
continue
|
||||
|
||||
raise SyntaxError("vdf.parse: one too many closing parenthasis",
|
||||
(getattr(fp, 'name', '<%s>' % fp.__class__.__name__), lineno, 0, line))
|
||||
|
||||
# parse keyvalue pairs
|
||||
while True:
|
||||
match = re_keyvalue.match(line)
|
||||
|
||||
if not match:
|
||||
try:
|
||||
line += next(fp)
|
||||
continue
|
||||
except StopIteration:
|
||||
raise SyntaxError("vdf.parse: unexpected EOF (open key quote?)",
|
||||
(getattr(fp, 'name', '<%s>' % fp.__class__.__name__), lineno, 0, line))
|
||||
|
||||
key = match.group('key') if match.group('qkey') is None else match.group('qkey')
|
||||
val = match.group('val') if match.group('qval') is None else match.group('qval')
|
||||
|
||||
if escaped:
|
||||
key = _unescape(key)
|
||||
|
||||
# we have a key with value in parenthesis, so we make a new dict obj (level deeper)
|
||||
if val is None:
|
||||
if merge_duplicate_keys and key in stack[-1]:
|
||||
_m = stack[-1][key]
|
||||
else:
|
||||
_m = mapper()
|
||||
stack[-1][key] = _m
|
||||
|
||||
stack.append(_m)
|
||||
expect_bracket = True
|
||||
|
||||
# we've matched a simple keyvalue pair, map it to the last dict obj in the stack
|
||||
else:
|
||||
# if the value is line consume one more line and try to match again,
|
||||
# until we get the KeyValue pair
|
||||
if match.group('vq_end') is None and match.group('qval') is not None:
|
||||
try:
|
||||
line += next(fp)
|
||||
continue
|
||||
except StopIteration:
|
||||
raise SyntaxError("vdf.parse: unexpected EOF (open quote for value?)",
|
||||
(getattr(fp, 'name', '<%s>' % fp.__class__.__name__), lineno, 0, line))
|
||||
|
||||
stack[-1][key] = _unescape(val) if escaped else val
|
||||
|
||||
# exit the loop
|
||||
break
|
||||
|
||||
if len(stack) != 1:
|
||||
raise SyntaxError("vdf.parse: unclosed parenthasis or quotes (EOF)",
|
||||
(getattr(fp, 'name', '<%s>' % fp.__class__.__name__), lineno, 0, line))
|
||||
|
||||
return stack.pop()
|
||||
|
||||
|
||||
def loads(s, **kwargs):
|
||||
"""
|
||||
Deserialize ``s`` (a ``str`` or ``unicode`` instance containing a JSON
|
||||
document) to a Python object.
|
||||
"""
|
||||
if not isinstance(s, string_type):
|
||||
raise TypeError("Expected s to be a str, got %s" % type(s))
|
||||
fp = unicodeIO(s)
|
||||
return parse(fp, **kwargs)
|
||||
|
||||
|
||||
def load(fp, **kwargs):
|
||||
"""
|
||||
Deserialize ``fp`` (a ``.readline()``-supporting file-like object containing
|
||||
a JSON document) to a Python object.
|
||||
"""
|
||||
return parse(fp, **kwargs)
|
||||
|
||||
|
||||
def dumps(obj, pretty=False, escaped=True):
|
||||
"""
|
||||
Serialize ``obj`` to a VDF formatted ``str``.
|
||||
"""
|
||||
if not isinstance(obj, dict):
|
||||
raise TypeError("Expected data to be an instance of``dict``")
|
||||
if not isinstance(pretty, bool):
|
||||
raise TypeError("Expected pretty to be of type bool")
|
||||
if not isinstance(escaped, bool):
|
||||
raise TypeError("Expected escaped to be of type bool")
|
||||
|
||||
return ''.join(_dump_gen(obj, pretty, escaped))
|
||||
|
||||
|
||||
def dump(obj, fp, pretty=False, escaped=True):
|
||||
"""
|
||||
Serialize ``obj`` as a VDF formatted stream to ``fp`` (a
|
||||
``.write()``-supporting file-like object).
|
||||
"""
|
||||
if not isinstance(obj, dict):
|
||||
raise TypeError("Expected data to be an instance of``dict``")
|
||||
if not hasattr(fp, 'write'):
|
||||
raise TypeError("Expected fp to have write() method")
|
||||
if not isinstance(pretty, bool):
|
||||
raise TypeError("Expected pretty to be of type bool")
|
||||
if not isinstance(escaped, bool):
|
||||
raise TypeError("Expected escaped to be of type bool")
|
||||
|
||||
for chunk in _dump_gen(obj, pretty, escaped):
|
||||
fp.write(chunk)
|
||||
|
||||
|
||||
def _dump_gen(data, pretty=False, escaped=True, level=0):
|
||||
indent = "\t"
|
||||
line_indent = ""
|
||||
|
||||
if pretty:
|
||||
line_indent = indent * level
|
||||
|
||||
for key, value in data.items():
|
||||
if escaped and isinstance(key, string_type):
|
||||
key = _escape(key)
|
||||
|
||||
if isinstance(value, dict):
|
||||
yield '%s"%s"\n%s{\n' % (line_indent, key, line_indent)
|
||||
for chunk in _dump_gen(value, pretty, escaped, level + 1):
|
||||
yield chunk
|
||||
yield "%s}\n" % line_indent
|
||||
else:
|
||||
if escaped and isinstance(value, string_type):
|
||||
value = _escape(value)
|
||||
|
||||
yield '%s"%s" "%s"\n' % (line_indent, key, value)
|
||||
|
||||
|
||||
# binary VDF
|
||||
class BASE_INT(int_type):
|
||||
def __repr__(self):
|
||||
return "%s(%s)" % (self.__class__.__name__, self)
|
||||
|
||||
|
||||
class UINT_64(BASE_INT):
|
||||
pass
|
||||
|
||||
|
||||
class INT_64(BASE_INT):
|
||||
pass
|
||||
|
||||
|
||||
class POINTER(BASE_INT):
|
||||
pass
|
||||
|
||||
|
||||
class COLOR(BASE_INT):
|
||||
pass
|
||||
|
||||
|
||||
BIN_NONE = b'\x00'
|
||||
BIN_STRING = b'\x01'
|
||||
BIN_INT32 = b'\x02'
|
||||
BIN_FLOAT32 = b'\x03'
|
||||
BIN_POINTER = b'\x04'
|
||||
BIN_WIDESTRING = b'\x05'
|
||||
BIN_COLOR = b'\x06'
|
||||
BIN_UINT64 = b'\x07'
|
||||
BIN_END = b'\x08'
|
||||
BIN_INT64 = b'\x0A'
|
||||
BIN_END_ALT = b'\x0B'
|
||||
|
||||
|
||||
def binary_loads(s, mapper=dict, merge_duplicate_keys=True, alt_format=False):
|
||||
"""
|
||||
Deserialize ``s`` (``bytes`` containing a VDF in "binary form")
|
||||
to a Python object.
|
||||
|
||||
``mapper`` specifies the Python object used after deserializetion. ``dict` is
|
||||
used by default. Alternatively, ``collections.OrderedDict`` can be used if you
|
||||
wish to preserve key order. Or any object that acts like a ``dict``.
|
||||
|
||||
``merge_duplicate_keys`` when ``True`` will merge multiple KeyValue lists with the
|
||||
same key into one instead of overwriting. You can se this to ``False`` if you are
|
||||
using ``VDFDict`` and need to preserve the duplicates.
|
||||
"""
|
||||
if not isinstance(s, bytes):
|
||||
raise TypeError("Expected s to be bytes, got %s" % type(s))
|
||||
if not issubclass(mapper, dict):
|
||||
raise TypeError("Expected mapper to be subclass of dict, got %s" % type(mapper))
|
||||
|
||||
# helpers
|
||||
int32 = struct.Struct('<i')
|
||||
uint64 = struct.Struct('<Q')
|
||||
int64 = struct.Struct('<q')
|
||||
float32 = struct.Struct('<f')
|
||||
|
||||
def read_string(s, idx, wide=False):
|
||||
if wide:
|
||||
end = s.find(b'\x00\x00', idx)
|
||||
if (end - idx) % 2 != 0:
|
||||
end += 1
|
||||
else:
|
||||
end = s.find(b'\x00', idx)
|
||||
|
||||
if end == -1:
|
||||
raise SyntaxError("Unterminated cstring (offset: %d)" % idx)
|
||||
result = s[idx:end]
|
||||
if wide:
|
||||
result = result.decode('utf-16')
|
||||
elif bytes is not str:
|
||||
result = result.decode('utf-8', 'replace')
|
||||
else:
|
||||
try:
|
||||
result.decode('ascii')
|
||||
except:
|
||||
result = result.decode('utf-8', 'replace')
|
||||
return result, end + (2 if wide else 1)
|
||||
|
||||
stack = [mapper()]
|
||||
idx = 0
|
||||
CURRENT_BIN_END = BIN_END if not alt_format else BIN_END_ALT
|
||||
|
||||
while len(s) > idx:
|
||||
t = s[idx:idx + 1]
|
||||
idx += 1
|
||||
|
||||
if t == CURRENT_BIN_END:
|
||||
if len(stack) > 1:
|
||||
stack.pop()
|
||||
continue
|
||||
break
|
||||
|
||||
key, idx = read_string(s, idx)
|
||||
|
||||
if t == BIN_NONE:
|
||||
if merge_duplicate_keys and key in stack[-1]:
|
||||
_m = stack[-1][key]
|
||||
else:
|
||||
_m = mapper()
|
||||
stack[-1][key] = _m
|
||||
stack.append(_m)
|
||||
elif t == BIN_STRING:
|
||||
stack[-1][key], idx = read_string(s, idx)
|
||||
elif t == BIN_WIDESTRING:
|
||||
stack[-1][key], idx = read_string(s, idx, wide=True)
|
||||
elif t in (BIN_INT32, BIN_POINTER, BIN_COLOR):
|
||||
val = int32.unpack_from(s, idx)[0]
|
||||
|
||||
if t == BIN_POINTER:
|
||||
val = POINTER(val)
|
||||
elif t == BIN_COLOR:
|
||||
val = COLOR(val)
|
||||
|
||||
stack[-1][key] = val
|
||||
idx += int32.size
|
||||
elif t == BIN_UINT64:
|
||||
stack[-1][key] = UINT_64(uint64.unpack_from(s, idx)[0])
|
||||
idx += uint64.size
|
||||
elif t == BIN_INT64:
|
||||
stack[-1][key] = INT_64(int64.unpack_from(s, idx)[0])
|
||||
idx += int64.size
|
||||
elif t == BIN_FLOAT32:
|
||||
stack[-1][key] = float32.unpack_from(s, idx)[0]
|
||||
idx += float32.size
|
||||
else:
|
||||
raise SyntaxError("Unknown data type at offset %d: %s" % (idx - 1, repr(t)))
|
||||
|
||||
if len(s) != idx or len(stack) != 1:
|
||||
raise SyntaxError("Binary VDF ended at offset %d, but length is %d" % (idx, len(s)))
|
||||
|
||||
return stack.pop()
|
||||
|
||||
|
||||
def binary_dumps(obj, alt_format=False):
|
||||
"""
|
||||
Serialize ``obj`` to a binary VDF formatted ``bytes``.
|
||||
"""
|
||||
return b''.join(_binary_dump_gen(obj, alt_format=alt_format))
|
||||
|
||||
|
||||
def _binary_dump_gen(obj, level=0, alt_format=False):
|
||||
if level == 0 and len(obj) == 0:
|
||||
return
|
||||
|
||||
int32 = struct.Struct('<i')
|
||||
uint64 = struct.Struct('<Q')
|
||||
int64 = struct.Struct('<q')
|
||||
float32 = struct.Struct('<f')
|
||||
|
||||
for key, value in obj.items():
|
||||
if isinstance(key, string_type):
|
||||
key = key.encode('utf-8')
|
||||
else:
|
||||
raise TypeError("dict keys must be of type str, got %s" % type(key))
|
||||
|
||||
if isinstance(value, dict):
|
||||
yield BIN_NONE + key + BIN_NONE
|
||||
for chunk in _binary_dump_gen(value, level + 1, alt_format=alt_format):
|
||||
yield chunk
|
||||
elif isinstance(value, UINT_64):
|
||||
yield BIN_UINT64 + key + BIN_NONE + uint64.pack(value)
|
||||
elif isinstance(value, INT_64):
|
||||
yield BIN_INT64 + key + BIN_NONE + int64.pack(value)
|
||||
elif isinstance(value, string_type):
|
||||
try:
|
||||
value = value.encode('utf-8') + BIN_NONE
|
||||
yield BIN_STRING
|
||||
except:
|
||||
value = value.encode('utf-16') + BIN_NONE * 2
|
||||
yield BIN_WIDESTRING
|
||||
yield key + BIN_NONE + value
|
||||
elif isinstance(value, float):
|
||||
yield BIN_FLOAT32 + key + BIN_NONE + float32.pack(value)
|
||||
elif isinstance(value, (COLOR, POINTER, int, int_type)):
|
||||
if isinstance(value, COLOR):
|
||||
yield BIN_COLOR
|
||||
elif isinstance(value, POINTER):
|
||||
yield BIN_POINTER
|
||||
else:
|
||||
yield BIN_INT32
|
||||
yield key + BIN_NONE
|
||||
yield int32.pack(value)
|
||||
else:
|
||||
raise TypeError("Unsupported type: %s" % type(value))
|
||||
|
||||
yield BIN_END if not alt_format else BIN_END_ALT
|
||||
|
||||
|
||||
def vbkv_loads(s, mapper=dict, merge_duplicate_keys=True):
|
||||
"""
|
||||
Deserialize ``s`` (``bytes`` containing a VBKV to a Python object.
|
||||
|
||||
``mapper`` specifies the Python object used after deserializetion. ``dict` is
|
||||
used by default. Alternatively, ``collections.OrderedDict`` can be used if you
|
||||
wish to preserve key order. Or any object that acts like a ``dict``.
|
||||
|
||||
``merge_duplicate_keys`` when ``True`` will merge multiple KeyValue lists with the
|
||||
same key into one instead of overwriting. You can se this to ``False`` if you are
|
||||
using ``VDFDict`` and need to preserve the duplicates.
|
||||
"""
|
||||
if s[:4] != b'VBKV':
|
||||
raise ValueError("Invalid header")
|
||||
|
||||
checksum, = struct.unpack('<i', s[4:8])
|
||||
|
||||
if checksum != crc32(s[8:]):
|
||||
raise ValueError("Invalid checksum")
|
||||
|
||||
return binary_loads(s[8:], mapper, merge_duplicate_keys, alt_format=True)
|
||||
|
||||
|
||||
def vbkv_dumps(obj):
|
||||
"""
|
||||
Serialize ``obj`` to a VBKV formatted ``bytes``.
|
||||
"""
|
||||
data = b''.join(_binary_dump_gen(obj, alt_format=True))
|
||||
checksum = crc32(data)
|
||||
|
||||
return b'VBKV' + struct.pack('<i', checksum) + data
|
|
@ -1,219 +0,0 @@
|
|||
# pylint: disable=no-member,unnecessary-dunder-call
|
||||
from collections import Counter
|
||||
|
||||
_iter_values = 'values'
|
||||
_range = range
|
||||
_string_type = str
|
||||
import collections as _c
|
||||
|
||||
|
||||
class _kView(_c.KeysView):
|
||||
def __iter__(self):
|
||||
return self._mapping.iterkeys()
|
||||
|
||||
|
||||
class _vView(_c.ValuesView):
|
||||
def __iter__(self):
|
||||
return self._mapping.itervalues()
|
||||
|
||||
|
||||
class _iView(_c.ItemsView):
|
||||
def __iter__(self):
|
||||
return self._mapping.iteritems()
|
||||
|
||||
|
||||
class VDFDict(dict):
|
||||
def __init__(self, data=None):
|
||||
"""
|
||||
This is a dictionary that supports duplicate keys and preserves insert order
|
||||
|
||||
``data`` can be a ``dict``, or a sequence of key-value tuples. (e.g. ``[('key', 'value'),..]``)
|
||||
The only supported type for key is str.
|
||||
|
||||
Get/set duplicates is done by tuples ``(index, key)``, where index is the duplicate index
|
||||
for the specified key. (e.g. ``(0, 'key')``, ``(1, 'key')``...)
|
||||
|
||||
When the ``key`` is ``str``, instead of tuple, set will create a duplicate and get will look up ``(0, key)``
|
||||
"""
|
||||
super().__init__()
|
||||
self.__omap = []
|
||||
self.__kcount = Counter()
|
||||
|
||||
if data is not None:
|
||||
if not isinstance(data, (list, dict)):
|
||||
raise ValueError("Expected data to be list of pairs or dict, got %s" % type(data))
|
||||
self.update(data)
|
||||
|
||||
def __repr__(self):
|
||||
out = "%s(" % self.__class__.__name__
|
||||
out += "%s)" % repr(list(self.iteritems()))
|
||||
return out
|
||||
|
||||
def __len__(self):
|
||||
return len(self.__omap)
|
||||
|
||||
def _verify_key_tuple(self, key):
|
||||
if len(key) != 2:
|
||||
raise ValueError("Expected key tuple length to be 2, got %d" % len(key))
|
||||
if not isinstance(key[0], int):
|
||||
raise TypeError("Key index should be an int")
|
||||
if not isinstance(key[1], _string_type):
|
||||
raise TypeError("Key value should be a str")
|
||||
|
||||
def _normalize_key(self, key):
|
||||
if isinstance(key, _string_type):
|
||||
key = (0, key)
|
||||
elif isinstance(key, tuple):
|
||||
self._verify_key_tuple(key)
|
||||
else:
|
||||
raise TypeError("Expected key to be a str or tuple, got %s" % type(key))
|
||||
return key
|
||||
|
||||
def __setitem__(self, key, value):
|
||||
if isinstance(key, _string_type):
|
||||
key = (self.__kcount[key], key)
|
||||
self.__omap.append(key)
|
||||
elif isinstance(key, tuple):
|
||||
self._verify_key_tuple(key)
|
||||
if key not in self:
|
||||
raise KeyError("%s doesn't exist" % repr(key))
|
||||
else:
|
||||
raise TypeError("Expected either a str or tuple for key")
|
||||
super().__setitem__(key, value)
|
||||
self.__kcount[key[1]] += 1
|
||||
|
||||
def __getitem__(self, key):
|
||||
return super().__getitem__(self._normalize_key(key))
|
||||
|
||||
def __delitem__(self, key):
|
||||
key = self._normalize_key(key)
|
||||
result = super().__delitem__(key)
|
||||
|
||||
start_idx = self.__omap.index(key)
|
||||
del self.__omap[start_idx]
|
||||
|
||||
dup_idx, skey = key
|
||||
self.__kcount[skey] -= 1
|
||||
tail_count = self.__kcount[skey] - dup_idx
|
||||
|
||||
if tail_count > 0:
|
||||
for idx in _range(start_idx, len(self.__omap)):
|
||||
if self.__omap[idx][1] == skey:
|
||||
oldkey = self.__omap[idx]
|
||||
newkey = (dup_idx, skey)
|
||||
super().__setitem__(newkey, self[oldkey])
|
||||
super().__delitem__(oldkey)
|
||||
self.__omap[idx] = newkey
|
||||
|
||||
dup_idx += 1
|
||||
tail_count -= 1
|
||||
if tail_count == 0:
|
||||
break
|
||||
|
||||
if self.__kcount[skey] == 0:
|
||||
del self.__kcount[skey]
|
||||
|
||||
return result
|
||||
|
||||
def __iter__(self):
|
||||
return iter(self.iterkeys())
|
||||
|
||||
def __contains__(self, key):
|
||||
return super().__contains__(self._normalize_key(key))
|
||||
|
||||
def __eq__(self, other):
|
||||
if isinstance(other, VDFDict):
|
||||
return list(self.items()) == list(other.items())
|
||||
return False
|
||||
|
||||
def __ne__(self, other):
|
||||
return not self.__eq__(other)
|
||||
|
||||
def clear(self):
|
||||
super().clear()
|
||||
self.__kcount.clear()
|
||||
self.__omap = []
|
||||
|
||||
def get(self, key, *args):
|
||||
return super().get(self._normalize_key(key), *args)
|
||||
|
||||
def setdefault(self, key, default=None):
|
||||
if key not in self:
|
||||
self.__setitem__(key, default)
|
||||
return self.__getitem__(key)
|
||||
|
||||
def pop(self, key):
|
||||
key = self._normalize_key(key)
|
||||
value = self.__getitem__(key)
|
||||
self.__delitem__(key)
|
||||
return value
|
||||
|
||||
def popitem(self):
|
||||
if not self.__omap:
|
||||
raise KeyError("VDFDict is empty")
|
||||
key = self.__omap[-1]
|
||||
return key[1], self.pop(key)
|
||||
|
||||
def update(self, data=None, **kwargs):
|
||||
if isinstance(data, dict):
|
||||
data = data.items()
|
||||
elif not isinstance(data, list):
|
||||
raise TypeError("Expected data to be a list or dict, got %s" % type(data))
|
||||
|
||||
for key, value in data:
|
||||
self.__setitem__(key, value)
|
||||
|
||||
def iterkeys(self):
|
||||
return (key[1] for key in self.__omap)
|
||||
|
||||
def keys(self):
|
||||
return _kView(self)
|
||||
|
||||
def itervalues(self):
|
||||
return (self[key] for key in self.__omap)
|
||||
|
||||
def values(self):
|
||||
return _vView(self)
|
||||
|
||||
def iteritems(self):
|
||||
return ((key[1], self[key]) for key in self.__omap)
|
||||
|
||||
def items(self):
|
||||
return _iView(self)
|
||||
|
||||
def get_all_for(self, key):
|
||||
""" Returns all values of the given key """
|
||||
if not isinstance(key, _string_type):
|
||||
raise TypeError("Key needs to be a string.")
|
||||
return [self[(idx, key)] for idx in _range(self.__kcount[key])]
|
||||
|
||||
def remove_all_for(self, key):
|
||||
""" Removes all items with the given key """
|
||||
if not isinstance(key, _string_type):
|
||||
raise TypeError("Key need to be a string.")
|
||||
|
||||
for idx in _range(self.__kcount[key]):
|
||||
super().__delitem__((idx, key))
|
||||
|
||||
self.__omap = list(filter(lambda x: x[1] != key, self.__omap))
|
||||
|
||||
del self.__kcount[key]
|
||||
|
||||
def has_duplicates(self):
|
||||
"""
|
||||
Returns ``True`` if the dict contains keys with duplicates.
|
||||
Recurses through any all keys with value that is ``VDFDict``.
|
||||
"""
|
||||
for n in getattr(self.__kcount, _iter_values)():
|
||||
if n != 1:
|
||||
return True
|
||||
|
||||
def dict_recurse(obj):
|
||||
for v in getattr(obj, _iter_values)():
|
||||
if isinstance(v, VDFDict) and v.has_duplicates():
|
||||
return True
|
||||
if isinstance(v, dict):
|
||||
return dict_recurse(v)
|
||||
return False
|
||||
|
||||
return dict_recurse(self)
|
|
@ -68,27 +68,65 @@
|
|||
<release version="0.8.0b" date="2023-12-14">
|
||||
<url>https://github.com/XargonWan/RetroDECK/releases/tag/0.8.0b</url>
|
||||
<description>
|
||||
<p>CRITICAL:</p>
|
||||
<ul>
|
||||
<li>DEEP TEST: prepare_emulator function is now called prepare_component, eidted even in the cli and split it into the Configurator, so we need to test if the reset emulator works as supposed, if the cli and the Configurator is consistent.</li>
|
||||
</ul>
|
||||
<p>Changes:</p>
|
||||
<ul>
|
||||
<li>Added new system: SOLARUS</li>
|
||||
<li>Added new engine: GZDOOM</li>
|
||||
<li>Added new emulator: Vita3K - Reset the emulator to grap the lates changes</li>
|
||||
<li>Added new emulator: MAME (Standalone)</li>
|
||||
<li>PPSSPP: added hotkeys</li>
|
||||
<li>DOLPHIN: improved wiimote pointer emulation for controllers</li>
|
||||
<li>Added Steam Sync (with BoilR)</li>
|
||||
<li>Quit button after emulators reset should act as an actual full quit button</li>
|
||||
<li>Created a quit_retrodeck function to ease the quit in the scripts.</li>
|
||||
<li>Logs folder is now in retrodeck/logs (previously was .logs)</li>
|
||||
<li>The post update script is initializing vita3k, mame and boilr when coming from a version ealrier that 0.8.0, this don't work in cokker and must be resetted manually (for boilr reset RetroDECK)</li>
|
||||
<li>RPCS3 is now running via shortcut (.desktop file) by default - WARN THE USERS TO MIGRATE</li>
|
||||
<li>Added controller config for PS4 and PS5</li>
|
||||
<li>Controller config overhaul</li>
|
||||
<li>Removed talk names in the manifest as they're not needed anymore as enabled by default</li>
|
||||
</ul>
|
||||
<p>Fixes:</p>
|
||||
<ul>
|
||||
<li>GZDOOM: now the controller should work properly</li>
|
||||
<li>GZDOOM: can automatically detect if the loaded file is a WAD or an IWAD</li>
|
||||
<li>Fixed DUCKSTATION memory card folder</li>
|
||||
<li>Fixed RPCS3 saves folder (wrong symlink) - WRN THE USERS TO BACKUP</li>
|
||||
<li>Fixed issues that prevents Steam Sync to work correctly</li>
|
||||
</ul>
|
||||
<p>Issues:</p>
|
||||
<ul>
|
||||
<li>VITA3K is not working, waiting for external fixes</li>
|
||||
<li>MAME (standalone) is not working, more enhancements needed</li>
|
||||
<li>!!! WARNING !!! Steam Sync is now REPLACING your Standalone BoilR links with RetroDECK's, use it at your own risk!</li>
|
||||
<li>GZDOOM: the controller for player 2+ is not correctly configured</li>
|
||||
<li>quit_retrodeck function seems to not working correctly</li>
|
||||
<li>MAME (Standalone) paths should be fixed</li>
|
||||
</ul>
|
||||
<p>Missing:</p>
|
||||
<ul>
|
||||
<li>GZDOOM: hotkeys</li>
|
||||
<li>SOLARUS: hotkeys</li>
|
||||
<li>A proper reset script for the new emulators, now it's just a draft</li>
|
||||
<li>MAME (Standalone): hotkeys</li>
|
||||
<li>A proper reset script for the new emulators, now it's just a draft (only Vita3K is done)</li>
|
||||
</ul>
|
||||
</description>
|
||||
</release>
|
||||
<release version="0.7.6b" date="2024-02-08">
|
||||
<url>https://github.com/XargonWan/RetroDECK/releases/tag/0.7.6b</url>
|
||||
<description>
|
||||
<p>Changes:</p>
|
||||
<ul>
|
||||
<li>Added new splash screens for Lunar New Year, St. Valentines and St. Patricks, be sure to check them out!</li>
|
||||
<li>Updated PPSSPP</li>
|
||||
<li>PPSSPP: implemented combo hotkeys, more details in the wiki</li>
|
||||
<li>Reworked building pipelines andautomations</li>
|
||||
<li>Removed talk names in the manifest as they're not needed anymore as enabled by default</li>
|
||||
<li>Fixed a sync issue with the RetroDECK controller profiles</li>
|
||||
</ul>
|
||||
<p>Known issues:</p>
|
||||
<ul>
|
||||
<li>Please check the know issues in the Wiki under General Infomration.</li>
|
||||
</ul>
|
||||
</description>
|
||||
</release>
|
||||
|
@ -737,4 +775,4 @@
|
|||
</description>
|
||||
</release>
|
||||
</releases>
|
||||
</component>
|
||||
</component>
|
||||
|
|
|
@ -3,20 +3,12 @@ runtime: org.kde.Platform
|
|||
runtime-version: "6.5"
|
||||
sdk: org.kde.Sdk
|
||||
sdk-extensions:
|
||||
- org.freedesktop.Sdk.Extension.llvm16 # Needed for rpcs3 (llvm15) but llvm16 for CITRA
|
||||
- org.freedesktop.Sdk.Extension.llvm16 # Needed for rpcs3 (llvm15) but llvm16 for CITRA
|
||||
- org.freedesktop.Sdk.Extension.rust-stable # Needed for BoilR
|
||||
# base: io.qt.qtwebengine.BaseApp # Needed for Yuzu - Disabled as we're using AppImage for Yuzu
|
||||
# base-version: "6.5" # Needed for Yuzu - Disabled as we're using AppImage for Yuzu
|
||||
command: retrodeck.sh
|
||||
|
||||
add-extensions:
|
||||
org.ppsspp.PPSSPP.Locale:
|
||||
directory: share/locale
|
||||
bundle: true
|
||||
no-autodownload: false
|
||||
subdirectories: false
|
||||
autodelete: true
|
||||
locale-subset: true
|
||||
|
||||
finish-args:
|
||||
- --socket=fallback-x11
|
||||
- --socket=wayland
|
||||
|
@ -27,14 +19,15 @@ finish-args:
|
|||
- --filesystem=home
|
||||
- --filesystem=/run/media
|
||||
- --filesystem=/media
|
||||
- --filesystem=/mnt
|
||||
- --filesystem=home/.var/app/com.valvesoftware.Steam
|
||||
- --allow=multiarch
|
||||
- --talk-name=org.freedesktop.ScreenSaver
|
||||
- --talk-name=org.freedesktop.PowerManagement.Inhibit
|
||||
- --talk-name=org.freedesktop.login1.Manager
|
||||
- --talk-name=org.freedesktop.portal.Flatpak.UpdateMonitor
|
||||
- --filesystem=xdg-run/app/com.discordapp.Discord:create
|
||||
#- --filesystem=xdg-config/gtk-3.0:ro #not needed as we got --filesystem=home
|
||||
- --filesystem=xdg-config/gtk-3.0:ro
|
||||
- --env=QT_QPA_PLATFORM=wayland-egl;wayland;xcb
|
||||
# Dolphin
|
||||
- --allow=bluetooth
|
||||
# PPSSPP
|
||||
|
@ -43,6 +36,10 @@ finish-args:
|
|||
- --env=SDL_VIDEO_WAYLAND_WMCLASS=net.retrodeck.retrodeck
|
||||
# XEMU - Fixes issues with openSUSE systems, QEMU_AUDIO_DRV is defined as "pa" causing xemu to not launch
|
||||
- --unset-env=QEMU_AUDIO_DRV
|
||||
# BoilR
|
||||
- --filesystem=xdg-data/Steam:rw #Steam (flatpak)
|
||||
- --filesystem=~/.steam:rw # Steam (Non-flatpak)
|
||||
- --filesystem=~/.var/app/com.valvesoftware.Steam:rw # Steam (Flatpak)
|
||||
|
||||
cleanup:
|
||||
# ES-DE
|
||||
|
@ -412,7 +409,7 @@ modules:
|
|||
# When updating this module remember to check those:
|
||||
# https://gitlab.com/es-de/emulationstation-de/-/blob/[VERSION]/resources/systems/unix/es_find_rules.xml
|
||||
# But we don't include them 1:1 as RetroDECK got some specific configs in some cases
|
||||
- name: emulationstation-de
|
||||
- name: ES-DE
|
||||
buildsystem: cmake-ninja
|
||||
config-opts:
|
||||
- -DRETRODECK=on
|
||||
|
@ -421,21 +418,13 @@ modules:
|
|||
- es-core
|
||||
sources:
|
||||
- type: git
|
||||
url: https://gitlab.com/es-de/emulationstation-de
|
||||
branch: 77bf5ed8a03c5d065512cded36e4fb3bea90f4df
|
||||
url: https://github.com/XargonWan/RetroDECK-ES-DE
|
||||
branch: cebbeff3b5f834fd9adaeb1f5dc9e0da6b106599
|
||||
- type: shell
|
||||
commands:
|
||||
- sed -i 's#"EMULATIONSTATION-DE V" + Utils::String::toUpper(PROGRAM_VERSION_STRING)#"RetroDECK
|
||||
v'$(cat ${FLATPAK_DEST}/retrodeck/version)', ES-DE v" + Utils::String::toUpper(PROGRAM_VERSION_STRING)#g'
|
||||
es-app/src/guis/GuiMenu.cpp
|
||||
- type: patch
|
||||
path: rd-submodules/es-de/GuiMenu.cpp.patch
|
||||
- type: patch
|
||||
path: rd-submodules/es-de/GuiMenu.h.patch
|
||||
- type: patch
|
||||
path: rd-submodules/es-de/ViewController.cpp.patch
|
||||
- type: patch
|
||||
path: rd-submodules/es-de/Window.cpp.patch
|
||||
|
||||
# ES-DE - END
|
||||
|
||||
|
@ -455,6 +444,24 @@ modules:
|
|||
|
||||
# External manifests start
|
||||
|
||||
- name: boilr
|
||||
buildsystem: simple
|
||||
build-options:
|
||||
append-path: /usr/lib/sdk/rust-stable/bin
|
||||
env:
|
||||
# To pick up vendored deps
|
||||
CARGO_HOME: /run/build/boilr/cargo
|
||||
RUSTFLAGS: "-L /app/lib/"
|
||||
build-commands:
|
||||
- cargo --offline fetch --manifest-path Cargo.toml --verbose
|
||||
- cargo --offline build --release --verbose --features flatpak
|
||||
- install -Dm755 ./target/release/boilr -t /app/bin/
|
||||
sources:
|
||||
- type: git
|
||||
url: https://github.com/PhilipK/BoilR
|
||||
branch: retro
|
||||
#- rd-submodules/boilr/cargo-lock.json it's in the repo now, at least on retro branch, check on main later please
|
||||
|
||||
# RetroArch - START
|
||||
# https://github.com/flathub/org.libretro.RetroArch
|
||||
|
||||
|
@ -663,8 +670,8 @@ modules:
|
|||
sources:
|
||||
- type: git
|
||||
url: &ppsspp-url https://github.com/hrydgard/ppsspp.git
|
||||
tag: v1.16.6
|
||||
commit: ba0ce344937d17e177ec8656ab957f6b82facdda
|
||||
tag: v1.17
|
||||
commit: 493122a2fcf9ff538e242fe2844f019b53afd483
|
||||
x-checker-data:
|
||||
type: json
|
||||
url: https://api.github.com/repos/hrydgard/ppsspp/releases/latest
|
||||
|
@ -672,22 +679,6 @@ modules:
|
|||
tag-query: .tag_name
|
||||
timestamp-query: .published_at
|
||||
|
||||
- name: ppsspp-localization
|
||||
buildsystem: simple
|
||||
build-commands:
|
||||
- |
|
||||
for LANG_FILE in assets/lang/*.ini; do
|
||||
LANG_FILE_NAME="$(basename "$LANG_FILE")"
|
||||
LANG_PREFIX="${LANG_FILE_NAME:0:2}"
|
||||
LANG_DEST="$FLATPAK_DEST/share/locale/$LANG_PREFIX/ppsspp/$LANG_FILE_NAME";
|
||||
ln -fsr "$LANG_DEST" "$FLATPAK_DEST/share/ppsspp/$LANG_FILE"
|
||||
install -Dm644 "$LANG_FILE" "$LANG_DEST"
|
||||
done
|
||||
sources:
|
||||
- type: shell
|
||||
commands:
|
||||
- cp -a $FLATPAK_DEST/share/ppsspp/assets .
|
||||
|
||||
# PPSSPP - END
|
||||
|
||||
# Yuzu - START
|
||||
|
@ -703,8 +694,8 @@ modules:
|
|||
- ln -s "${FLATPAK_DEST}/yuzu/usr/bin/yuzu" "${FLATPAK_DEST}/bin/yuzu"
|
||||
sources:
|
||||
- type: file
|
||||
url: https://github.com/yuzu-emu/yuzu-mainline/releases/download/mainline-0-1648/yuzu-mainline-20231211-14c24e64e.AppImage
|
||||
sha256: d40f61c2abf8ddd0bb53098e2d9edf0c47e1cfd89e50cf5856b8cc27dbb25bd6
|
||||
url: https://github.com/yuzu-emu/yuzu-mainline/releases/download/mainline-0-1696/yuzu-mainline-20240128-1bd7a09e3.AppImage
|
||||
sha256: d8ca508daa5ba929efda956488f4a9cbc38df9fd672fcb55cb2184625971706d
|
||||
|
||||
# Yuzu - END
|
||||
|
||||
|
@ -1233,7 +1224,7 @@ modules:
|
|||
|
||||
- name: vita3k
|
||||
buildsystem: simple
|
||||
build-commands:
|
||||
build-commands:
|
||||
# Copying the user icon
|
||||
- mkdir -p ${FLATPAK_DEST}/retrodeck
|
||||
- cp retrodeck.png ${FLATPAK_DEST}/retrodeck
|
||||
|
@ -1307,53 +1298,15 @@ modules:
|
|||
# SOLARUS - END
|
||||
|
||||
# MAME - Start
|
||||
# https://sdlmame.wallyweek.org/download/
|
||||
# To enable the debugger try: QT_HOME='/usr'
|
||||
|
||||
- name: mame
|
||||
- name: retrodeck-mame
|
||||
buildsystem: simple
|
||||
build-options:
|
||||
no-debuginfo: true
|
||||
strip: true
|
||||
build-commands:
|
||||
- make
|
||||
-j ${FLATPAK_BUILDER_N_JOBS}
|
||||
CFLAGS+=-Wno-error=restrict
|
||||
USE_QTDEBUG=0
|
||||
USE_WAYLAND=1
|
||||
USE_SYSTEM_LIB_FLAC=1
|
||||
SDL_INI_PATH='$$HOME/.APP_NAME;/app/share/APP_NAME/ini'
|
||||
LDOPTS=-Wl,-s
|
||||
- install -Dm 0755 mame ${FLATPAK_DEST}/bin/mame
|
||||
- cp COPYING ${FLATPAK_DEST}/bin/
|
||||
- cp uismall.bdf ${FLATPAK_DEST}/bin/
|
||||
- mkdir -p ${FLATPAK_DEST}/share/mame/
|
||||
- cp -r artwork/ ${FLATPAK_DEST}/share/mame/
|
||||
- cp -r bgfx/ ${FLATPAK_DEST}/share/mame/
|
||||
- cp -r ctrlr/ ${FLATPAK_DEST}/share/mame/
|
||||
- mkdir -p ${FLATPAK_DEST}/share/mame/docs/
|
||||
- cp -r docs/legal/ ${FLATPAK_DEST}/share/mame/docs/
|
||||
- cp -r docs/man/ ${FLATPAK_DEST}/share/mame/docs
|
||||
- cp -r hash/ ${FLATPAK_DEST}/share/mame/
|
||||
- cp -r hlsl/ ${FLATPAK_DEST}/share/mame/
|
||||
- cp -r ini/ ${FLATPAK_DEST}/share/mame/
|
||||
- install -Dm 0644 mame.ini ${FLATPAK_DEST}/share/mame/ini/mame.ini
|
||||
- cp -r language/ ${FLATPAK_DEST}/share/mame/
|
||||
- cp -r plugins/ ${FLATPAK_DEST}/share/mame/
|
||||
- cp -r roms/ ${FLATPAK_DEST}/share/mame/
|
||||
- cp -r samples/ ${FLATPAK_DEST}/share/mame/
|
||||
- cp -rn files/* /app
|
||||
sources:
|
||||
- type: archive
|
||||
url: https://github.com/mamedev/mame/archive/refs/tags/mame0261.tar.gz
|
||||
sha256: 51d5ce1563897709ceb7a924c31a70cc5ff2bec466aab8d0cc9ff3cc72b38899
|
||||
- type: file
|
||||
path: rd-submodules/mame/mame.ini
|
||||
- type: patch
|
||||
path: rd-submodules/mame/floppy.patch
|
||||
- type: patch
|
||||
path: rd-submodules/mame/sound.patch
|
||||
- type: patch
|
||||
path: rd-submodules/mame/ym3802.patch
|
||||
- type: archive
|
||||
url: RETRODECKMAMEURLPLACEHOLDER
|
||||
sha256: RETRODECKMAMEPLACEHOLDER
|
||||
|
||||
# MAME - End
|
||||
|
||||
|
|
5325
rd-submodules/boilr/cargo-lock.json
Normal file
|
@ -1,41 +0,0 @@
|
|||
diff --git a/src/devices/imagedev/floppy.cpp b/src/devices/imagedev/floppy.cpp
|
||||
index 3c00336d..cda94d92 100644
|
||||
--- a/src/devices/imagedev/floppy.cpp
|
||||
+++ b/src/devices/imagedev/floppy.cpp
|
||||
@@ -1707,9 +1707,10 @@ void floppy_sound_device::sound_stream_update(sound_stream &stream, std::vector<
|
||||
{
|
||||
idx = m_spin_playback_sample;
|
||||
sampleend = m_sample[idx].data.size();
|
||||
- out = m_sample[idx].data[m_spin_samplepos++];
|
||||
-
|
||||
- if (m_spin_samplepos >= sampleend)
|
||||
+ m_spin_samplepos++;
|
||||
+ if (m_spin_samplepos < sampleend)
|
||||
+ out = m_sample[idx].data[m_spin_samplepos];
|
||||
+ else
|
||||
{
|
||||
// Motor sample has completed
|
||||
switch (m_spin_playback_sample)
|
||||
@@ -1763,7 +1764,8 @@ void floppy_sound_device::sound_stream_update(sound_stream &stream, std::vector<
|
||||
idx = m_step_base + m_seek_playback_sample;
|
||||
sampleend = m_sample[idx].data.size();
|
||||
// Mix it into the stream value
|
||||
- out += m_sample[idx].data[(int)m_seek_samplepos];
|
||||
+ if (m_seek_samplepos < sampleend)
|
||||
+ out += m_sample[idx].data[(int)m_seek_samplepos];
|
||||
// By adding different values than 1, we can change the playback speed
|
||||
// This will be used to adjust the seek sound
|
||||
m_seek_samplepos += m_seek_pitch;
|
||||
@@ -1781,8 +1783,10 @@ void floppy_sound_device::sound_stream_update(sound_stream &stream, std::vector<
|
||||
sampleend = m_sample[idx].data.size();
|
||||
|
||||
// Mix it into the stream value
|
||||
- out += m_sample[idx].data[m_step_samplepos++];
|
||||
- if (m_step_samplepos >= sampleend)
|
||||
+ m_step_samplepos++;
|
||||
+ if (m_step_samplepos < sampleend)
|
||||
+ out += m_sample[idx].data[m_step_samplepos];
|
||||
+ else
|
||||
{
|
||||
// Step sample done
|
||||
m_step_samplepos = 0;
|
|
@ -1,33 +0,0 @@
|
|||
#
|
||||
# CORE SEARCH PATH OPTIONS
|
||||
#
|
||||
homepath $HOME/.mame
|
||||
rompath /app/share/mame/roms
|
||||
hashpath /app/share/mame/hash
|
||||
samplepath /app/share/mame/samples
|
||||
artpath /app/share/mame/artwork
|
||||
ctrlrpath /app/share/mame/ctrlr
|
||||
inipath $HOME/.mame;/app/share/mame/ini
|
||||
fontpath /app/bin/
|
||||
cheatpath /app/share/mame/cheat
|
||||
crosshairpath /app/share/mame/crosshair
|
||||
pluginspath /app/share/mame/plugins
|
||||
languagepath /app/share/mame/language
|
||||
swpath /app/share/mame/software
|
||||
|
||||
#
|
||||
# CORE OUTPUT DIRECTORY OPTIONS
|
||||
#
|
||||
cfg_directory $HOME/.mame/cfg
|
||||
nvram_directory $HOME/.mame/nvram
|
||||
input_directory $HOME/.mame/inp
|
||||
state_directory $HOME/.mame/sta
|
||||
snapshot_directory $HOME/.mame/snap
|
||||
diff_directory $HOME/.mame/diff
|
||||
comment_directory $HOME/.mame/comments
|
||||
share_directory $HOME/.mame/share
|
||||
|
||||
#
|
||||
# OSD VIDEO OPTIONS
|
||||
#
|
||||
video opengl
|
|
@ -1,28 +0,0 @@
|
|||
diff --git a/src/emu/sound.cpp b/src/emu/sound.cpp
|
||||
index a0293063..c4989abb 100644
|
||||
--- a/src/emu/sound.cpp
|
||||
+++ b/src/emu/sound.cpp
|
||||
@@ -761,6 +761,9 @@ read_stream_view sound_stream::update_view(attotime start, attotime end, u32 out
|
||||
}
|
||||
g_profiler.stop();
|
||||
|
||||
+ if (!m_output_view[outputnum].valid())
|
||||
+ m_output_view[outputnum] = empty_view(start, end);
|
||||
+
|
||||
// return the requested view
|
||||
return read_stream_view(m_output_view[outputnum], start);
|
||||
}
|
||||
diff --git a/src/emu/sound.h b/src/emu/sound.h
|
||||
index 15f6a574..bfa45c45 100644
|
||||
--- a/src/emu/sound.h
|
||||
+++ b/src/emu/sound.h
|
||||
@@ -284,6 +284,9 @@ public:
|
||||
return *this;
|
||||
}
|
||||
|
||||
+ // check basic constraints
|
||||
+ bool valid() const { return m_buffer != nullptr; }
|
||||
+
|
||||
// return the local gain
|
||||
sample_t gain() const { return m_gain; }
|
||||
|
|
@ -1,13 +0,0 @@
|
|||
diff --git a/src/devices/machine/ym3802.cpp b/src/devices/machine/ym3802.cpp
|
||||
index 4a8f6a7ffae..d1bf2b961f6 100644
|
||||
--- a/src/devices/machine/ym3802.cpp
|
||||
+++ b/src/devices/machine/ym3802.cpp
|
||||
@@ -45,7 +45,7 @@ void ym3802_device::device_start()
|
||||
|
||||
void ym3802_device::device_reset()
|
||||
{
|
||||
- m_reg.clear();
|
||||
+ m_reg.assign(REG_MAX, 0);
|
||||
reset_irq(0xff);
|
||||
transmit_register_reset();
|
||||
receive_register_reset();
|
|
@ -1 +1 @@
|
|||
Subproject commit a96821769848a711db1ed0b71883f91383e2b4ab
|
||||
Subproject commit 51d4821a45ac5fe13b2baa69aaaea864ead407ce
|
|
@ -1 +1 @@
|
|||
Subproject commit 55a8e460c6343229597a13e973ba4855c27a1c4c
|
||||
Subproject commit 6ba63f383ad54e7ebe2b0cda64c15602cf9a9153
|
BIN
res/RetroDECK_OLDLogo.xcf
Normal file
BIN
res/binding_icons/RD-0.png
Normal file
After Width: | Height: | Size: 183 B |
BIN
res/binding_icons/RD-1.png
Normal file
After Width: | Height: | Size: 186 B |
BIN
res/binding_icons/RD-2.png
Normal file
After Width: | Height: | Size: 190 B |
BIN
res/binding_icons/RD-3.png
Normal file
After Width: | Height: | Size: 186 B |