diff --git a/games/factorio_manager.sh b/games/factorio_manager.sh index 8db4f717cd3dc70254250b1ea40d1f5eda2f1b94..a0d0d9a264b3e5bb4821648da76b0c6188746bed 100755 --- a/games/factorio_manager.sh +++ b/games/factorio_manager.sh @@ -883,6 +883,88 @@ function validate_path_or_terminate() { fi } +# +# Prompts user to pick version of Factorio. +# +# Arguments: +# +# $1 (game_installations_directory) +# Path to directory containing Factorio installations. +# +# $2 (default_version, optional) +# Default version to fill-in for the user. If not set, last +# version in the directory (sorted alphabetically) will be used. +# +# $3 (default_marker, optional) +# Marker text to use for the default version. Default is "default". +# +# Returns: +# +# 0 if version was successfully selected, 1 otherwise. +# +# Sets: +# +# game_version_selected +# +function select_factorio_version() { + local game_installations_directory="$1" + local default_version="${2-}" + local default_marker="${3-default}" + + local game_versions_available=() + local candidate + local i default_option selected_option + + declare -g game_version_selected="" + + # Grab a list of available versions. + for candidate in "$game_installations_directory"/*; do + if [[ -f $candidate/bin/x64/factorio ]]; then + game_versions_available+=( "$(basename "$candidate")" ) + fi + done + + if [[ ${#game_versions_available[@]} == 0 ]]; then + error "Could not find any Factorio installations under directory '$game_installations_directory'." + error "Please unpack Factorio installations into the directory, or use set-game-dir command to specify directory with Factorio installations." + return 1 + fi + + echo "The following versions of Factorio are locally available:" + echo + + for i in "${!game_versions_available[@]}"; do + let i++ + echo -n " [$i] $(basename "${game_versions_available[$i-1]}")" + + # Highlight default version. + if [[ -z $default_version && $i == ${#game_versions_available[@]} ]] || \ + [[ -n $default_version && ${game_versions_available[i-1]} == $default_version ]]; then + colorecho boldgreen " [$default_marker]" + default_option="$i" + else + echo + fi + done + + echo + + while [[ -z $game_version_selected ]]; do + read -e -p "Please specify what version you would like to use (enter for $default_marker): " selected_option + [[ -z $selected_option ]] && selected_option="$default_option" + + if [[ $selected_option =~ ^[[:digit:]]+$ ]] && (( $selected_option >= 1 && $selected_option <= ${#game_versions_available[@]} )); then + game_version_selected="${game_versions_available[$selected_option-1]}" + else + error "Invalid option selected, please try again." + echo + fi + done + + return 0 +} + + # Define error codes. SUCCESS=0 ERROR_ARGUMENTS=1 @@ -1029,26 +1111,7 @@ elif [[ $command == create ]]; then validate_path_or_terminate "instance_directory_new" "$instance_directory" "$ERROR_ARGUMENTS" - # Display list of available Factorio versions and let user pick one. - echo "The following versions of Factorio are locally available:" - echo - - for candidate in "$game_installations_directory"/*; do - if [[ -f $candidate/bin/x64/factorio ]]; then - echo " - $(basename "$candidate")" - fi - done - - echo - - echo -n "Please specify what version you would like to use: " - read game_version_selected - - # Validate user input. - if [[ ! -f "$game_installations_directory/$game_version_selected/bin/x64/factorio" ]]; then - error "Requested version not locally available: $game_version_selected" - exit "$ERROR_ARGUMENTS" - fi + select_factorio_version "$game_installations_directory" || exit "$ERROR_GENERAL" # Set-up the instance. mkdir "$instance_directory" @@ -1095,9 +1158,6 @@ EOF warning "Since the generated configuration file is almost empty, Factorio will complain that the file seems corrupt." warning "Factorio will offer to fix the corrupted configuration file by filling-in the missing information during the first startup." warning "It should be safe to accept this. This warning will be shown by Factorio only the first time." - echo - echo "Please read the warning above, and press any key to continue." - read elif [[ $command == launch ]]; then