diff --git a/home/stormux/.xinitrc b/home/stormux/.xinitrc index 07cc423..e48dac4 100755 --- a/home/stormux/.xinitrc +++ b/home/stormux/.xinitrc @@ -78,6 +78,64 @@ setup_and_run_downloadable() { fi } +# Enhanced function to handle downloadable games with direct URL support +setup_and_run_downloadable_url() { + local downloadUrl="$1" + local gameDir="$2" + local executable="$3" + local fallbackUrl="$4" + local needNvda="$5" + local extractDir="$HOME/.local/games/$gameDir" + local tempZip="/tmp/${gameDir}_download.zip" + + # Check if game is already installed + if [[ -e "$extractDir/$executable" ]]; then + run_wine "$gameDir" "./$executable" "$needNvda" + return + fi + + # Download the game + echo "Downloading $gameDir..." + if curl -L -o "$tempZip" "$downloadUrl"; then + # Recreate extractDir + rm -rf "$extractDir" + mkdir -p "$extractDir" + + # Get the first path component of each file in the zip + mapfile -t topDirs < <(unzip -l "$tempZip" | awk 'NR>3 {print $4}' | grep '/$' | cut -d/ -f1 | sort -u | grep -v '^$') + if [[ ${#topDirs[@]} -eq 1 ]]; then + # Zip has a single top-level dir - extract to ~/.local/games, then rename + unzip -q "$tempZip" -d ~/.local/games + # If the extracted dir name differs from gameDir, rename it + if [[ "${topDirs[0]}" != "$gameDir" ]]; then + mv ~/.local/games/"${topDirs[0]}" "$extractDir" + fi + else + # Unzips file into the given directory without creating a subdirectory + unzip -q "$tempZip" -d "$extractDir" + fi + + # Copy NVDA DLLs + for i in 32 64; do + find "$extractDir" -type f -name "nvdaControllerClient${i}.dll" -exec cp -v "$HOME/.local/games/nvda/nvdaControllerClient${i}.dll" '{}' \; + done + + rm -f "$tempZip" + echo "Download and installation complete!" + + # Now run the game + if [[ -e "$extractDir/$executable" ]]; then + run_wine "$gameDir" "./$executable" "$needNvda" + else + echo "Error: Game executable not found after installation" + run_web "$fallbackUrl" + fi + else + echo "Download failed, opening fallback URL" + run_web "$fallbackUrl" + fi +} + # Function to handle all web-based games run_web() { orca & @@ -377,6 +435,12 @@ case "$GAME" in "Wicked Quest") run_native "wicked-quest" "wicked_quest.py" ;; + "Wreckingball") + setup_and_run_downloadable_url "https://sightlesswolf.com/wreckingball.zip" "wreckingball" "wreckingball.exe" "https://sightlesswolf.com" "nvda2speechd" + ;; + "Wreckingball (Pulped)") + setup_and_run_downloadable_url "https://sightlesswolf.com/wreckingball-pulped.zip" "wreckingball-pulped" "wreckingball.exe" "https://sightlesswolf.com" "nvda2speechd" + ;; "Kitchensinc") pushd "/home/stormux/.wine32/drive_c/Program Files/Kitchen's Sink" WINEPREFIX=/home/stormux/.wine32 /home/stormux/.local/wine32/bin/wine gamemenu.exe diff --git a/home/stormux/Documents/change_log.md b/home/stormux/Documents/change_log.md index fc795c3..de87a06 100644 --- a/home/stormux/Documents/change_log.md +++ b/home/stormux/Documents/change_log.md @@ -3,6 +3,16 @@ Dates are given for the image. All items listed are available for the listed image version coinciding with the listed date. For example, everything listed under may 7, 2025 are available in the image named stormux_gaming_image-2025.05.07.img.xz. +## October 1, 2025 + +- Wine configuration update (x86_64) +- System updates +- Update Toby Doom +- Extend install system to get games not included in the image +- Work on system to require fewer reinstallations +- Update Wicked Quest + + ## September 1, 2025 - Fixed bug causing Crazy Party to not launch diff --git a/root/live-update.sh b/root/live-update.sh index f303505..8dfa5bd 100644 --- a/root/live-update.sh +++ b/root/live-update.sh @@ -2,9 +2,10 @@ gitUrl="https://git.stormux.org/storm/gaming-image-files" gitPath="${gitUrl##*/}" -pushd /tmp +pushd /tmp || exit git clone "${gitUrl}" -pushd "${gitPath}" +pushd "${gitPath}" || exit +git checkout testing git lfs pull # Files and directories to ignore when copying ignoreFiles=(".git" "./image" ".git*") @@ -21,8 +22,8 @@ done find . "${findArgs[@]}" -type f -exec bash -c 'for i ; do cp -av --preserve=all --parents "${i}" /;done' _ "{}" \; # Fix ownership of home directory files chown -R stormux:users /home/stormux -popd +popd || exit rm -rf "${gitPath}" -popd +popd || exit exit 0 diff --git a/usr/local/bin/game_launcher.py b/usr/local/bin/game_launcher.py index be52e72..40e5197 100755 --- a/usr/local/bin/game_launcher.py +++ b/usr/local/bin/game_launcher.py @@ -16,6 +16,7 @@ import configparser import pathlib import re import simpleaudio as sa +import json class VoicedMenu: def __init__(self, title="Stormux Game Menu"): @@ -58,6 +59,37 @@ class VoicedMenu: # Track playing sound self.currentSound = None + # Load downloadable games registry + self.downloadable_games = self.load_downloadable_games() + + def load_downloadable_games(self): + """Load downloadable games registry from JSON file""" + registry_path = "/usr/share/stormux/downloadable_games.json" + try: + if os.path.exists(registry_path): + with open(registry_path, 'r') as f: + data = json.load(f) + return data.get('downloadable_games', {}) + return {} + except Exception as e: + print(f"Error loading downloadable games registry: {e}") + return {} + + def is_game_installed(self, game_id): + """Check if a downloadable game is installed""" + if game_id not in self.downloadable_games: + return True # Not a downloadable game, assume installed + + game_info = self.downloadable_games[game_id] + game_dir = os.path.expanduser(f"~/.local/games/{game_info['directory']}") + return os.path.exists(game_dir) and os.path.exists(os.path.join(game_dir, game_info['executable'])) + + def get_display_name(self, game_name, game_id=None): + """Get display name for menu item, adding (not installed) if needed""" + if game_id and game_id in self.downloadable_games and not self.is_game_installed(game_id): + return f"{game_name} (not installed)" + return game_name + def init_speech(self): """Initialize the speech client""" try: @@ -996,6 +1028,8 @@ if __name__ == "__main__": menu.add_item("Arcade", "Toy Mania", "GAME='Toy Mania' startx") menu.add_item("Arcade", "Villains From Beyond", "GAME='Villains From Beyond' startx") menu.add_item("Arcade", "Wicked Quest", "GAME='Wicked Quest' startx") + menu.add_item("Arcade", menu.get_display_name("Wreckingball", "wreckingball"), "GAME='Wreckingball' startx") + menu.add_item("Arcade", menu.get_display_name("Wreckingball (Pulped)", "wreckingball-pulped"), "GAME='Wreckingball (Pulped)' startx") menu.add_item("Arcade", "Zombowl", "GAME='Zombowl' startx") # Add board and card games section @@ -1103,6 +1137,7 @@ if __name__ == "__main__": menu.add_item("System", "Set Timezone", "GAME='Set Timezone' /home/stormux/.clirc") menu.add_item("System", "Upload Files", "/home/stormux/.local/upload_server/uploader.py") menu.add_item("System", "Download Files", "/home/stormux/.local/download_server.py") + menu.add_item("System", "Update System", "sudo /usr/local/bin/live-update.sh") menu.add_item("System", "Restart: Can Take Several Minutes", "sudo reboot") menu.add_item("System", "Power Off: Wait 2 Minutes Before Disconnecting Power", "sudo poweroff") # Service menu items will be added dynamically in run() method via update_service_menu_items() diff --git a/usr/local/bin/live-update.sh b/usr/local/bin/live-update.sh new file mode 100755 index 0000000..d6e8957 --- /dev/null +++ b/usr/local/bin/live-update.sh @@ -0,0 +1,32 @@ +#!/usr/bin/env bash + +# Update system packages (run as stormux user since yay shouldn't run as root) +sudo -u stormux yay -Syu --noconfirm --removemake --cleanafter + +gitUrl="https://git.stormux.org/storm/gaming-image-files" +gitPath="${gitUrl##*/}" +pushd /tmp || exit +git clone "${gitUrl}" +pushd "${gitPath}" || exit +git checkout master +git lfs pull +# Files and directories to ignore when copying +ignoreFiles=(".git" "./image" ".git*" "/home/stormux/.w3m") +# Build find command with ignore patterns +findArgs=() +for ignore in "${ignoreFiles[@]}"; do + if [[ "$ignore" == .* && "$ignore" != ./* ]]; then + findArgs+=(-name "$ignore" -prune -o) + else + findArgs+=(-path "$ignore" -prune -o) + fi +done +# Copy all files as root (preserves permissions properly) +find . "${findArgs[@]}" -type f -exec bash -c 'for i ; do cp -av --preserve=all --parents "${i}" /;done' _ "{}" \; +# Fix ownership of home directory files +chown -R stormux:users /home/stormux +popd || exit +rm -rf "${gitPath}" +popd || exit + +exit 0