Merge branch 'master' of https://git.101010.fr/gardouille-dotfiles/scripts
This commit is contained in:
		
						commit
						4a19be55af
					
				|  | @ -1,5 +1,67 @@ | |||
| # Save game management | ||||
| 
 | ||||
| Collection of scripts in order to move all (as much as i can) save of my | ||||
| video games in one remote place (eg. Nextcloud directory,…). Then a symbolic | ||||
| link should take place of the directories. This allows me to : | ||||
| * Have save in the cloud for all games ! | ||||
| * Easily find my save in one place. | ||||
| * Easily backup everything (one `tar` to backup them all). | ||||
| * Synchronize save between Linux hosts. | ||||
| * Restore save if anything happens to my game computer. | ||||
| * Everything that Nextcloud allows me to do (access from anywhere, share,…). | ||||
| 
 | ||||
| ## How-to use | ||||
| 
 | ||||
| Run the main script to automatically run the 3 others : | ||||
| 
 | ||||
| ``` sh | ||||
| ~/repos/gardouille.scripts/games/save.game | ||||
| ``` | ||||
| 
 | ||||
| This will run : | ||||
| - **save.game.steam** : Try to move or symlink saves from 3 Steam's directories, | ||||
| userdata, common and compatdata. | ||||
| - **save.game.xdg** : Try to move or symlink save that respect the XDG | ||||
| specifications (~/.config and ~/.local/share). | ||||
| - **save.game.home** : Try to move or symlink other saves that the devs have | ||||
| seen fit to place anywhere else… | ||||
| 
 | ||||
| ## Currently managed games | ||||
| 
 | ||||
| * Borderlands 2                  − https://pcgamingwiki.com/wiki/Borderlands_2 | ||||
| * Broforce                       − https://pcgamingwiki.com/wiki/Broforce | ||||
| * Butcher                        − https://pcgamingwiki.com/wiki/Butcher | ||||
| * Capsized                       − https://pcgamingwiki.com/wiki/Capsized | ||||
| * Castle Crashers                − https://pcgamingwiki.com/wiki/Castle_Crashers | ||||
| * Crypt of the Necrodancer       − https://pcgamingwiki.com/wiki/Crypt_of_the_Necrodancer | ||||
| * Door Kickers: Action Squad     − https://pcgamingwiki.com/wiki/Door_Kickers:_Action_Squad | ||||
| * Duck Game                      − https://pcgamingwiki.com/wiki/Duck_Game | ||||
| * Full Metal Furies              − https://pcgamingwiki.com/wiki/Full_Metal_Furies | ||||
| * HotlineMiami                   − https://pcgamingwiki.com/wiki/Hotline_Miami | ||||
| * Jump Gunners                   − https://pcgamingwiki.com/wiki/Jump_Gunners | ||||
| * Mercenary Kings                − https://pcgamingwiki.com/wiki/Mercenary_Kings | ||||
| * Metal Slug X                   − https://pcgamingwiki.com/wiki/Metal_Slug_X | ||||
| * Never Alone                    − https://pcgamingwiki.com/wiki/Never_Alone | ||||
| * Nuclear Throne                 − https://pcgamingwiki.com/wiki/Nuclear_Throne | ||||
| * Overcooked! 2                  − https://pcgamingwiki.com/wiki/Overcooked!_2 | ||||
| * PixelJunk Shooter              − https://pcgamingwiki.com/wiki/PixelJunk_Shooter | ||||
| * Portal 2                       − https://pcgamingwiki.com/wiki/Portal_2 (solo only, multiplayer is on Steam cloud) | ||||
| * Prey (2017)                    − https://pcgamingwiki.com/wiki/Prey_(2017) (don't work yet) | ||||
| * Risk of Rain                   − https://pcgamingwiki.com/wiki/Risk_of_Rain | ||||
| * Saints Row IV                  − https://pcgamingwiki.com/wiki/Saints_Row_IV | ||||
| * Saints Row: The Third          − https://pcgamingwiki.com/wiki/Saints_Row:_The_Third | ||||
| * Shift Happens                  − https://pcgamingwiki.com/wiki/Shift_Happens (don't work yet) | ||||
| * South Park: The Stick of Truth − https://pcgamingwiki.com/wiki/South_Park:_The_Stick_of_Truth | ||||
| * Steam Screenshots              − https://steamdb.info/app/760/ | ||||
| * The Dishwasher: Vampire Smile  − https://pcgamingwiki.com/wiki/The_Dishwasher:_Vampire_Smile | ||||
| * The Swapper                    − https://pcgamingwiki.com/wiki/The_Swapper | ||||
| * TowerFall Ascension            − https://pcgamingwiki.com/wiki/TowerFall_Ascension (not managed cause no substree, check $XDG_DATA_HOME) | ||||
| * Tricky Towers                  − https://pcgamingwiki.com/wiki/Tricky_Towers | ||||
| * Trine 2 Complete Story         − https://pcgamingwiki.com/wiki/Trine_2 | ||||
| * Trine Enchanted Edition        − https://pcgamingwiki.com/wiki/Trine_Enchanted_Edition | ||||
| 
 | ||||
| ## How-to add new save | ||||
| 
 | ||||
| Sources of informations : | ||||
| * Various informations (save path,…) : https://pcgamingwiki.com/wiki | ||||
| * Match steam id and game name : https://steamdb.info/ | ||||
|  |  | |||
|  | @ -0,0 +1,31 @@ | |||
| #!/bin/sh | ||||
| 
 | ||||
| # Purpose {{{ | ||||
| ## Run all other save.game.* scripts. | ||||
| # }}} | ||||
| 
 | ||||
| # Vars {{{ | ||||
| script_wd=$(dirname -- "${0}") | ||||
| 
 | ||||
| ## List of scripts | ||||
| home_script="save.game.home" | ||||
| steam_script="save.game.steam" | ||||
| xdg_script="save.game.xdg" | ||||
| 
 | ||||
| # }}} | ||||
| 
 | ||||
| # For all scripts, try to run | ||||
| for script in "${home_script}"  "${steam_script}" "${xdg_script}"; do | ||||
| 
 | ||||
| 	## If the script doesn't exist | ||||
| 	if [ ! -f "${script_wd}/${script}" ]; then | ||||
| 		printf '\e[1;35m%-6s\e[m\n' "Loop script − ${script} doesn't seems to exist. Abort." | ||||
| 		exit 1 | ||||
| 	fi | ||||
| 
 | ||||
| 	## Run the script | ||||
| 	sh "${script_wd}/${script}" | ||||
| 
 | ||||
| done | ||||
| 
 | ||||
| exit 0 | ||||
|  | @ -0,0 +1,130 @@ | |||
| #!/bin/sh | ||||
| 
 | ||||
| # Purpose {{{ | ||||
| ## Try to centralize all game's save that doesn't respect XDG specifications | ||||
| ## or Steam directories in order to : | ||||
| ##	easily backup all save | ||||
| ##	easily restore it | ||||
| ##	be able to access it from anywhere | ||||
| ##	… all you can do with a Nextcloud (share, versionning,…) | ||||
| ## | ||||
| ## 1. Move save directories of a list of known games from homedir (or subdir) | ||||
| ## to a remote directory (Nextcloud, remote mount,…). | ||||
| ## Then create a symlink in home directory to the remote game directory. | ||||
| ## | ||||
| ## 2. If a directory doesn't exist, check if a remote one is available | ||||
| ## and symlink it. | ||||
| ## | ||||
| ## KISS : Only manage save directories from home directory (or subdir). | ||||
| ## For other paths (Steam,…) check other scripts. | ||||
| # }}} | ||||
| 
 | ||||
| # Vars {{{ | ||||
| debug=0 | ||||
| 
 | ||||
| ## List of video games for homedir {{{ | ||||
| ### Give the relative path from homedir. | ||||
| ### Separate each path with "%" to be able to manage white space, eg : | ||||
| ### .mygame%.first-subtree/save of GAMEX | ||||
| ###        ^ | ||||
| ### Overcooked! 2           −  Team17     − https://pcgamingwiki.com/wiki/Overcooked!_2 | ||||
| ### Trine Enchanted Edition − .frozenbyte − https://pcgamingwiki.com/wiki/Trine_Enchanted_Edition | ||||
| ### Trine 2 Complete Story  − .frozenbyte − https://pcgamingwiki.com/wiki/Trine_2 | ||||
| games_list="Team17%.frozenbyte" | ||||
| ## }}} | ||||
| 
 | ||||
