Last active
January 13, 2023 20:03
-
-
Save Langerz82/caccbbe3632a5d82ececa4f4c7bacd47 to your computer and use it in GitHub Desktop.
EmuELEC - set_advmame_joy.sh - DragonRise
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# SPDX-License-Identifier: GPL-2.0-or-later | |
# Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert) | |
# Copyright (C) 2022-present Joshua L (https://github.com/Langerz82) | |
# Source predefined functions and variables | |
. /etc/profile | |
# Configure ADVMAME players based on ES settings | |
CONFIG_DIR="/storage/.advance" | |
CONFIG="${CONFIG_DIR}/advmame.rc" | |
ES_FEATURES="/storage/.config/emulationstation/es_features.cfg" | |
source joy_common.sh "advmame" | |
ROMNAME=$1 | |
BTN_CFG="0 1 2 3 4 5 6 7" | |
BTN_H0=$(advj | grep -B 1 -E "^joy 0 .*" | grep sticks: | sed "s|sticks:\ ||" | tr -d ' ') | |
declare -A ADVMAME_VALUES=( | |
["b0"]="button1" | |
["b1"]="button2" | |
["b2"]="button3" | |
["b3"]="button4" | |
["b4"]="button5" | |
["b5"]="button6" | |
["b6"]="button7" | |
["b7"]="button8" | |
["b8"]="button9" | |
["b9"]="button10" | |
["b10"]="button11" | |
["b11"]="button12" | |
["b12"]="button13" | |
["b13"]="button14" | |
["b14"]="button15" | |
["b15"]="button16" | |
["b16"]="button17" | |
["b17"]="button18" | |
["h0.1"]="stick$BTN_H0,y,up" | |
["h0.4"]="stick$BTN_H0,y,down" | |
["h0.8"]="stick$BTN_H0,x,left" | |
["h0.2"]="stick$BTN_H0,x,right" | |
["a1,1"]="stick,y,up" | |
["a1,2"]="stick,y,down" | |
["a0,1"]="stick,x,left" | |
["a0,2"]="stick,x,right" | |
["a2,1"]="1,0,0" | |
["a2,2"]="1,0,1" | |
["a5,1"]="2,1,0" | |
["a5,2"]="2,1,1" | |
) | |
declare GC_ORDER=( | |
"a" | |
"b" | |
"x" | |
"y" | |
"rightshoulder" | |
"leftshoulder" | |
"righttrigger" | |
"lefttrigger" | |
) | |
declare -A GC_NAMES=() | |
get_button_cfg() { | |
local BTN_INDEX=$(get_ee_setting "joy_btn_cfg" "mame" "${ROMNAME}") | |
[[ -z $BTN_INDEX ]] && BTN_INDEX=$(get_ee_setting "mame.joy_btn_cfg") | |
if [[ ! -z $BTN_INDEX ]] && [[ $BTN_INDEX -gt 0 ]]; then | |
local BTN_SETTING="AdvanceMame.joy_btn_order$BTN_INDEX" | |
local BTN_CFG_TMP="$(get_ee_setting $BTN_SETTING)" | |
[[ ! -z $BTN_CFG_TMP ]] && BTN_CFG="${BTN_CFG_TMP}" | |
fi | |
echo "$BTN_CFG" | |
} | |
clean_pad() { | |
sed -i "/device_joystick.*/d" ${CONFIG} | |
sed -i "/input_map\[p${1}_.*/d" ${CONFIG} | |
sed -i "/input_map\[coin${1}.*/d" ${CONFIG} | |
sed -i "/input_map\[start${1}.*/d" ${CONFIG} | |
if [[ "${1}" == "1" ]]; then | |
sed -i '/input_map\[ui_[[:alpha:]]*\].*/d' ${CONFIG} | |
fi | |
echo "device_joystick raw" >> ${CONFIG} | |
} | |
# Sets pad depending on parameters $GAMEPAD = name $1 = player | |
set_pad(){ | |
local P_INDEX=$(( $1 - 1 )) | |
local DEVICE_GUID=$3 | |
local JOY_NAME="$4" | |
local GC_CONFIG=$(cat "$GCDB" | grep "$DEVICE_GUID" | grep "platform:Linux" | head -1) | |
echo "GC_CONFIG=$GC_CONFIG" | |
[[ -z $GC_CONFIG ]] && return | |
[[ -z "$JOY_NAME" ]] && JOY_NAME=$(echo $GC_CONFIG | cut -d',' -f2) | |
[[ -z "$JOY_NAME" ]] && return | |
local GAMEPAD="$(echo "$JOY_NAME" | sed "s|,||g" | sed "s|_||g" | cut -d'"' -f 2 \ | |
| sed "s|(||" | sed "s|)||" | sed -e 's/[^A-Za-z0-9._-]/ /g' | sed 's/[[:blank:]]*$//' \ | |
| sed 's/-//' | sed -e 's/[^A-Za-z0-9._-]/_/g' |tr '[:upper:]' '[:lower:]' | tr -d '.')" | |
if [[ "${P_INDEX}" -gt "0" ]]; then | |
BTN_H0=$(advj | grep -B 1 -E "^joy 0 .*" | grep sticks: | sed "s|sticks:\ ||" | tr -d ' ') | |
if [[ ! -z "$BTN_H0" ]]; then | |
ADVMAME_VALUES["h0.1"]="stick${BTN_H0},y,up" | |
ADVMAME_VALUES["h0.4"]="stick${BTN_H0},y,down" | |
ADVMAME_VALUES["h0.8"]="stick${BTN_H0},x,left" | |
ADVMAME_VALUES["h0.2"]="stick${BTN_H0},x,right" | |
fi | |
fi | |
local NAME_NUM="${GC_NAMES[$GAMEPAD]}" | |
if [[ -z "NAME_NUM" ]]; then | |
GC_NAMES[$GAMEPAD]=1 | |
else | |
GC_NAMES[$GAMEPAD]=$(( NAME_NUM+1 )) | |
fi | |
[[ "${GC_NAMES[$GAMEPAD]}" -gt "1" ]] && GAMEPAD="${GAMEPAD}_${GC_NAMES[$GAMEPAD]}" | |
local GC_MAP=$(echo $GC_CONFIG | cut -d',' -f3-) | |
declare DIRS=() | |
declare -A DIR_INDEX=( | |
[dpup]="0" | |
[dpdown]="1" | |
[dpleft]="2" | |
[dpright]="3" | |
[leftx]="0,1" | |
[lefty]="2,3" | |
) | |
local ADD_HAT=$(get_ee_setting advmame_add_hat) | |
local i=1 | |
set -f | |
local GC_ARRAY=(${GC_MAP//,/ }) | |
declare -A GC_ASSOC=() | |
for index in "${!GC_ARRAY[@]}" | |
do | |
local REC=${GC_ARRAY[$index]} | |
local GC_INDEX=$(echo $REC | cut -d ":" -f 1) | |
[[ $GC_INDEX == "" || $GC_INDEX == "platform" ]] && continue | |
local TVAL=$(echo $REC | cut -d ":" -f 2) | |
GC_ASSOC["$GC_INDEX"]=$TVAL | |
[[ " ${GC_ORDER[*]} " == *" ${GC_INDEX} "* ]] && continue | |
local BUTTON_VAL=${TVAL:1} | |
local BTN_TYPE=${TVAL:0:1} | |
local VAL="${ADVMAME_VALUES[${TVAL}]}" | |
local I="${DIR_INDEX[$GC_INDEX]}" | |
local DIR="${DIRS[$I]}" | |
# Create Axis Maps | |
case $GC_INDEX in | |
dpup|dpdown|dpleft|dpright) | |
[[ ! -z "$DIR" ]] && DIR+=" or " | |
if [[ "$BTN_TYPE" == "a" ]]; then | |
local direction | |
case $GC_INDEX in | |
dpleft|dpup) | |
direction=1 | |
;; | |
dpright|dpdown) | |
direction=2 | |
;; | |
esac | |
VAL="${ADVMAME_VALUES[${TVAL},${direction}]}" | |
DIR+="joystick_digital[${GAMEPAD},${VAL}]" | |
DIRS["$I"]="$DIR" | |
else | |
[[ "$BTN_TYPE" == "b" ]] && DIR+="joystick_button[${GAMEPAD},${VAL}]" | |
[[ "$BTN_TYPE" == "h" ]] && DIR+="joystick_digital[${GAMEPAD},${VAL}]" | |
DIRS["$I"]="$DIR" | |
fi | |
;; | |
leftx|lefty) | |
for i in {1..2}; do | |
I=$(echo "${DIR_INDEX[$GC_INDEX]}" | cut -d, -f "$i") | |
DIR="${DIRS[$I]}" | |
[[ ! -z "$DIR" ]] && DIR+=" or " | |
VAL="${ADVMAME_VALUES[${TVAL},${i}]}" | |
DIR+="joystick_digital[${GAMEPAD},${VAL}]" | |
DIRS["$I"]=$DIR | |
done | |
;; | |
start) | |
echo "input_map[start${1}] joystick_button[${GAMEPAD},${VAL}]" >> ${CONFIG} | |
;; | |
back) | |
echo "input_map[coin${1}] joystick_button[${GAMEPAD},${VAL}]" >> ${CONFIG} | |
;; | |
esac | |
done | |
declare -i i=1 | |
for bi in ${BTN_CFG}; do | |
local button="${GC_ORDER[$bi]}" | |
[[ -z "$button" ]] && continue | |
button="${GC_ASSOC[$button]}" | |
local BTN_TYPE="${button:0:1}" | |
if [[ "$BTN_TYPE" == "a" ]]; then | |
local STR="input_map[p${1}_button${i}]" | |
for j in {1..2}; do | |
local VAL="${ADVMAME_VALUES[${button},${j}]}" | |
STR+=" joystick_digital[${GAMEPAD},${VAL}]" | |
done | |
echo "${STR}" >> ${CONFIG} | |
elif [[ "$BTN_TYPE" == "b" ]]; then | |
local VAL="${ADVMAME_VALUES[$button]}" | |
echo "input_map[p${1}_button${i}] joystick_button[${GAMEPAD},${VAL}]" >> ${CONFIG} | |
fi | |
(( i++ )) | |
done | |
echo "input_map[p${1}_up] ${DIRS[0]}" >> ${CONFIG} | |
echo "input_map[p${1}_down] ${DIRS[1]}" >> ${CONFIG} | |
echo "input_map[p${1}_left] ${DIRS[2]}" >> ${CONFIG} | |
echo "input_map[p${1}_right] ${DIRS[3]}" >> ${CONFIG} | |
# Menu should only be set to player 1 | |
if [[ "${1}" == "1" ]]; then | |
#echo "Setting menu buttons for player 1" #debug | |
echo "input_map[ui_up] keyboard[0,up] or keyboard[1,up] or ${DIRS[0]}" >> ${CONFIG} | |
echo "input_map[ui_down] keyboard[0,down] or keyboard[1,down] or ${DIRS[1]}" >> ${CONFIG} | |
echo "input_map[ui_left] keyboard[0,left] or keyboard[1,left] or ${DIRS[2]}" >> ${CONFIG} | |
echo "input_map[ui_right] keyboard[0,right] or keyboard[1,right] or ${DIRS[3]}" >> ${CONFIG} | |
local button="${GC_ASSOC[a]}" | |
local VAL="${ADVMAME_VALUES[$button]}" | |
if [ ! -z "$VAL" ]; then | |
echo "input_map[ui_select] keyboard[0,enter] or keyboard[1,enter] or joystick_button[${GAMEPAD},${VAL}]" >> ${CONFIG} | |
fi | |
button="${GC_ASSOC[b]}" | |
VAL="${ADVMAME_VALUES[$button]}" | |
if [ ! -z "$VAL" ]; then | |
echo "input_map[ui_cancel] keyboard[0,backspace] or keyboard[1,backspace] or joystick_button[${GAMEPAD},${VAL}]" >> ${CONFIG} | |
fi | |
VAL="" | |
button="${GC_ASSOC[rightstick]}" | |
if [[ ! -z "$button" ]]; then | |
VAL="${ADVMAME_VALUES[$button]}" | |
elif [[ "${GC_ASSOC[guide]}" != "${GC_ASSOC[back]}" ]]; then | |
button="${GC_ASSOC[guide]}" | |
VAL="${ADVMAME_VALUES[$button]}" | |
fi | |
echo -n "input_map[ui_configure] keyboard[1,tab] or keyboard[0,tab]" >> ${CONFIG} | |
if [ ! -z "$VAL" ]; then | |
echo " or joystick_button[${GAMEPAD},${VAL}]" >> ${CONFIG} | |
fi | |
fi | |
} | |
ADVMAME_REGEX="<emulator.*name\=\"AdvanceMame\" +features\=.*[ ,\"]joybtnremap[ ,\"].*/>" | |
ADVMAME_REMAP=$(cat "${ES_FEATURES}" | grep -E "$ADVMAME_REGEX") | |
[[ ! -z "$ADVMAME_REMAP" ]] && BTN_CFG=$(get_button_cfg) | |
echo "BTN_CFG=$BTN_CFG" | |
jc_get_players |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment