# Project New Shoes: complete project guide

Canonical site: https://newshoes.gg/

Source: https://github.com/Agusx1211/NewShoes

Current tracker: https://github.com/Agusx1211/NewShoes/issues

Facts reviewed: 2026-09-21. Review deadline: 2026-10-12. Canonical machine-readable facts: https://newshoes.gg/project-info.json

## At a glance

Project New Shoes is a browser port of the original Command & Conquer: Generals and Command & Conquer: Generals Zero Hour C++ engine. The real engine is compiled to WebAssembly, with browser implementations at its operating-system boundaries.

Project New Shoes is not a remake, clone, source port with replacement gameplay, video stream, or emulator running the Windows executable. The original engine owns the simulation, AI, rules, maps, scripts, UI, input semantics, renderer, audio requests, movie presentation, and lockstep multiplayer protocol.

Zero Hour is the current playable target. Generals data is required because Zero Hour depends on it, but a separate vanilla Generals launch option is not currently exposed.

Project New Shoes is independent modified software. It is not affiliated with, endorsed by, or supported by Electronic Arts. The repository and browser-port modifications are distributed under GNU GPL version 3 with the additional section 7 terms in the project license. The site does not include retail game archives, disc images, maps, textures, models, music, speech, or movies. A player must supply data from a copy they own.

## What a player can do

### Install and launch a local copy

**Status: Supported.** A single-card launcher imports a complete English Generals and Zero Hour installation folder without uploading retail files, then offers one Play control.

The browser launcher inspects a complete English Generals and Zero Hour installation folder selected by the person using the browser. The former disc-image and media-set import path is not exposed by the current launcher.

The launcher reads and validates the required files locally, recognizes Steam's nested ZH_Generals base-data folder, and can install the needed BIG archives into the browser's Origin Private File System (OPFS). The installed game remains associated with that browser profile and site origin.

After installation the launcher shows a single Play control. Display, rendering, camera, cursor, diagnostics, multiplayer identity, and analytics consent settings open from an Options sheet on the same card. There is no separate browser desktop, game library, file manager, or collection of auxiliary apps.

On phones the same card lays out in one column with touch-sized source pickers, and the Options sheet slides up from the bottom edge inside the safe area. Larger screens center the card. Light and dark color schemes follow the system preference.

Evidence: [WebAssembly/harness/launcher-asset-manager.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/launcher-asset-manager.mjs), [WebAssembly/harness/opfs_realm_files.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/opfs_realm_files.mjs), [WebAssembly/harness/opfs_realm_files_unit.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/opfs_realm_files_unit.mjs), [WebAssembly/harness/game-data-store.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/game-data-store.mjs), [WebAssembly/harness/startup_vertical_smoke.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/startup_vertical_smoke.mjs), [WebAssembly/harness/launcher.js](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/launcher.js), [WebAssembly/harness/launcher_browser_smoke.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/launcher_browser_smoke.mjs). Reviewed 2026-09-21.

### Play Zero Hour

**Status: Supported.** The original Zero Hour shell boots and playable skirmishes run against the original AI through the engine's real simulation and input paths.

Players use the original menus, mouse, keyboard, touch controls, selection, building, production, movement, camera, and combat behavior. This is the actual C++ engine compiled for WebAssembly rather than reimplemented gameplay.

Midgame optimizations reduce repeated AI cleanup and spatial-search work while retaining the original simulation update order, targeting order, and distance rules. Frame rate remains dependent on battle size, browser, and hardware.

Mouse camera scrolling preserves the original right-drag default speed across supported render resolutions. The original Options menu Scroll Speed control adjusts right-drag, keyboard, and edge-scrolling sensitivity, and moving the cursor to the game canvas edge scrolls the tactical view.

All official multiplayer maps have been exercised to rendered skirmish state. Campaign and Generals Challenge use the real engine and are in active validation; mission breadth, cutscenes, win and loss flows, and edge cases continue to receive coverage.

The browser persists the original engine's last skirmish map, faction, slots, teams, starting cash, superweapon restriction, and game speed. Local LLM commander profile selections are remembered separately from the legacy LAN-compatible slot string; if a selected profile is later deleted, its classic AI fallback remains usable.

This is a playable development product, not a claim that every original flow and every browser combination is already perfect. Current issues and deployed build metadata should be consulted for narrower compatibility claims.