| remote_dir="${HOME}/Nextcloud/games/linux.sgl.script" | ||||
| home_remote_dir="${remote_dir}/home" | ||||
| 
 | ||||
| # }}} | ||||
| 
 | ||||
| # Functions {{{ | ||||
| # Move one save game dir {{{ | ||||
| move_game_dir() { | ||||
| 	_game_name="${1}" | ||||
| 	_game_dir="${2}" | ||||
| 	_local_game_path="${HOME}/${_game_dir}/${_game_name}" | ||||
| 	_remote_game_path="${home_remote_dir}/${_game_dir}/${_game_name}" | ||||
| 
 | ||||
| 	## If a remote directory doesn't already exists for this game | ||||
| 	if [ ! -d "${_remote_game_path}" ]; then | ||||
| 		### Ensure to create tree directories on remote storage | ||||
| 		mkdir -p -- "$(dirname "${_remote_game_path}")" | ||||
| 		### Move data to remote storage | ||||
| 		mv -- "${_local_game_path}" "${_remote_game_path}" | ||||
| 		[ "${debug}" -eq "0" ] && printf '\e[1;35m%-6s\e[m\n' "DEBUG : Move game − The data of ${_game_name} − ${_local_game_path} moved to remote storage." | ||||
| 		### Then ask to create a symbolic link to local storage | ||||
| 		symlink_game_dir "${_game_name}" "${_game_dir}" | ||||
| 	else | ||||
| 		printf '\e[1;35m%-6s\e[m\n' "Move game − ${_game_name} already have data on remote storage : ${_remote_game_path}. Abort to avoid to override data." | ||||
| 		exit 5 | ||||
| 	fi | ||||
| } | ||||
| # }}} | ||||
| # Symlink one save game dir from remote to local {{{ | ||||
| symlink_game_dir() { | ||||
| 	_game_name="${1}" | ||||
| 	_game_dir="${2}" | ||||
| 	_local_game_path="${HOME}/${_game_dir}/${_game_name}" | ||||
| 	_remote_game_path="${home_remote_dir}/${_game_dir}/${_game_name}" | ||||
| 
 | ||||
| 	if [ -d "${_remote_game_path}" ]; then | ||||
| 		ln -s -- "${_remote_game_path}" "${_local_game_path}" | ||||
| 		[ "${debug}" -eq "0" ] && printf '\e[1;35m%-6s\e[m\n' "DEBUG : Symlink game — Symlink remote data of ${_game_name} to local storage." | ||||
| 	else | ||||
| 		[ "${debug}" -eq "0" ] && printf '\e[1;35m%-6s\e[m\n' "DEBUG : Symlink game — ${_game_name} doesn't have remote data." | ||||
| 	fi | ||||
| } | ||||
| # }}} | ||||
| 
 | ||||
| # }}} | ||||
| 
 | ||||
| # Tests {{{ | ||||
| 
 | ||||
| ## Ensure remote dir exist {{{ | ||||
| if [ ! -d "${remote_dir}" ]; then | ||||
| 	printf '\e[1;35m%-6s\e[m\n' "The directory for save game doesn't exists : ${remote_dir}" | ||||
| 	exit 1 | ||||
| fi | ||||
| ## }}} | ||||
| 
 | ||||
| # }}} | ||||
| 
 | ||||
| 		[ "${debug}" -eq "0" ] && printf '\e[1;35m%-6s\e[m\n' "DEBUG : Run save game script for Homedir." | ||||
| 
 | ||||
| # Manage save game from homedir {{{ | ||||
| ## Set "%" as field separator | ||||
| IFS="%" | ||||
| for game_path in ${games_list}; do | ||||
| 	local_game_path="${HOME}/${game_path}" | ||||
| 	local_game_path_type="$(ls -ld "${local_game_path}" | sed 's/\(^.\).*/\1/')" | ||||
| 
 | ||||
| 	game_name="$(basename "${game_path}")" | ||||
| 	game_dir="$(dirname "${game_path}")" | ||||
| 
 | ||||
