#!/usr/bin/env bash # ============================================================================== # F76.WORLD - Linux & Steam Deck 1-Click Optimizer & INI Deployer # Target: Fallout 76 (Steam AppID: 1151340 / Proton) # Game Update: Patch 70 "The Slasher" (v1.7.26.13) # ============================================================================== set -e COLOR_GOLD='\033[38;2;255;176;0m' COLOR_GREEN='\033[38;2;16;185;129m' COLOR_CYAN='\033[38;2;6;182;212m' COLOR_RED='\033[38;2;239;68;68m' COLOR_RESET='\033[0m' COLOR_BOLD='\033[1m' echo -e "${COLOR_GOLD}${COLOR_BOLD}" echo " ███████╗███████╗ ██████╗ ██╗ ██╗ ██████╗ ██████╗ ██╗ ██████╗ " echo " ██╔════╝╚════██║██╔════╝ ██║ ██║██╔═══██╗██╔══██╗██║ ██╔══██╗" echo " █████╗ ██╔╝███████╗ ██║ █╗ ██║██║ ██║██████╔╝██║ ██║ ██║" echo " ██╔══╝ ██╔╝ ██╔═══██╗ ██║███╗██║██║ ██║██╔══██╗██║ ██║ ██║" echo " ██║ ██║ ╚██████╔╝ ╚███╔███╔╝╚██████╔╝██║ ██║███████╗██████╔╝" echo " ╚═╝ ╚═╝ ╚═════╝ ╚══╝╚══╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝╚═════╝ " echo -e "${COLOR_RESET}" echo -e "${COLOR_CYAN} Appalachia Steam Deck & Linux Proton Deployer • Patch 70 Ready${COLOR_RESET}" echo -e " Authoritative Webhook: https://f76.world\n" # Parse Flags DRY_RUN=false for arg in "$@"; do case $arg in --dry-run|--test|-t) DRY_RUN=true shift ;; --apply|-y) DRY_RUN=false shift ;; --help|-h) echo "Usage: ./f76-deck-install.sh [--dry-run|--apply]" echo " --dry-run Simulates directory scan and diff without writing files." echo " --apply Creates .bak timestamped backup and installs optimized INI." exit 0 ;; esac done # If executed interactively without flags, prompt the user if [ "$DRY_RUN" = false ] && [ -t 0 ] && [ "$1" != "--apply" ]; then echo -e "Select execution mode:" echo -e " [1] ${COLOR_GREEN}Dry-Run / Test Safe Run${COLOR_RESET} (Inspect paths & diff, ZERO disk changes)" echo -e " [2] ${COLOR_GOLD}Apply Live Optimization${COLOR_RESET} (Backup existing INI & write new config)" read -p "Enter choice [1 or 2, default: 1]: " user_choice if [ "$user_choice" != "2" ]; then DRY_RUN=true fi echo "" fi # Proton Path Resolution (AppID 1151340) POSSIBLE_PATHS=( "$HOME/.steam/steam/steamapps/compatdata/1151340/pfx/drive_c/users/steamuser/Documents/My Games/Fallout 76" "$HOME/.local/share/Steam/steamapps/compatdata/1151340/pfx/drive_c/users/steamuser/Documents/My Games/Fallout 76" "$HOME/.var/app/com.valvesoftware.Steam/.local/share/Steam/steamapps/compatdata/1151340/pfx/drive_c/users/steamuser/Documents/My Games/Fallout 76" "$HOME/Documents/My Games/Fallout 76" ) TARGET_DIR="" for p in "${POSSIBLE_PATHS[@]}"; do if [ -d "$p" ]; then TARGET_DIR="$p" break fi done # Fallback creation path if none found if [ -z "$TARGET_DIR" ]; then TARGET_DIR="$HOME/.steam/steam/steamapps/compatdata/1151340/pfx/drive_c/users/steamuser/Documents/My Games/Fallout 76" fi echo -e "[*] Target Proton Documents Directory: ${COLOR_BOLD}$TARGET_DIR${COLOR_RESET}" TARGET_INI="$TARGET_DIR/Fallout76Custom.ini" # Define Optimized INI Payload read -r -d '' INI_PAYLOAD << 'EOF' || true ; ============================================================================== ; F76.WORLD OPTIMIZED PRESET - PATCH 70 (THE SLASHER) VERIFIED ; Engine Invariant: sResourceArchive2List handles client mods non-destructively ; ============================================================================== [Display] iPresentInterval = 0 bFull Screen = 0 bBorderless = 1 fSunUpdateThreshold = 0.5 [Controls] fMouseHeadingXScale = .021 fMouseHeadingYScale = .021 bMouseAcceleration = 0 fPitchSpeed = 0.0000 [Interface] fDefaultWorldFOV = 90.0 fDefault1stPersonFOV = 90.0 fSafeZoneX = 15.0 fSafeZoneY = 15.0 fSafeZoneXWide = 64.0 fSafeZoneXWide16x10 = 64.0 fSafeZoneYWide16x10 = 36.0 [General] sIntroSequence = uMainMenuDelayBeforeAllowSkip = 0 bAlwaysActive = 1 uMainMenuMusicAttnmB = 800 [Grass] iMinGrassSize = 40 bAllowCreateGrass = 1 [ImageSpace] bMBEnable = 0 bDoRadialBlur = 0 [Pipboy] fPipboyEffectColorR = 0.1000 fPipboyEffectColorG = 1.0000 fPipboyEffectColorB = 0.3000 fQuickboyEffectColorR = 0.1000 fQuickboyEffectColorG = 1.0000 fQuickboyEffectColorB = 0.3000 [Archive] bInvalidateOlderFiles = 1 sResourceDataDirsFinal = sResourceArchive2List = SeventySix - StaticMeshes.ba2 EOF if [ "$DRY_RUN" = true ]; then echo -e "\n${COLOR_CYAN}[🛡️ DRY-RUN / TEST SAFE RUN ACTIVE]${COLOR_RESET}" echo -e "The following configuration WOULD be written to: ${COLOR_BOLD}$TARGET_INI${COLOR_RESET}\n" echo -e "${COLOR_GREEN}--- PROPOSED Fallout76Custom.ini ---${COLOR_RESET}" echo "$INI_PAYLOAD" echo -e "${COLOR_GREEN}-------------------------------------${COLOR_RESET}\n" if [ -f "$TARGET_INI" ]; then echo -e "${COLOR_GOLD}[i] Existing INI detected.${COLOR_RESET} A backup would be created at: ${TARGET_INI}.bak.$(date +%Y%m%d%H%M%S)" else echo -e "${COLOR_GOLD}[i] No existing INI file.${COLOR_RESET} File would be created fresh." fi echo -e "\n${COLOR_GREEN}✔ Dry-run complete. ZERO files modified on disk.${COLOR_RESET}" echo -e "To apply these changes, re-run with: ${COLOR_BOLD}curl -sSL https://f76.world/deck | bash -s -- --apply${COLOR_RESET}\n" exit 0 fi # Live Apply Flow echo -e "\n${COLOR_GOLD}[⚡ APPLYING OPTIMIZATIONS LIVE]${COLOR_RESET}" mkdir -p "$TARGET_DIR" if [ -f "$TARGET_INI" ]; then BACKUP_FILE="${TARGET_INI}.bak.$(date +%Y%m%d%H%M%S)" cp "$TARGET_INI" "$BACKUP_FILE" echo -e "${COLOR_GREEN}✔ Created safety backup:${COLOR_RESET} $BACKUP_FILE" fi echo "$INI_PAYLOAD" > "$TARGET_INI" chmod 644 "$TARGET_INI" echo -e "${COLOR_GREEN}✔ Successfully installed optimized Fallout76Custom.ini!${COLOR_RESET}" echo -e " Location: ${COLOR_BOLD}$TARGET_INI${COLOR_RESET}" echo -e " Settings: 1:1 Mouse Fix • FPS Unlocked • Intro Skipped • FOV 90 • Safe sResourceArchive2List" echo -e "\n${COLOR_CYAN}Launch Fallout 76 from Steam to enjoy smooth Appalachian exploration!${COLOR_RESET}\n"