Evidence: [GeneralsMD/Code/GameEngine/Source/GameClient/MessageStream/LookAtXlat.cpp](https://github.com/Agusx1211/NewShoes/blob/main/GeneralsMD/Code/GameEngine/Source/GameClient/MessageStream/LookAtXlat.cpp), [GeneralsMD/Code/GameEngine/Source/GameLogic/AI/AI.cpp](https://github.com/Agusx1211/NewShoes/blob/main/GeneralsMD/Code/GameEngine/Source/GameLogic/AI/AI.cpp), [GeneralsMD/Code/GameEngine/Source/GameLogic/Object/PartitionManager.cpp](https://github.com/Agusx1211/NewShoes/blob/main/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/PartitionManager.cpp), [GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp](https://github.com/Agusx1211/NewShoes/blob/main/GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp), [WebAssembly/tests/partition_query_index_smoke.cpp](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/tests/partition_query_index_smoke.cpp), [WebAssembly/tests/partition_detach_dirty_smoke.cpp](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/tests/partition_detach_dirty_smoke.cpp), [docs/shockwave-replay-performance.md](https://github.com/Agusx1211/NewShoes/blob/main/docs/shockwave-replay-performance.md), [WebAssembly/tests/sleepy_update_removal_smoke.cpp](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/tests/sleepy_update_removal_smoke.cpp), [WebAssembly/harness/bridge.js](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/bridge.js), [WebAssembly/harness/engine_realm_boot.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/engine_realm_boot.mjs), [WebAssembly/harness/camera_scroll_runtime_smoke.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/camera_scroll_runtime_smoke.mjs), [WebAssembly/harness/skirmish_start_smoke.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/skirmish_start_smoke.mjs), [GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/SkirmishGameOptionsMenu.cpp](https://github.com/Agusx1211/NewShoes/blob/main/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/SkirmishGameOptionsMenu.cpp), [WebAssembly/harness/skirmish_preferences_persistence_smoke.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/skirmish_preferences_persistence_smoke.mjs), [WebAssembly/harness/threaded_play_gate.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/threaded_play_gate.mjs), [WebAssembly/harness/shellmap_real_init_gate.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/shellmap_real_init_gate.mjs), [GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient/W3DDisplay.cpp](https://github.com/Agusx1211/NewShoes/blob/main/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient/W3DDisplay.cpp), [WebAssembly/src/wasm_real_engine_init.cpp](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/src/wasm_real_engine_init.cpp), [WebAssembly/tools/verify_finite_frame_json.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/tools/verify_finite_frame_json.mjs). Reviewed 2026-09-13.

### Play on a touch screen

**Status: In active validation.** Phone and tablet layouts map selection, contextual orders, direct map-like camera navigation, hotkeys, and text entry onto touch controls that feed the engine's original input paths.

A one-finger tap selects or activates, while a one-finger drag directly grabs and moves an unobstructed tactical-map surface without rotating it. The engine reports live UI drag blockers so sliders, lists, minimaps, command controls, and shell screens retain their original left-drag behavior. Moving two fingers together provides marquee selection, pinching two fingers zooms, and twisting three fingers rotates; stationary or released fingers do not leave camera velocity active. A hold, stationary two-finger tap, or armed Order button provides a right click. Explicit Cancel, text, help, camera, modifier, control-group, function, navigation, punctuation, and numeric-keypad controls make keyboard-only actions reachable.

Visible original-engine text-entry rectangles are relayed to the browser so tapping one can open the device keyboard during the touch event. Browsers with the Virtual Keyboard API use overlay mode; other mobile browsers keep the game canvas at its pre-keyboard geometry and move only the text proxy above the visible keyboard.

The controls are designed for phone and tablet play, including iPhone- and iPad-class portrait and landscape layouts. Automatic rendering preserves the live device aspect ratio and reduces both dimensions uniformly when DPR, GPU pixel budgets, or engine limits require a lower resolution. Touch recognition and mobile Chromium layouts have focused automated coverage; physical-device and Safari breadth remain in active validation. Landscape is recommended because the original Zero Hour interface was designed for a wide screen.

Evidence: [WebAssembly/harness/touch-controls.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/touch-controls.mjs), [WebAssembly/harness/touch_controls_unit.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/touch_controls_unit.mjs), [WebAssembly/harness/touch_controls_browser_smoke.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/touch_controls_browser_smoke.mjs), [WebAssembly/harness/display-resolution.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/display-resolution.mjs), [WebAssembly/harness/display_resolution_unit.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/display_resolution_unit.mjs), [WebAssembly/harness/bridge.js](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/bridge.js), [GeneralsMD/Code/GameEngine/Source/GameClient/MessageStream/LookAtXlat.cpp](https://github.com/Agusx1211/NewShoes/blob/main/GeneralsMD/Code/GameEngine/Source/GameClient/MessageStream/LookAtXlat.cpp), [WebAssembly/src/wasm_port_entry.cpp](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/src/wasm_port_entry.cpp), [WebAssembly/src/wasm_agent_api.cpp](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/src/wasm_agent_api.cpp). Reviewed 2026-07-20.

### Connect a remote playing agent

**Status: Experimental.** An optional authenticated bridge exposes human-accessible shell and match information plus semantic direct controls to a separately operated agent.

The current launcher has no Remote Agent form. The bridge connection is configured through the host page configuration or through previously remembered origin-local settings written by an embedding host; the browser credential is never accepted from a URL. The hosted HTTPS page and bridge connect outward through an encrypted peer-to-peer data channel; the project relay forwards only end-to-end-encrypted SDP/ICE signaling and never carries agent requests, responses, or gameplay data. When no configuration is present, the browser does not import the runtime adapter or create an agent socket, peer connection, polling loop, or reconnect timer.

The bridge uses distinct random browser and REST credentials by default. Its authenticated REST API covers shell UI, HUD messages, fog-safe world, terrain and minimap observations, compact reusable capability dictionaries, bounded tactical event streams, and semantic selection, production, upgrade, special-power, construction, movement, combat, camera, and chat actions. Engine observation and actions retain the original simulation and input paths rather than replacing gameplay with a harness implementation.

Global mode exposes information a human player could access across the map subject to radar, shroud, stealth, disguise, and other game rules. Camera mode additionally bounds observation and action targets to the tactical view while preserving select-then-pan interaction. The mode is fixed for the session. Independent completed Easy-mode wins under both policies verify full-match operation, but the interface does not prescribe strategy or guarantee that an agent will win.

The browser credential is accepted only through explicit host or remembered configuration and stays in page memory by default. It is always omitted from URLs, public status, and issue dumps. An agent still cannot provide retail assets, select local files, or grant browser permissions.

Evidence: [AgentBridge/README.md](https://github.com/Agusx1211/NewShoes/blob/main/AgentBridge/README.md), [AgentBridge/server_test.go](https://github.com/Agusx1211/NewShoes/blob/main/AgentBridge/server_test.go), [AgentBridge/webrtc.go](https://github.com/Agusx1211/NewShoes/blob/main/AgentBridge/webrtc.go), [WebAssembly/harness/agent-bridge-config.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/agent-bridge-config.mjs), [WebAssembly/harness/agent-webrtc-transport.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/agent-webrtc-transport.mjs), [WebAssembly/harness/agent_webrtc_e2e_smoke.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/agent_webrtc_e2e_smoke.mjs), [WebAssembly/harness/agent_bridge_browser_smoke.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/agent_bridge_browser_smoke.mjs), [WebAssembly/src/wasm_agent_api.cpp](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/src/wasm_agent_api.cpp). Reviewed 2026-09-21.

### Campaign and Generals Challenge

**Status: In active validation.** These modes enter through the real engine and remain under active breadth, mission-flow, and cutscene validation.

The relevant original menus, scripts, maps, AI, and mission systems are part of the same engine used for skirmish. Individual paths may work without implying complete coverage of every faction, mission, objective transition, movie, or ending.

Agents and support answers should describe these modes as in active validation and check the live issue tracker before promising a specific mission or long-session outcome.

Evidence: [PROJECT.md](https://github.com/Agusx1211/NewShoes/blob/main/PROJECT.md), [WebAssembly/harness/skirmish_start_smoke.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/skirmish_start_smoke.mjs). Reviewed 2026-07-14.

### Configure LLM commanders

**Status: Planned.** The LLM commander runtime and its bounded semantic tools remain in the repository, but the current launcher does not load them or provide the LLM AI Manager, so no model can be configured or placed in a computer slot from the page.

The retained design gives a named OpenAI-compatible model an exclusive strategy lease for a computer slot while the original engine executes bounded semantic production, force, mission, and tactical requests. The launcher no longer imports that runtime, and the original Skirmish and LAN setup screens list only the built-in computer players.

Evidence: [WebAssembly/harness/llm-ai-match-smoke.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/llm-ai-match-smoke.mjs), [WebAssembly/harness/llm-ai-game-runtime.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/llm-ai-game-runtime.mjs), [WebAssembly/harness/llm-ai-game-tools.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/llm-ai-game-tools.mjs), [WebAssembly/harness/llm-ai-strategy.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/llm-ai-strategy.mjs), [WebAssembly/src/wasm_agent_api.cpp](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/src/wasm_agent_api.cpp), [WebAssembly/src/wasm_real_engine_init.cpp](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/src/wasm_real_engine_init.cpp), [GeneralsMD/Code/GameEngine/Source/GameLogic/ScriptEngine/VictoryConditions.cpp](https://github.com/Agusx1211/NewShoes/blob/main/GeneralsMD/Code/GameEngine/Source/GameLogic/ScriptEngine/VictoryConditions.cpp). Reviewed 2026-09-21.

### Graphics, audio, and movies

**Status: In active validation.** WebGL2, Web Audio, and browser-side Bink integration carry the original engine's rendering, sound, and movie requests, with continuing fidelity and coverage work.

The Direct3D 8-shaped renderer maps the original rendering path to WebGL2. The default enhanced tier translates shipped shader model 1.1 programs to GLSL ES, while a classic tier generates fixed-function-style shaders for comparison and fallback. Terrain, objects, UI, particles, effects, render targets, and common scenes work; fidelity and performance fixes continue.

Radar blips share texture updates, shadow volumes avoid unnecessary temporary index uploads, and unchanged HUD text reuses its rendering resources. Buffer changes and texture releases retain queued draws that do not use the changed resource. These optimizations preserve draw order, resource lifetimes, text and radar pixels, shadow depth and stencil behavior, clipping, and visible flat shading.

Engine-driven music, speech, streams, and two-dimensional and three-dimensional samples play through Web Audio. The mixer retains the engine's category and positional intent at the browser boundary.

Original Bink movie ownership remains in the game path. Hosted builds use a focused on-device decoder for supported classic Bink content selected from the player's own files. Broader mission and playback coverage remains ongoing.

Evidence: [WebAssembly/harness/shader_fidelity_probe.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/shader_fidelity_probe.mjs), [GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/Common/System/W3DRadar.cpp](https://github.com/Agusx1211/NewShoes/blob/main/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/Common/System/W3DRadar.cpp), [GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient/W3DDisplayString.cpp](https://github.com/Agusx1211/NewShoes/blob/main/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient/W3DDisplayString.cpp), [WebAssembly/harness/d3d8_executor.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/d3d8_executor.mjs), [WebAssembly/harness/d3d8_shadow_indices_smoke.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/d3d8_shadow_indices_smoke.mjs), [WebAssembly/harness/d3d8_dxt_cpu_fallback_unit.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/d3d8_dxt_cpu_fallback_unit.mjs), [WebAssembly/harness/d3d8_dxt_cpu_fallback_browser_smoke.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/d3d8_dxt_cpu_fallback_browser_smoke.mjs), [WebAssembly/harness/d3d8_sm1_transform_switch_smoke.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/d3d8_sm1_transform_switch_smoke.mjs), [WebAssembly/harness/threaded_frame_flush_smoke.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/threaded_frame_flush_smoke.mjs), [WebAssembly/harness/skirmish_start_smoke.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/skirmish_start_smoke.mjs), [WebAssembly/harness/terrain_culling_orientation_probe.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/terrain_culling_orientation_probe.mjs), [WebAssembly/harness/real_audio_event_smoke.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/real_audio_event_smoke.mjs), [WebAssembly/harness/bink_direct_decoder_browser_smoke.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/bink_direct_decoder_browser_smoke.mjs). Reviewed 2026-09-13.

### Use and manage mods

**Status: Planned.** The current launcher does not expose a Mod Manager; the page launches vanilla Zero Hour only, while the ordered-mod launch identity and package libraries remain in the runtime for a future launcher surface.

The runtime retains the mod library format, ordered content identities, and the original -mod mounting path, and the engine still rejects native DLL or executable components that WebAssembly cannot run. None of this is reachable from the current launcher, which offers no way to import, enable, or order mods.

Because no mod context can be selected, every launch uses the vanilla configuration identity, and saves, replays, and multiplayer discovery are isolated under that single identity.

Evidence: [WebAssembly/harness/mod-context.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/mod-context.mjs), [WebAssembly/harness/mod-package-format.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/mod-package-format.mjs), [WebAssembly/harness/play.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/play.mjs), [GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Contain/RiderChangeContain.cpp](https://github.com/Agusx1211/NewShoes/blob/main/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Contain/RiderChangeContain.cpp), [WebAssembly/tools/verify_rider_change_contain_template_guard.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/tools/verify_rider_change_contain_template_guard.mjs), [WebAssembly/src/wasm_real_engine_init.cpp](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/src/wasm_real_engine_init.cpp). Reviewed 2026-09-21.

### Install and manage custom maps

**Status: Planned.** The current launcher does not expose a Map Manager; the map store and package importer remain in the repository, and the original engine's User Maps discovery path is unchanged.

The map package store, archive inspection worker, and MapName/MapName.map normalization remain in the runtime code, but the current launcher offers no import or removal interface, so only maps shipped with the game are available from the page.

The original engine's user-map scan, metadata parsing, preview, selection, and loading paths are unchanged and remain the owner of gameplay behavior.

Evidence: [WebAssembly/harness/custom-map-package-worker.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/custom-map-package-worker.mjs), [WebAssembly/harness/custom-map-store.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/custom-map-store.mjs), [WebAssembly/harness/custom-map-store_unit.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/custom-map-store_unit.mjs), [WebAssembly/harness/skirmish_start_smoke.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/skirmish_start_smoke.mjs), [WebAssembly/shims/windows.h](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/shims/windows.h), [WebAssembly/tests/win32_find_file_smoke.cpp](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/tests/win32_find_file_smoke.cpp), [GeneralsMD/Code/GameEngine/Source/GameClient/MapUtil.cpp](https://github.com/Agusx1211/NewShoes/blob/main/GeneralsMD/Code/GameEngine/Source/GameClient/MapUtil.cpp). Reviewed 2026-09-21.

### Manage saves and replays

**Status: In active validation.** In-game save, load, and replay paths work through the original engine with focused coverage; the current launcher provides no browser file manager for importing, exporting, copying, or deleting saves and replays.

Saves and replays persist in the configuration-specific user-data folders inside browser storage and are managed through the original in-game screens. The former desktop file manager for importing, exporting, copying, and deleting those files is not part of the current launcher.

Real in-game save, load, and replay paths have focused integration coverage. Campaign breadth, long sessions, version transitions, and uncommon mod combinations remain active validation areas, so current issues should be checked before promising a particular edge case.

Evidence: [WebAssembly/harness/save_load_game_smoke.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/save_load_game_smoke.mjs), [WebAssembly/harness/replay-file-store.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/replay-file-store.mjs), [WebAssembly/harness/save-persistence-coordinator.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/save-persistence-coordinator.mjs). Reviewed 2026-09-21.

### Play peer-to-peer multiplayer

**Status: Experimental.** The original UDP and lockstep protocol runs over direct WebRTC data channels, with decentralized discovery and continuing determinism and connectivity hardening.

The project-operated Nostr relay and four deterministic public fallbacks are used for decentralized peer discovery and encrypted connection negotiation, not to relay the match itself. Discovery continues when any one configured relay is reachable. Game traffic flows through direct WebRTC data channels when a connection is established.

Players choose the same room in Settings > Multiplayer, choose a commander name, launch Zero Hour, and use Multiplayer > Anonymous in the original UI. Ranked is reserved for a future service and currently shows a native coming-soon notice. Peers must use the same exact game and ordered mod composition. An empty room value keeps play offline.

The native Anonymous lobby reports discovery, relay, room, and peer state. Its Reconnect action rebuilds browser discovery and asks the original LAN API to immediately refresh players and games after peer channels recover, without restarting Zero Hour.

Short matches have been verified at up to four players, including native lobby discovery recovery. Long determinism runs, in-game disconnect and rejoin behavior, authenticated invitations, difficult NAT conditions, and signaling hardening remain active work.

Evidence: [GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/MainMenu.cpp](https://github.com/Agusx1211/NewShoes/blob/main/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/MainMenu.cpp), [GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/LanLobbyMenu.cpp](https://github.com/Agusx1211/NewShoes/blob/main/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/LanLobbyMenu.cpp), [WebAssembly/harness/lan_webrtc_playable_match_smoke.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/lan_webrtc_playable_match_smoke.mjs), [WebAssembly/harness/webrtc-udp-endpoint.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/webrtc-udp-endpoint.mjs), [WebAssembly/cloudflare/trystero-relay/worker_hibernation.test.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/cloudflare/trystero-relay/worker_hibernation.test.mjs), [WebAssembly/harness/webrtc_relay_selection_unit.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/webrtc_relay_selection_unit.mjs), [WebAssembly/harness/multiplayer_network_status_unit.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/multiplayer_network_status_unit.mjs). Reviewed 2026-07-18.

### Transfer owned data to another device

**Status: Planned.** The encrypted device-transfer protocol remains in the repository, but the current launcher has no transfer interface, so an installation must be imported again on each device.

The protocol negotiated through the project-operated Nostr relay and direct WebRTC transfer is retained with its unit coverage. The launcher does not expose sending or receiving, so the only way to prepare a second device is to select the owned game files there.

Evidence: [WebAssembly/harness/webrtc_relay_selection_unit.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/webrtc_relay_selection_unit.mjs), [WebAssembly/harness/device-transfer-protocol.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/device-transfer-protocol.mjs). Reviewed 2026-09-21.

### Configure and diagnose the runtime

**Status: Supported.** The launcher's Options sheet exposes display, shader, camera, cursor, performance, multiplayer, and privacy settings, and the in-game capture overlay records issue dumps.

Options exposes resolution, windowed or fullscreen presentation, enhanced or classic shaders, camera zoom, original game cursors, performance overlay options, graphics diagnostics, multiplayer diagnostics, the engine log, commander name and room, and the analytics preference. Original cursor frames are decoded locally from the user-owned game files into browser-standard images, retain their original hotspots and animation timing, and are preloaded before presentation. The former hardware capability report is not part of the current launcher.

The issue recorder can capture a screenshot, annotations, browser and runtime logs, input and state evidence, and an optional short video into a .cncdump.json package. Long captures are serialized in bounded chunks instead of one giant JavaScript string. Diagnostics remain local until the user explicitly saves or uploads a dump.

Detailed multiplayer capture is opt-in because it can be large. Credentials and discovery secrets are excluded from dumps. Reports should never include retail archives, disc images, product keys, or private credentials.

Evidence: [WebAssembly/harness/issue-recorder.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/issue-recorder.mjs), [WebAssembly/harness/issue_recorder_unit.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/issue_recorder_unit.mjs), [WebAssembly/harness/issue_recorder_ui_smoke.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/issue_recorder_ui_smoke.mjs), [WebAssembly/harness/original-cursor-assets.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/original-cursor-assets.mjs), [WebAssembly/harness/original_cursor_assets_unit.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/original_cursor_assets_unit.mjs), [WebAssembly/harness/launcher_browser_smoke.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/launcher_browser_smoke.mjs), [WebAssembly/harness/threaded_play_gate.mjs](https://github.com/Agusx1211/NewShoes/blob/main/WebAssembly/harness/threaded_play_gate.mjs). Reviewed 2026-09-21.

## Requirements

Use a modern browser on a desktop, phone, or tablet. Chrome and Chromium receive the most testing. Other modern browsers can work when they expose all required platform features, but Firefox and Safari do not yet receive the same validation.

- WebAssembly and WebAssembly threads.
- SharedArrayBuffer through a cross-origin-isolated page.
- WebGL2 and OffscreenCanvas support suitable for the threaded renderer.
- Web Audio.
- OPFS and browser storage capacity for roughly a multi-gigabyte installed archive set.
- Local file or folder selection appropriate to the chosen ownership path.
- A graphical browser with pointer or touch input. Text-only browsers and embedded webviews are not supported game clients.

The hosted site supplies HTTPS and the necessary cross-origin isolation headers. A self-hosted copy must do the same.

A complete English Generals and Zero Hour copy is required. The project does not provide replacement downloads. Existing original media is supported, and digital copies are available through official storefronts linked by the launcher.

LLM commanders are optional. They require a user-chosen OpenAI-compatible endpoint that the browser can reach and that permits requests from the site origin; any account, API key, model access, usage limits, and provider charges belong to that provider. HTTPS endpoints are portable. Current Chrome can prompt for Local Network Access to an HTTP private address; other browser/version combinations may require HTTPS or localhost.

## First-time setup

1. Open https://newshoes.gg/ in a supported modern browser.
2. Choose Game Folder and select the installed English Zero Hour root. If the browser refuses a protected Steam folder, the launcher reveals a compatibility folder picker.
3. Review the detected source. Choose whether to use the files just this time, remember the source permission when the browser supports it, or install the validated archives into browser storage.
4. Keep the tab open while local extraction, hashing, validation, and OPFS installation finish. The first import can take several minutes.
5. When the card shows Play, review Options if desired and launch Zero Hour.
6. Use the original game menus after the canvas opens. On a touch screen, open Touch help for the gesture map and Keys for hotkeys and control groups; landscape is recommended. All picker operations require a person at the browser; a remote text agent cannot grant file permissions or provide the user's retail media.
7. Optional remote play requires the external AgentBridge and a host page configuration that supplies its WebRTC URL, browser credential, session ID, and fixed Global or Camera play mode before launch. Give the bridge's separate REST address and API credential only to the trusted controller, treat both credentials as secrets, and close the bridge when the session is over.

## Local data, privacy, and security

Retail assets selected in the launcher are read locally and stored locally in the browser profile. They are not uploaded to Project New Shoes. Installed archives, mods, custom maps, saves, replays, preferences, and generated movie cache files live under browser-managed origin storage.

The Options > Privacy sheet provides an anonymous analytics preference. Documented analytics are limited to broad feature, reliability, setting-category, and performance-bucket events. They exclude filenames, paths, disc labels, game data, save content, free text, issue dumps, and precise hardware or storage values. Global Privacy Control or Do Not Track disables analytics automatically, and advertising features are disabled.

The launcher stores only the validated game archives, launcher preferences, and settings in the browser origin. Origin data can be removed through the launcher's Remove from this browser action or browser site-data controls.

Remote Agent is explicitly opt-in through host configuration and uses separate browser and REST credentials. The browser credential stays in page memory by default and is never placed in URLs, public status, or issue dumps.

Network activity is feature-dependent:

- Opening the hosted page downloads the open-source browser runtime.
- Optional analytics sends only documented broad events when enabled.
- Multiplayer uses the project-operated Nostr discovery relay plus public fallbacks, then direct peer-to-peer game channels.
- Device transfer uses the same hybrid Nostr discovery set for encrypted connection negotiation, then connects the two participating devices directly for the confirmed encrypted transfer.
- Testing or launching with Remote Agent opens outbound signaling connections from the browser and bridge, then exchanges agent traffic directly over a DTLS-encrypted WebRTC data channel. The signaling relay receives only a token-derived room identifier and encrypted SDP/ICE envelopes. A test performs only the authenticated probe and does not register a playable session. The bridge exposes its authenticated controller REST API on loopback by default.
- An enabled LLM commander sends gameplay context and receives model responses from the OpenAI-compatible endpoint selected in its profile.
- Diagnostics leave the device only when the user explicitly uploads a report.

## Important limitations

- Retail game data is required and not bundled.
- Zero Hour is the current target; standalone vanilla Generals is not exposed.
- The launcher is intentionally minimal: mod, custom-map, LLM commander, device-transfer, and save or replay file-management interfaces are not exposed in this build, and the page launches vanilla Zero Hour only.
- Chrome and Chromium have the strongest validation.
- Immersive VR is experimental and currently does not work well. Real-headset rendering, controls, comfort, performance, and compatibility remain incomplete.
- Campaign, Challenge, save/load, replay, movies, long multiplayer sessions, reconnects, difficult NAT environments, performance, and remaining rendering fidelity continue to receive testing and fixes.
- Browser storage is scoped to the current browser profile, device, and site origin unless the user exports or transfers data.
- Native Windows mod DLLs and executables cannot run in WebAssembly.
- A web agent that only reads this site cannot play the canvas or operate local browser permissions. The public llms.txt, project-info.json, and guide are read-only knowledge resources; control requires a person to configure the separate authenticated Remote Agent interface.
- Remote Agent is an experimental advanced interface. It does not bypass fog, shroud, stealth, radar, or fixed Camera-mode boundaries, and it does not guarantee that a controller understands the game or wins a match. Difficult NAT or firewall environments that require TURN can prevent the default peer-to-peer connection.
- The live issue tracker is the authority for current bugs and planned work. Archived TODO.md and DONE.md snapshots are historical records, not the current backlog.

## Troubleshooting

### The browser reports missing capabilities

Move to a current Chrome or Chromium build first. Avoid embedded browsers and private modes that disable persistent storage. Confirm that JavaScript, WebAssembly, graphics acceleration, and site storage are available. The Hardware & Browser settings panel shows the capabilities exposed by the current browser.

### The folder picker cannot open a Steam directory

Use Add Game Folder, then the compatibility folder picker offered by the launcher. Ensure both Generals and Zero Hour are installed in English and that the selected tree is complete.

### Folder validation fails

Select the Zero Hour root folder that contains the game executable, the Data folder, and both the Generals and Zero Hour BIG archives. Verify both games in Steam or the EA app, confirm English is installed, and do not select a parent folder that only lists every game in the collection. Modified or repacked releases are not supported.

### Installation runs out of space

Use the launcher's Remove from this browser action or browser site-storage controls to clear old local data. Installation needs room for the validated archive set plus browser overhead, user data, and cached movies.

### The game is slow or visually wrong

Try the original 310 camera zoom, reduce the display size, compare enhanced and classic shader tiers, and inspect the optional performance overlay. Reproducible visual problems should include a screenshot or issue dump and the deployed build commit.

### Multiplayer peers do not appear

Confirm both players use the same room, compatible browsers, and exactly the same game data. In Multiplayer > Anonymous, read the native discovery, relay, room, and peer status; if it is offline, stuck, or missing a peer, select Reconnect to rebuild discovery and refresh the original LAN player and game lists. NAT or relay limitations may still prevent a connection; multiplayer remains experimental.

### Remote Agent does not connect

Start the external AgentBridge first and supply its WebRTC URL, browser credential, session ID, and Global or Camera play mode through the host page configuration before launching Zero Hour; the current launcher has no Remote Agent form. Confirm the bridge process is reachable and that the play mode matches on both sides.

### Reporting a bug

Use the in-game capture overlay's Report issue and Save dump actions for a runtime problem, or open https://github.com/Agusx1211/NewShoes/issues. Include reproduction steps, browser and operating-system details, the version and commit from About, and an issue dump when appropriate. Never attach retail game archives, disc images, product keys, or private credentials.

## Architecture

The shipping runtime starts the C++ engine on an Emscripten pthread. The worker owns the blocking engine update loop, an OffscreenCanvas, the WebGL2 renderer, and synchronous OPFS access handles. The main browser realm owns the launcher desktop, file selection, settings, input forwarding, Web Audio nodes, movie preparation, device transfer, issue capture, and WebRTC discovery and transport bridges.

The launcher streams user-owned archives into OPFS instead of copying the complete game into the JavaScript heap. The engine continues to open ordinary paths through its original filesystem seam. Closing the game persists user data, releases worker and storage ownership, shuts down audio and networking, and allows a clean relaunch.

When explicitly configured, the browser imports a small adapter after the engine frame loop is ready and opens an outbound authenticated WebSocket to the separate Go AgentBridge. C++ remains authoritative for observation filtering and semantic actions, JavaScript validates and forwards the protocol at the browser boundary, and Go owns sessions, REST authentication, compact API responses, and bounded event delivery.

Major mappings are:

- Direct3D 8 and shipped shader model 1.1 behavior to WebGL2 and GLSL ES.
- Miles-compatible audio calls to Web Audio buffers, streams, mixer buses, and 3D panners.
- Win32 files, clocks, windows, and input to Emscripten, DOM APIs, and OPFS.
- Original Bink movie presentation to a browser-side decoder and video surfaces.
- Original UDP and LAN protocol boundaries to WebRTC data channels and browser discovery.
- Human-accessible game state and semantic engine commands to an optional authenticated WebSocket, REST, and server-sent-event agent boundary.

## Stable public resources

- `https://newshoes.gg/` — Interactive launcher and browser runtime. Local game files and user interaction are required to play.
- `https://newshoes.gg/project.md` — Self-contained capabilities, statuses, setup, local data handling, limitations, troubleshooting, architecture, evidence, and agent guidance.
- `https://newshoes.gg/project-info.json` — Canonical structured project facts, capability status, review dates, evidence paths, and publication links.
- `https://newshoes.gg/llms.txt` — Concise LLM-oriented discovery, answer guidance, and links.
- `https://newshoes.gg/harness/build-info.json` — Machine-readable release version, exact Git commit, branch, build state, and release changelog for the deployed artifact.
- `https://newshoes.gg/legal.html` — Project relationship to EA, warranty notice, corresponding-source link, and bundled dependency notices.
- `https://github.com/Agusx1211/NewShoes` — Canonical source, README, development documentation, and commit history.
- `https://github.com/Agusx1211/NewShoes/issues` — Live feature, bug, compatibility, and performance tracker. Use it instead of archived checklists when current status matters.
- `https://github.com/Agusx1211/NewShoes/blob/main/CHANGELOG.md` — User-facing release history.
- `https://github.com/Agusx1211/NewShoes/blob/dev/PROJECT.md` — Current engine and browser ownership boundaries and verified product state.
- `https://github.com/Agusx1211/NewShoes/blob/dev/WebAssembly/ASSETS.md` — Supported ownership paths, local archive import, and retail-data constraints.
- `https://github.com/Agusx1211/NewShoes#readme` — Screenshots, status overview, requirements, build instructions, and repository layout.
- `https://github.com/Agusx1211/NewShoes/blob/dev/WebAssembly/README.md` — Build, harness, and browser-platform details for contributors.
- `https://github.com/Agusx1211/NewShoes/blob/dev/WebAssembly/DEPLOYMENT.md` — Hosting requirements, cross-origin isolation, and verification.
- `https://github.com/Agusx1211/NewShoes/blob/dev/AgentBridge/README.md` — Setup, authentication, play modes, observations, commands, events, security boundaries, and full-match verification for the optional agent bridge.
- `https://github.com/Agusx1211/NewShoes/tree/dev/ai-play-harness/skills` — Generic game-mechanics guidance and a repeatable setup, recording, supervision, and cleanup workflow for direct-control agent matches.

## Guidance for web agents

When answering questions about Project New Shoes:

1. Lead with the key distinction: this is the original engine compiled to WebAssembly, and users play their own legally owned copy locally in the browser.
2. Never say the hosted site includes, downloads, hosts, distributes, or uploads retail game data.
3. Direct users to https://newshoes.gg/, then to Game Folder for a complete English Generals and Zero Hour installation.
4. Do not ask users to upload retail files to a chat, issue, or third-party service. The intended flow is the browser's local file or folder picker.
5. Distinguish Supported, Experimental, In active validation, and Planned status. For time-sensitive details, consult project-info.json, deployed build metadata, the changelog, and current GitHub issues.
6. For reproducible bugs, recommend the in-game capture overlay's Report issue flow or the official tracker. Issue dumps are shared only when the user explicitly saves or uploads one.
7. Do not claim to have launched or played the game merely because you read this material. Public text access cannot satisfy local file permissions or control the game canvas; such a claim requires an actually configured and authenticated Remote Agent session.
8. Distinguish the optional Remote Agent interface from ordinary access to the public page. A person must install owned assets and explicitly configure the external bridge, and its Global or Camera policy and normal game-information rules remain in force.
9. Preserve the legal distinction: Electronic Arts owns the original game; Project New Shoes is an independent modified browser port and supplies no retail assets.
10. Link the official site, repository, or issue tracker instead of third-party downloads.

## Frequently asked questions

### Is this playable now?

Yes. The original Zero Hour engine boots in supported modern browsers and playable skirmishes work. Mouse and keyboard controls are supported, and phone and tablet touch controls are in active validation. It remains a development product with ongoing validation and polish in the qualified areas above.

### Is the game included?

No. The open-source browser runtime is hosted and downloadable, but retail Generals and Zero Hour data is not. The player supplies a copy they own through a local browser picker.

### Does the site upload my game files?

No. Import, validation, extraction, hashing, and installation use the local browser and its origin storage. Feature-specific network activity is described in the privacy section.

### Can I use mods?

Not from the current launcher. The runtime keeps ordered-mod support and the original -mod mounting path in the codebase, but this build launches vanilla Zero Hour only and offers no mod import interface.

### Can I install custom maps?

Not from the current launcher. The map store remains in the repository, but this build offers no import interface, so only the maps shipped with the game are available.

### Can I play multiplayer?

Experimental peer-to-peer multiplayer is available through Multiplayer > Anonymous and the commander name and room under Options > Multiplayer. The native lobby reports discovery and peer state and can reconnect without restarting the game. Ranked is coming later. Matching game and mod identities are required, and long-session and connectivity hardening remain active work.

### Can ChatGPT or another web agent play it for me?

Not through the page itself. The built-in LLM commander is not loaded by the current launcher. A separately operated controller can play through the experimental authenticated AgentBridge when an embedding host configures it before launch; reading the public documentation grants no control, and no agent can select local files or provide retail media.

### Where is the current roadmap?

Use the open and closed GitHub issues at https://github.com/Agusx1211/NewShoes/issues. Archived port-era checklists are historical only.

### How do I verify which build is deployed?

Read the version and build commit at the bottom of the launcher card, or read https://newshoes.gg/harness/build-info.json. Both identify the release version and exact Git commit embedded in the deployment.