| 	case ${local_game_path_type} in | ||||
| 		## Data is already a symlink | ||||
| 		"symbolic"|"l") | ||||
| 			link_name="$(file "${local_game_path}" | sed 's;.* symbolic link to \(.*\);\1;')" | ||||
| 			[ "${debug}" -eq "0" ] && printf '\e[1;35m%-6s\e[m\n' "DEBUG : Homedir for loop — The data of ${game_path} are already symlinked to ${link_name} . Skip." | ||||
| 			;; | ||||
| 		## Data is still a directory | ||||
| 		"directory"|"d") | ||||
| 			move_game_dir "${game_name}" "${game_dir}" | ||||
| 			;; | ||||
| 		## Data doesn't exist | ||||
| 		"cannot") | ||||
| 			[ "${debug}" -eq "0" ] && printf '\e[1;35m%-6s\e[m\n' "DEBUG : Homedir for loop — The data of ${game_path} − ${local_game_path} doesn't exist. Skip." | ||||
| 			symlink_game_dir "${game_name}" "${game_dir}" | ||||
| 			;; | ||||
| 		## Data can't be managed | ||||
| 		*) | ||||
| 			printf '\e[1;35m%-6s\e[m\n' "Data of ${game_path} (Homedir) − ${local_game_path} are not managed. Type: ${local_game_path_type}. Abort" | ||||
| 			exit 3 | ||||
| 			;; | ||||
| 	esac | ||||
| 
 | ||||
| done | ||||
| # }}} | ||||
| 
 | ||||
| exit 0 | ||||
|  | @ -157,6 +157,8 @@ done | |||
| 
 | ||||
| # }}} | ||||
| 
 | ||||
| 		[ "${debug}" -eq "0" ] && printf '\e[1;35m%-6s\e[m\n' "DEBUG : Run save game script for Steam." | ||||
| 
 | ||||
| # Manage Steam userdata save game {{{ | ||||
| for game_id in ${steam_userdata_games}; do | ||||
| 	local_game_path="${HOME}/${steam_userdata}/${game_id}" | ||||
|  |  | |||
|  | @ -15,8 +15,8 @@ | |||
| ## 2. If a directory doesn't exist, check if a remote one is | ||||
| ## available and symlink it. | ||||
| ## | ||||
| ## KISS : Only manage save directories from Steam userdata. For other | ||||
| ## paths (Steam,…) check other scripts. | ||||
| ## KISS : Only manage save directories from XDG. For other paths (Steam, home,…) | ||||
| ## check other scripts. | ||||
| # }}} | ||||
| 
 | ||||
| # Vars {{{ | ||||
|  | @ -29,7 +29,7 @@ xdg_config="$(printf "%s" "${XDG_CONFIG_HOME}" | sed -e "s;${HOME}/;;")" | |||
| ### List of video games for XDG CONFIG {{{ | ||||
| 
 | ||||
| ### Broforce          − unity3d − https://pcgamingwiki.com/wiki/Broforce | ||||
| ### Butcher           − THD −  https://pcgamingwiki.com/wiki/Butcher | ||||
| ### Butcher           − unity3d −  https://pcgamingwiki.com/wiki/Butcher | ||||
| ### Full Metal Furies − Cellar Door Games − https://pcgamingwiki.com/wiki/Full_Metal_Furies | ||||
| ### Jump Gunners      − unity3d − https://pcgamingwiki.com/wiki/Jump_Gunners | ||||
| ### Never Alone       − unity3d − https://pcgamingwiki.com/wiki/Never_Alone | ||||
|  | @ -38,8 +38,8 @@ xdg_config="$(printf "%s" "${XDG_CONFIG_HOME}" | sed -e "s;${HOME}/;;")" | |||
| ### Overcooked! 2     − unity3d − https://pcgamingwiki.com/wiki/Overcooked!_2 | ||||
| ### Risk of Rain      − Risk_of_Rain − https://pcgamingwiki.com/wiki/Risk_of_Rain | ||||
| ### The Dishwasher: Vampire Smile − VampireSmile − https://pcgamingwiki.com/wiki/The_Dishwasher:_Vampire_Smile | ||||
| ### Tricky Towers     − WeirdBeard − https://pcgamingwiki.com/wiki/Tricky_Towers | ||||
| xdg_config_games="unity3d%THD%Cellar Door Games%nuclearthrone%Risk_of_Rain%VampireSmile%WeirdBeard" | ||||
| ### Tricky Towers     − unity3d − https://pcgamingwiki.com/wiki/Tricky_Towers | ||||
| xdg_config_games="unity3d%Cellar Door Games%nuclearthrone%Risk_of_Rain%VampireSmile" | ||||
| ### }}} | ||||
| 
 | ||||
