Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/bash
- # Set GAMEDIR to the current directory and set logfile
- GAMEDIR="$PWD"
- LOGFILE="patchlog.txt"
- LOGERR="patcherr.txt"
- # Redirect output and error to the log file
- > "$GAMEDIR/$LOGFILE" && exec > >(tee "$GAMEDIR/$LOGFILE") 2>&1
- echo "GAMEDIR is set to: $GAMEDIR"
- # Exports
- export DATADIR="$GAMEDIR/assets"
- export DATAFILE="am2r.port"
- export TMPDIR="$GAMEDIR/tmp"
- prepare_system() {
- # Test for commands: python, zip
- PYTHON=$(which python3)
- if [ -z "$PYTHON" ]; then
- echo "Missing Python!"
- return 1
- fi
- # Define 7zzs binary
- SEVENZIP="$controlfolder/7zzs.${DEVICE_ARCH}"
- if [ ! -x "$SEVENZIP" ]; then
- echo "7zzs binary not found at $SEVENZIP"
- return 1
- fi
- # Mount the GMToolkit runtime
- TOOLKIT="$HOME/gmtoolkit"
- RUNTIME="$controlfolder/libs/gmtoolkit.squashfs"
- if [ -f "$RUNTIME" ]; then
- $ESUDO mkdir -p "$TOOLKIT"
- $ESUDO umount "$TOOLKIT" 2>/dev/null || true
- $ESUDO mount "$RUNTIME" "$TOOLKIT"
- else
- echo "This port requires the GMToolkit runtime. Please download it."
- return 1
- fi
- # Attempt to get SAVEDIR from gmloader.json using jq
- if command -v jq >/dev/null 2>&1; then
- SAVEDIR=$(jq -r '.save_dir // empty' "$GAMEDIR/gmloader.json" 2>/dev/null)
- else
- SAVEDIR="$GAMEDIR/saves"
- fi
- # Exports
- export PYTHON
- export SAVEDIR
- export SEVENZIP
- export PATH="$TOOLKIT/gmtools:$TOOLKIT/utmt-cli:$PATH"
- export LD_LIBRARY_PATH="/usr/lib:$TOOLKIT/libs:$LD_LIBRARY_PATH"
- }
- unzip_archives() {
- # Create folders
- mkdir -p "$DATADIR/am2r" "$DATADIR/am2rpatch"
- # Identify AM2R zip (data.win in root)
- AM2R_ZIP="$DATADIR/am2r-another-metroid-2-remake-1-1.zip"
- # Identify autopatcher zip (has AM2R-Autopatcher-Windows-master/data/)
- AUTOPATCHER_ZIP="$DATADIR/AM2R-Autopatcher-Windows-master.zip"
- AM2R16B_ZIP="AM2R_1.6b2_windows.zip"
- if [ -z "$AM2R_ZIP" ]; then
- echo "Error: No valid AM2R zip file found."
- return 1
- fi
- if [ -z "$AUTOPATCHER_ZIP" ]; then
- echo "Error: No valid Community Patch zip file found."
- return 1
- fi
- if [ -z "$AM2R16B_ZIP" ]; then
- echo "Error: No valid AM2R 1.6B2 Patch zip file found."
- return 1
- fi
- # Unzip AM2R and autopatcher
- "$SEVENZIP" x -y "$AM2R_ZIP" -o"$DATADIR/am2r" >/dev/null
- [ -n "$AUTOPATCHER_ZIP" ] && "$SEVENZIP" x -y "$AUTOPATCHER_ZIP" -o"$DATADIR/am2rpatch" >/dev/null
- }
- prepare_files() {
- # Remove unnecessary files
- rm -rf "$DATADIR/am2r/"*.exe "$DATADIR/am2r/"*.dll "$DATADIR/.gitkeep" "$DATADIR/am2r/"*.txt
- # Apply autopatcher files if present
- if [ -n "$AUTOPATCHER_ZIP" ]; then
- cp -rf "$DATADIR/am2rpatch/AM2R-Autopatcher-Windows-master/data/files_to_copy/"* "$DATADIR/am2r/"
- fi
- # Unzip 1.6b patch
- "$SEVENZIP" x -y "$DATADIR/$AM2R16B_ZIP" -o"$DATADIR/am2r16b" >/dev/null
- cp -rf "$DATADIR/am2r16b/files_to_copy/"* "$DATADIR/am2r/"
- [ -n "$AUTOPATCHER_ZIP" ] && cp -rf "$DATADIR/am2rpatch/AM2R-Autopatcher-Windows-master/data/HDR_HQ_in-game_music/"* "$DATADIR/am2r/"
- DATA="$DATADIR/am2r/data.win"
- PATCH="$DATADIR/am2r16b/data.xdelta"
- }
- apply_xdelta() {
- # Check if the data.win file exists and apply xdelta
- if [ -f "$DATADIR/am2r/data.win" ]; then
- output=$($controlfolder/xdelta3 -d -s "$DATA" -f "$PATCH" "$DATADIR/am2r/game.droid" 2>&1)
- if [ $? -eq 0 ]; then
- echo "Patch applied successfully"
- echo "$output"
- rm -rf "$DATA" && rm -rf "$DATADIR/am2rpatch"
- else
- # If this happens, it's not AM2R 1.1
- echo "Failed to apply patch"
- echo "$output"
- return 1
- fi
- else
- # This shouldn't be reachable, but we'll do a safety check anyway
- echo "No data.win file found to patch!"
- return 1
- fi
- }
- clean_files() {
- mkdir -p "$TMPDIR"
- # Move everything from am2r into TMPDIR
- if [ -d "$DATADIR/am2r" ]; then
- mv "$DATADIR/am2r/"* "$TMPDIR/" 2>/dev/null
- mv "$DATADIR/am2r/".* "$TMPDIR/" 2>/dev/null || true # Hidden files (except . and ..)
- rmdir "$DATADIR/am2r" 2>/dev/null || true
- fi
- # Clean all contents of assets directory (DATADIR)
- rm -rf "$DATADIR/"*
- # Move everything back from TMPDIR to DATADIR
- mv "$TMPDIR/"* "$DATADIR/" 2>/dev/null
- mv "$TMPDIR/".* "$DATADIR/" 2>/dev/null || true # Hidden files again
- # Clean TMPDIR
- rm -rf "$TMPDIR/"*
- }
- # Zip it all into the .port file
- zip_archive() {
- if "$SEVENZIP" a -tzip -aoa -mx=0 "$GAMEDIR/$DATAFILE" "$DATADIR"; then
- rm -rf "$DATADIR"/*
- else
- echo "Failed to create $DATAFILE."
- return 1
- fi
- }
- # Cleanup function
- cleanup() {
- rm -rf "$TMPDIR"
- $ESUDO umount "$DOTNETDIR" 2>/dev/null || true
- $ESUDO umount "$TOOLKIT" 2>/dev/null || true
- }
- process_game() {
- echo "Checking for dependencies..."
- prepare_system || { cleanup; return 1; }
- echo "Unzipping archives..."
- unzip_archives || { cleanup; return 1; }
- echo "Preparing game..."
- prepare_files || { cleanup; return 1; }
- echo "Applying 1.6b2 patch..."
- apply_xdelta || { cleanup; return 1; }
- echo "Cleaning excess files..."
- clean_files || { cleanup; return 1; }
- echo "Finishing up..."
- zip_archive || { cleanup; return 1; }
- }
- # Call the function
- if ! process_game; then
- echo "Patching process failed!"
- mv "$LOGFILE" "$LOGERR"
- else
- echo "Patching process complete!"
- fi
- # Always run cleanup at the end
- cleanup
Add Comment
Please, Sign In to add comment