Skip to content

How to Install & Play Shockwave Mod

Felipe Keller Braz edited this page Oct 3, 2026 · 2 revisions

How to Install & Play the 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.


1. Downloading and Extracting Shockwave 1.201

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.

Extracting on macOS & Linux

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_*.gib archive files (such as !Shw_ini.gib, !Shw_scripts.gib, !Shw_maps.gib)
  • Data/Movies/
  • Install_Final_shw.bmp

2. Understanding the File Structure & Activation

Shockwave uses .gib extensions so its Windows launcher can toggle the mod on and off by renaming files:

  1. All !Shw_*.gib files are renamed to !Shw_*.big.
  2. Install_Final_shw.bmp becomes Install_Final.bmp.
  3. In stock Zero Hour, Data/Scripts/SkirmishScripts.scb is a loose file that ships with the base game. Shockwave bundles its own updated SkirmishScripts.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.


3. Installation Guide

Option A: Manual Installation

  1. 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 GeneralsXZH and run.sh
    • Windows: your Zero Hour install folder
  2. Copy the extracted Shockwave files into that directory.
  3. Rename .gib files to .big:
    for f in !Shw*.gib; do mv "$f" "${f%.gib}.big"; done
  4. Launch the game normally!
    • On macOS: launch GeneralsXZH.app.
    • On Linux (Flatpak): flatpak run org.generalsx.GeneralsZH.
    • On Native Linux: ./run.sh.

Option B: Universal Toggle Script (Linux, macOS, Windows)

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"

How to use the script:

  1. Save the file inside your game data folder as:
    • macOS: Launch ShockWave.command (double-clickable directly in Finder!)
    • Linux / Windows: launch-shockwave.sh
  2. Grant execute permissions:
    chmod +x "Launch ShockWave.command" # or chmod +x launch-shockwave.sh
  3. Run the script! When you close the game, all files will be automatically reverted back to the clean Zero Hour state.

4. Troubleshooting & Notes

  • 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.scb in your game data directory is renamed to .bcs so the mod's script file in !Shw_scripts.big is loaded.
  • Returning to Vanilla Zero Hour: Rename all !Shw_*.big files back to .gib (or use the toggle script above).

Clone this wiki locally