| ## }}} | ||||
|  | @ -49,6 +49,7 @@ xdg_data="$(printf "%s" "${XDG_DATA_HOME}" | sed -e "s;${HOME}/;;")" | |||
| 
 | ||||
| ### List of video games for XDG DATA {{{ | ||||
| ### Borderlands 2         − aspyr-media − https://pcgamingwiki.com/wiki/Borderlands_2 | ||||
| ### Capsized              − Capsized − https://pcgamingwiki.com/wiki/Capsized | ||||
| ### Full Metal Furies     − Cellar Door Games − https://pcgamingwiki.com/wiki/Full_Metal_Furies | ||||
| ### HotlineMiami          − HotlineMiami − https://pcgamingwiki.com/wiki/Hotline_Miami | ||||
| ### Mercenary Kings       − Tribute Games − https://pcgamingwiki.com/wiki/Mercenary_Kings | ||||
|  | @ -56,8 +57,9 @@ xdg_data="$(printf "%s" "${XDG_DATA_HOME}" | sed -e "s;${HOME}/;;")" | |||
| ### Saints Row: The Third − vpltd − https://pcgamingwiki.com/wiki/Saints_Row:_The_Third | ||||
| ### Saints Row IV         − vpltd − https://pcgamingwiki.com/wiki/Saints_Row_IV | ||||
| ### The Dishwasher: Vampire Smile − VampireSmile − https://pcgamingwiki.com/wiki/The_Dishwasher:_Vampire_Smile | ||||
| ### The Swapper           − Facepalm Games − https://pcgamingwiki.com/wiki/The_Swapper | ||||
| ### TowerFall Ascension   − TowerFall − https://pcgamingwiki.com/wiki/TowerFall_Ascension | ||||
| data_games="aspyr-media%Cellar Door Games%HotlineMiami%Tribute Games%PJShooter%vpltd%VampireSmile%TowerFall" | ||||
| xdg_data_games="aspyr-media%Capsized%Cellar Door Games%HotlineMiami%Tribute Games%PJShooter%vpltd%VampireSmile%Facepalm Games%TowerFall" | ||||
| ### }}} | ||||
| 
 | ||||
| ## }}} | ||||
|  | @ -133,19 +135,23 @@ done | |||
| 
 | ||||
| # }}} | ||||
| 
 | ||||
| 		[ "${debug}" -eq "0" ] && printf '\e[1;35m%-6s\e[m\n' "DEBUG : Run save game script for XDG." | ||||
| 
 | ||||
| # Manage XDG config save game {{{ | ||||
| ## Set "%" as field separator | ||||
| IFS="%" | ||||
| for game_name in ${xdg_config_games}; do | ||||
| 	local_game_path="${HOME}/${xdg_config}/${game_name}" | ||||
| 	local_game_path_type="$(ls -ld "${local_game_path}" | sed 's/\(^.\).*/\1/')" | ||||
| 
 | ||||
| 	case ${local_game_path_type} in | ||||
| 		## Data is already a symlink | ||||
| 		"symbolic") | ||||
| 		"symbolic"|"l") | ||||
| 			link_name="$(file "${local_game_path}" | sed 's;.* symbolic link to \(.*\);\1;')" | ||||
| 			[ "${debug}" -eq "0" ] && printf '\e[1;35m%-6s\e[m\n' "DEBUG : XDG CONFIG for loop — The data of ${game_name} are already symlinked to ${link_name} . Skip." | ||||
| 			;; | ||||
| 		## Data is still a directory | ||||
| 		"directory") | ||||
| 		"directory"|"d") | ||||
| 			move_game_dir "${game_name}" "${xdg_config}" | ||||
| 			;; | ||||
| 		## Data doesn't exist | ||||
|  | @ -155,10 +161,43 @@ for game_name in ${xdg_config_games}; do | |||
| 			;; | ||||
| 		## Data can't be managed | ||||
| 		*) | ||||
| 			printf '\e[1;35m%-6s\e[m\n' "Data of ${game_name} (userdata) − ${local_game_path} are not managed. Type: ${local_game_path_type}. Abort" | ||||
| 			printf '\e[1;35m%-6s\e[m\n' "Data of ${game_name} (XDG CONFIG) − ${local_game_path} are not managed. Type: ${local_game_path_type}. Abort" | ||||
| 			exit 3 | ||||
| 			;; | ||||
| 	esac | ||||
| 
 | ||||
