Repository navigation
How to Install & Play Shockwave Mod
Shockwave is one of the most popular and polished mods for Command & Conquer: Generals – Zero Hour. It enhances the game with new units, upgraded visuals, and three brand-new playable factions:
- USA Armor General (General Alexis Alexander / Ironside)
- GLA Salvage General (General Mohmar Deathstrike)
- China Special Weapons General (General Leang)
This guide explains how to extract, install, and run Shockwave 1.201 with GeneralsX on Linux and macOS.
The official release from ModDB comes as a Windows installer executable: ShockWaveV1201.exe.
Note
The installer is packaged using Clickteam Install Creator. You do not need a Windows machine or a full Wine prefix to extract it.
You can extract the contents using cicdec (a cross-platform open-source Clickteam unpacker that runs on .NET):
# 1. Clone cicdec
git clone https://github.com/Bioruebe/cicdec.git /tmp/cicdec-src
# 2. Build with dotnet
dotnet build /tmp/cicdec-src/cicdec/cicdec.csproj
# 3. Extract the Shockwave installer into a folder
dotnet /tmp/cicdec-src/cicdec/bin/Debug/net*/cicdec.dll path/to/ShockWaveV1201.exe ./ShockwaveExtracted/Alternatively, on Linux, you can run the installer through Wine to unpack it into a temporary prefix directory.
Inside the extracted folder, you will find:
- Several
!Shw_*.gibarchive files (such as!Shw_ini.gib,!Shw_scripts.gib,!Shw_maps.gib) Data/Movies/Install_Final_shw.bmp
Shockwave uses .gib extensions so its Windows launcher can toggle the mod on and off by renaming files:
- All
!Shw_*.gibfiles are renamed to!Shw_*.big. -
Install_Final_shw.bmpbecomesInstall_Final.bmp. - In stock Zero Hour,
Data/Scripts/SkirmishScripts.scbis a loose file that ships with the base game. Shockwave bundles its own updatedSkirmishScripts.scb(with AI scripts for the new generals) inside!Shw_scripts.big.
Tip
GeneralsX Engine Update: GeneralsX automatically gives precedence to mod archives (!*.big) over stock loose files in Data/Scripts/, so the new generals' Skirmish AI works out of the box! On older builds, if the new AI sits idle, rename Data/Scripts/SkirmishScripts.scb to SkirmishScripts.bcs in your game data directory.
-
Locate your game data directory:
-
macOS:
~/Library/Application Support/GeneralsX/GeneralsZH/(or~/GeneralsX/GeneralsMD) -
Linux (Flatpak):
~/.var/app/org.generalsx.GeneralsZH/data/(or~/.local/share/GeneralsX/GeneralsZH/) -
Linux (Native): your game directory containing
GeneralsXZHandrun.sh - Windows: your Zero Hour install folder
-
macOS:
- Copy the extracted Shockwave files into that directory.
-
Rename
.gibfiles to.big:for f in !Shw*.gib; do mv "$f" "${f%.gib}.big"; done
-
Launch the game normally!
- On macOS: launch
GeneralsXZH.app. - On Linux (Flatpak):
flatpak run org.generalsx.GeneralsZH. - On Native Linux:
./run.sh.
- On macOS: launch
Instead of manually renaming files whenever you want to switch between vanilla Zero Hour and Shockwave, you can use an automated toggle script.
Originally contributed by @homezxc in Discussion #207 and expanded here, this script automatically detects your platform (macOS, Linux Flatpak, native Linux, or Windows via Git Bash), activates Shockwave, launches the game, and restores vanilla Zero Hour files as soon as the game exits:
#!/bin/bash
# Universal ShockWave Launcher for GeneralsX (Linux, macOS, Windows/Git Bash)
# Based on original script by @homezxc (https://github.com/fbraz3/GeneralsX/discussions/207)
set -u
GAME_DIR="$(cd "$(dirname "$0")" && pwd)"
LOCK_DIR="${GAME_DIR}/.generalsx-mod.lock"
activated=0
# Detect executable launcher if not specified via SHOCKWAVE_APP_LAUNCHER
if [[ -z "${SHOCKWAVE_APP_LAUNCHER:-}" ]]; then
if [[ "$(uname -s)" == "Darwin" && -x "/Applications/GeneralsXZH.app/Contents/MacOS/run.sh" ]]; then
APP_LAUNCHER="/Applications/GeneralsXZH.app/Contents/MacOS/run.sh"
elif [[ -x "${GAME_DIR}/run.sh" ]]; then
APP_LAUNCHER="${GAME_DIR}/run.sh"
elif [[ -x "${GAME_DIR}/GeneralsXZH" ]]; then
APP_LAUNCHER="${GAME_DIR}/GeneralsXZH"
elif [[ -x "${GAME_DIR}/GeneralsXZH.exe" ]]; then
APP_LAUNCHER="${GAME_DIR}/GeneralsXZH.exe"
elif [[ -x "${GAME_DIR}/generals.exe" ]]; then
APP_LAUNCHER="${GAME_DIR}/generals.exe"
elif command -v flatpak >/dev/null 2>&1 && flatpak info org.generalsx.GeneralsZH >/dev/null 2>&1; then
APP_LAUNCHER="flatpak run org.generalsx.GeneralsZH"
else
APP_LAUNCHER=""
fi
else
APP_LAUNCHER="$SHOCKWAVE_APP_LAUNCHER"
fi
SHOCKWAVE_ARCHIVES=(
"!0Shwpatch"
"!Shw_Challenge"
"!Shw_ini"
"!Shw_maps"
"!Shw_scripts"
"!Shw_wnd"
"!Shw2DArt"
"!ShwAudio"
"!ShwTextures"
"!ShwVoice"
"!ShwW3D"
)
STOCK_SCRIPTS=(
"Data/Scripts/MultiplayerScripts.scb"
"Data/Scripts/Scripts.ini"
"Data/Scripts/SkirmishScripts.scb"
)
fail() {
echo "ShockWave launcher error: $*" >&2
exit 1
}
restore() {
local archive script
if [[ "$activated" -eq 1 ]]; then
if [[ -e "Install_Final.bmp" && ! -e "Install_Final_shw.bmp" ]]; then
mv "Install_Final.bmp" "Install_Final_shw.bmp"
fi
if [[ -e "Install_Final.pmb" && ! -e "Install_Final.bmp" ]]; then
mv "Install_Final.pmb" "Install_Final.bmp"
fi
for script in "${STOCK_SCRIPTS[@]}"; do
if [[ -e "${script}.bcs" && ! -e "$script" ]]; then
mv "${script}.bcs" "$script"
fi
done
for archive in "${SHOCKWAVE_ARCHIVES[@]}"; do
if [[ -e "${archive}.big" && ! -e "${archive}.gib" ]]; then
mv "${archive}.big" "${archive}.gib"
fi
done
fi
rmdir "$LOCK_DIR" 2>/dev/null || true
}
trap restore EXIT HUP INT TERM
[[ -n "$APP_LAUNCHER" ]] || fail "Could not auto-detect GeneralsX launcher. Set SHOCKWAVE_APP_LAUNCHER=/path/to/executable"
cd "$GAME_DIR" || fail "Could not enter game directory: $GAME_DIR"
if ! mkdir "$LOCK_DIR" 2>/dev/null; then
fail "Another mod launch is active, or a previous launch was interrupted. Remove $LOCK_DIR if not running."
fi
# Activate Shockwave
activated=1
for archive in "${SHOCKWAVE_ARCHIVES[@]}"; do
[[ -e "${archive}.gib" ]] && mv "${archive}.gib" "${archive}.big"
done
for script in "${STOCK_SCRIPTS[@]}"; do
[[ -e "$script" ]] && mv "$script" "${script}.bcs"
done
[[ -e "Install_Final.bmp" ]] && mv "Install_Final.bmp" "Install_Final.pmb"
[[ -e "Install_Final_shw.bmp" ]] && mv "Install_Final_shw.bmp" "Install_Final.bmp"
echo "Starting ShockWave ($APP_LAUNCHER)..."
$APP_LAUNCHER
exit_code=$?
echo "Restoring original Zero Hour files..."
exit "$exit_code"- Save the file inside your game data folder as:
-
macOS:
Launch ShockWave.command(double-clickable directly in Finder!) -
Linux / Windows:
launch-shockwave.sh
-
macOS:
- Grant execute permissions:
chmod +x "Launch ShockWave.command" # or chmod +x launch-shockwave.sh
- Run the script! When you close the game, all files will be automatically reverted back to the clean Zero Hour state.
-
Skirmish AI Not Building / Inactive:
Ensure you are using a GeneralsX build containing PR #352. If using an older release, check that
Data/Scripts/SkirmishScripts.scbin your game data directory is renamed to.bcsso the mod's script file in!Shw_scripts.bigis loaded. -
Returning to Vanilla Zero Hour:
Rename all
!Shw_*.bigfiles back to.gib(or use the toggle script above).