RetroPie-Setup/scriptmodules/supplementary/attractmode.sh
2024-09-07 00:29:06 +01:00

219 lines
7.3 KiB
Bash

#!/usr/bin/env bash
# This file is part of The RetroPie Project
#
# The RetroPie Project is the legal property of its developers, whose names are
# too numerous to list here. Please refer to the COPYRIGHT.md file distributed with this source.
#
# See the LICENSE.md file at the top-level directory of this distribution and
# at https://raw.githubusercontent.com/RetroPie/RetroPie-Setup/master/LICENSE.md
#
rp_module_id="attractmode"
rp_module_desc="Attract Mode emulator frontend"
rp_module_licence="GPL3 https://raw.githubusercontent.com/mickelson/attract/master/License.txt"
rp_module_repo="git https://github.com/mickelson/attract master"
rp_module_section="exp"
rp_module_flags="!mali frontend"
function _get_configdir_attractmode() {
echo "$configdir/all/attractmode"
}
function _add_system_attractmode() {
local attract_dir="$(_get_configdir_attractmode)"
[[ ! -d "$attract_dir" || ! -f /usr/bin/attract ]] && return 0
local fullname="$1"
local name="$2"
local path="$3"
local extensions="$4"
local command="$5"
local platform="$6"
local theme="$7"
# replace any / characters in fullname
fullname="${fullname//\/}"
local config="$attract_dir/emulators/$fullname.cfg"
iniConfig " " "" "$config"
# replace %ROM% with "[romfilename]" and convert to array
command=(${command//%ROM%/\"[romfilename]\"})
iniSet "executable" "${command[0]}"
iniSet "args" "${command[*]:1}"
iniSet "rompath" "$path"
iniSet "system" "$fullname"
# extensions separated by semicolon
extensions="${extensions// /;}"
iniSet "romext" "$extensions"
# snap path
local snap="snap"
[[ "$name" == "retropie" ]] && snap="icons"
iniSet "artwork flyer" "$path/flyer"
iniSet "artwork marquee" "$path/marquee"
iniSet "artwork snap" "$path/$snap"
iniSet "artwork wheel" "$path/wheel"
chown "$__user":"$__group" "$config"
# if no gameslist, generate one
if [[ ! -f "$attract_dir/romlists/$fullname.txt" ]]; then
sudo -u "$__user" attract --build-romlist "$fullname" -o "$fullname"
fi
local config="$attract_dir/attract.cfg"
local tab=$'\t'
if [[ -f "$config" ]] && ! grep -q "display$tab$fullname" "$config"; then
cp "$config" "$config.bak"
cat >>"$config" <<_EOF_
display${tab}$fullname
${tab}layout Basic
${tab}romlist $fullname
_EOF_
chown "$__user":"$__group" "$config"
fi
}
function _del_system_attractmode() {
local attract_dir="$(_get_configdir_attractmode)"
[[ ! -d "$attract_dir" ]] && return 0
local fullname="$1"
local name="$2"
# Don't remove an empty system
[[ -z "$fullname" ]] && return 0
# replace any / characters in fullname
fullname="${fullname//\/}"
rm -rf "$attract_dir/romlists/$fullname.txt"
local tab=$'\t'
# remove display block from "^display$tab$fullname" to next "^display" or empty line keeping the next display line
sed -i "/^display$tab$fullname/,/^display\|^$/{/^display$tab$fullname/d;/^display\$/!d}" "$attract_dir/attract.cfg"
}
function _add_rom_attractmode() {
local attract_dir="$(_get_configdir_attractmode)"
[[ ! -d "$attract_dir" ]] && return 0
local system_name="$1"
local system_fullname="$2"
local path="$3"
local name="$4"
local desc="$5"
local image="$6"
local config="$attract_dir/romlists/$system_fullname.txt"
# remove extension
path="${path/%.*}"
if [[ ! -f "$config" ]]; then
echo "#Name;Title;Emulator;CloneOf;Year;Manufacturer;Category;Players;Rotation;Control;Status;DisplayCount;DisplayType;AltRomname;AltTitle;Extra;Buttons" >"$config"
fi
# if the entry already exists, remove it
if grep -q "^$path;" "$config"; then
sed -i "/^$path/d" "$config"
fi
echo "$path;$name;$system_fullname;;;;;;;;;;;;;;" >>"$config"
chown "$__user":"$__group" "$config"
}
function depends_attractmode() {
local depends=(
cmake fonts-freefont-ttf libflac-dev libcurl4-openssl-dev libogg-dev libvorbis-dev libopenal-dev libfreetype6-dev
libudev-dev libjpeg-dev libudev-dev libavutil-dev libavcodec-dev
libavformat-dev libavfilter-dev libswscale-dev libswresample-dev
libfontconfig1-dev
)
isPlatform "videocore" && depends+=(libraspberrypi-dev)
isPlatform "kms" && depends+=(libegl1-mesa-dev libgl-dev libglu1-mesa-dev libdrm-dev libgbm-dev)
isPlatform "x11" && depends+=(libsfml-dev)
getDepends "${depends[@]}"
}
function sources_attractmode() {
gitPullOrClone "$md_build/attract"
isPlatform "rpi" && gitPullOrClone "$md_build/sfml-pi" "https://github.com/mickelson/sfml-pi"
}
function build_attractmode() {
if isPlatform "rpi"; then
local params
cd sfml-pi
isPlatform "videocore" && params="-DSFML_RPI=1 -DEGL_INCLUDE_DIR=/opt/vc/include -DEGL_LIBRARY=/opt/vc/lib/libbrcmEGL.so -DGLES_INCLUDE_DIR=/opt/vc/include -DGLES_LIBRARY=/opt/vc/lib/libbrcmGLESv2.so"
isPlatform "kms" && params="-DSFML_DRM=1"
cmake . -DCMAKE_INSTALL_PREFIX="$md_inst/sfml" $params
make clean
make
cd ..
fi
cd attract
make clean
local params=(prefix="$md_inst")
isPlatform "videocore" && params+=(USE_GLES=1 EXTRA_CXXFLAGS="$CFLAGS -I$md_build/sfml-pi/include -L$md_build/sfml-pi/lib")
isPlatform "kms" && params+=(USE_DRM=1 EXTRA_CXXFLAGS="$CFLAGS -I$md_build/sfml-pi/include -L$md_build/sfml-pi/lib")
isPlatform "rpi" && params+=(USE_MMAL=1)
make "${params[@]}"
# remove example configs
rm -rf "$md_build/attract/config/emulators/"*
md_ret_require="$md_build/attract/attract"
}
function install_attractmode() {
make -C sfml-pi install
mkdir -p "$md_inst"/{bin,share,share/attract}
cp -v attract/attract "$md_inst/bin/"
cp -Rv attract/config/* "$md_inst/share/attract"
}
function remove_attractmode() {
rm -f /usr/bin/attract
}
function configure_attractmode() {
moveConfigDir "$home/.attract" "$md_conf_root/all/attractmode"
[[ "$md_mode" == "remove" ]] && return
local config="$md_conf_root/all/attractmode/attract.cfg"
if [[ ! -f "$config" ]]; then
echo "general" >"$config"
echo -e "\twindow_mode fullscreen" >>"$config"
fi
mkUserDir "$md_conf_root/all/attractmode/emulators"
cat >/usr/bin/attract <<_EOF_
#!/bin/bash
MODELIST=/opt/retropie/supplementary/kmsxx/kmsprint-rp
if [[ -z "\$DISPLAY" && -f "\$MODELIST" && ! "\$1" =~ build-romlist ]]; then
MODELIST="\$(\$MODELIST 2>/dev/null)"
default_mode="\$(echo "\$MODELIST" | grep -Em1 "^Mode: [0-9]+ crtc" | grep -oE [0-9]+x[0-9]+)"
default_vrefresh="\$(echo "\$MODELIST" | grep -Em1 "^Mode: [0-9]+ crtc" | grep -oE [0-9]+Hz)"
# Strip Hz from the refresh rate
default_vrefresh="\${default_vrefresh%Hz}"
echo "Using default video mode: \$default_mode @ \$default_vrefresh"
[[ ! -z "\$default_mode" ]] && export SFML_DRM_MODE="\$default_mode"
[[ ! -z "\$default_vrefresh" ]] && export SFML_DRM_REFRESH="\$default_vrefresh"
fi
LD_LIBRARY_PATH="$md_inst/sfml/lib" "$md_inst/bin/attract" "\$@"
_EOF_
chmod +x "/usr/bin/attract"
local id
for id in "${__mod_id[@]}"; do
if rp_isInstalled "$id" && [[ -n "${__mod_info[$id/section]}" ]] && ! hasFlag "${__mod_info[$id/flags]}" "frontend"; then
rp_callModule "$id" configure
fi
done
}