| done | ||||
| # }}} | ||||
| # Manage XDG data save game {{{ | ||||
| ## Set "%" as field separator | ||||
| IFS="%" | ||||
| for game_name in ${xdg_data_games}; do | ||||
| 	local_game_path="${HOME}/${xdg_data}/${game_name}" | ||||
| 	local_game_path_type="$(ls -ld "${local_game_path}" | sed 's/\(^.\).*/\1/')" | ||||
| 
 | ||||
| 	case ${local_game_path_type} in | ||||
| 		## Data is already a symlink | ||||
| 		"symbolic"|"l") | ||||
| 			link_name="$(file "${local_game_path}" | sed 's;.* symbolic link to \(.*\);\1;')" | ||||
| 			[ "${debug}" -eq "0" ] && printf '\e[1;35m%-6s\e[m\n' "DEBUG : XDG DATA for loop — The data of ${game_name} are already symlinked to ${link_name} . Skip." | ||||
| 			;; | ||||
| 		## Data is still a directory | ||||
| 		"directory"|"d") | ||||
| 			move_game_dir "${game_name}" "${xdg_data}" | ||||
| 			;; | ||||
| 		## Data doesn't exist | ||||
| 		"cannot") | ||||
| 			[ "${debug}" -eq "0" ] && printf '\e[1;35m%-6s\e[m\n' "DEBUG : XDG DATA for loop — The data of ${game_name} − ${local_game_path} doesn't exist. Skip." | ||||
| 			symlink_game_dir "${game_name}" "${xdg_data}" | ||||
| 			;; | ||||
| 		## Data can't be managed | ||||
| 		*) | ||||
| 			printf '\e[1;35m%-6s\e[m\n' "Data of ${game_name} (XDG DATA) − ${local_game_path} are not managed. Type: ${local_game_path_type}. Abort" | ||||
| 			exit 3 | ||||
| 			;; | ||||
| 	esac | ||||
| 
 | ||||
| done | ||||
| # }}} | ||||
| 
 | ||||
| exit 0 | ||||
|  |  | |||
|  | @ -17,6 +17,9 @@ | |||
| │                   ├── save0005.sav.bak | ||||
| │                   ├── save0008.sav | ||||
| │                   └── save0008.sav.bak | ||||
| ├── Capsized | ||||
| │   ├── Config.cfg | ||||
| │   └── Logs | ||||
| ├── Cellar Door Games | ||||
| │   └── Full Metal Furies | ||||
| │       └── Saves | ||||
|  | @ -24,6 +27,21 @@ | |||
| │           ├── profileData1.brdat | ||||
| │           ├── profileData1.brdat_BACKUP | ||||
| │           └── TEMPprofileData1.brdat | ||||
| ├── Facepalm Games | ||||
| │   └── The Swapper 1000 | ||||
| │       ├── CommonSettings.ini | ||||
| │       ├── CommonSettings.pro | ||||
| │       ├── CommonSettings.pro.old | ||||
| │       ├── controller_mappings_user.txt | ||||
| │       ├── darker.ini | ||||
| │       ├── darker.ini.old | ||||
| │       ├── darker.pro | ||||
| │       ├── darker.pro.old | ||||
| │       ├── Default.ini | ||||
| │       ├── gardouill.ini | ||||
| │       ├── gardouill.pro | ||||
| │       ├── gardouill.pro.old | ||||
| │       └── TrueEngineLog.txt | ||||
| ├── HotlineMiami | ||||
| │   ├── debug.log | ||||
| │   ├── hotline.cfg | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue