Diagnosed and fixed the crash that killed HAVOC_NOCD.EXE ~1s after launch
(dgVoodoo window appears black, then the process exits). It was not a clean
exit: an ACCESS_VIOLATION (null-pointer read at VA 0x444E6A) during init.
Root cause is a copy-protection check in the WORLDS\ data-file loader
(0x42a480). It opens each file (GRAFIX/LAND/MAP/STUF) from both a local
"WORLDS\<name>" path and a CD-drive path (HAVOC.INI [SETUP] DRIVE=D:\), and
returns a valid stream only when the local open fails and the CD-drive open
succeeds. With files present locally and no D: drive it returned NULL, and the
GRAFIX loader (0x444db0) dereferenced that NULL without checking.
Fix: 14-byte patch at FO 0x29a2b rewrites the return decision to hand back the
successfully-opened local object. The game now boots to the title screen
("HAVOC(tm) by Reality Bytes"), responsive, main loop running.
- docs/PATCHES.md: full patch table (28 patches) + crash write-up
- tools/: RE + patching scripts (r2pipe disasm, minidump parser, ctypes
debugger, PE/IAT/import analysis)
- run_probe.bat / run_and_log.bat: reliable native launch for repro
- .gitignore: exclude CD images, Ghidra install/project, dgVoodoo, *.ini
Diagnosed via WER minidumps (%LOCALAPPDATA%\CrashDumps) parsed in pure Python
(no cdb/windbg available).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TN4Ytn3gdWRonNmHpisWQv
4.1 KiB
Havoc weapon system
Source: STR#7D02.dat (pickup banner text) and STR#7D03.dat (HUD active weapon names),
extracted from INTRFACE.FF. True class structure and game logic to be confirmed via Ghidra
decompilation of HAVOC.EXE.
Player memory: 6 weapon classes each for primary (infinite ammo) and secondary (limited ammo).
Primary weapons (infinite ammo)
Weapons not appearing in the pickup table are assumed to be starting/default weapons. Upgrades within a class are listed tier by tier.
| Class | Tier 1 (start) | Tier 2 | Tier 3 | Tier 4 |
|---|---|---|---|---|
| Laser | Laser | Improved Laser | ElectroLaser | High-Power ElectroLaser |
| Disc | Disc | Improved Disc | Disc Gun Doubler | High-Power Disc / Fin-Stabilized Disc |
| Shockwave | Shockwave | Radial Shockwave | ||
| Fireball | Fireball | High-Velocity Fireball | ||
| Plasma | Plasma | High-Energy Plasma | ||
| VARG | VARG Omicron | VARG Omicron High-Power | VARG Omicron Focused | VARG Photon / VARG Photon High-Energy |
Notes:
- "Laser Doubler" pickup grants a second laser barrel (doubles fire rate/output, not a separate class).
- "Disc" and "Improved Disc" do not appear as pickups -- probably starting weapons.
- "Plasma" does not appear as a pickup -- probably starting or granted via progression.
- VARG (Variable Armament Resonance Gun?) is the highest-tier class, with two sub-branches (Omicron / Photon).
Secondary weapons (limited ammo)
Cheat code mmm gives the best Heatseeker class weapon. Cheat aaa = max ammo for all secondaries.
| Class | Base weapon | Upgrade(s) | Ammo pickup |
|---|---|---|---|
| Rocket | Rocket | Rocket Repeater, Rocket Doubler | Rocket Ammo +5 / +10 |
| Cruise Missile | Cruise Missile | Afterburner Cruise | Cruise Missile Ammo +5 |
| Mortar | Mortar | High-Impact Mortar | Mortar Ammo +5 |
| Mine | Mine Dropper | Thermite Mine Dropper, Proximity Mine Dropper | Mines +5 |
| Heatseeker | Heatseeker | Afterburner Heatseeker | Heatseeker Ammo +5 |
| EMP | EMP Cannon | Improved EMP Cannon | EMP Cannon Ammo +5 |
| Fusion | Fusion Cannon | Catalyst-Aug Fusion Cannon | Fusion Cannon Ammo +5 |
| LGM | Laser Guided Missile | Thermal LGM, ElectroCharge LGM | LGM Ammo +5 |
| Warhead | Warhead | Multi-Warhead | Warhead Ammo +5 |
| Sweep Dropper | Sweep Dropper - Laser | Sweep Dropper - Photon, Sweep Dropper - Flame | Sweep Dropper Ammo +5 |
| Terraformer | Terraformer | Enhanced Terraformer | Terraformer Ammo +5 |
| Phase Missile | Phase Missile | Dual-Phase Missile | Phase Missile Ammo +5 |
| Catapult | Ion Catapult | Meson Catapult | Catapult Ammo +5 |
| Disruptor | Disruptor Cannon | High-Phase Disruptor Cannon | Disruptor Cannon Ammo +5 |
Note: The data shows 14 distinct secondary weapon lines, but player memory is 6 classes. Likely some of these are grouped into the same class slot in the UI (e.g. Rocket + Cruise Missile may share one slot, LGM + Phase Missile another). Ghidra will resolve the actual slot count.
Unaccounted-in-pickups (appear only in HUD list, may be starting secondaries):
PulseFrequency-Modulated PulseParticle AcceleratorHigh-Velocity Particle
Special pickups (non-weapon)
| Item | Effect |
|---|---|
| Gate Key | Required to open the exit gate and complete the level |
| Shields +5 / +10 / +20 / +30 / +50 / +100 | Restores shield hitpoints |
| Shields Restored | Full shield restore |
| Ultrashield | Temporary invulnerability (or large instant shield restore) |
| Shield Max Increased +10 | Permanently raises shield capacity |
| Freeze Enemies | Temporarily freezes all enemies on screen |
| Invisibility | Temporary cloaking |
| Targeting Enhancement | Improves lock-on/targeting |
| Bonus Vehicle | Extra life |
| Installing Mass-Energy Weapon | Special weapon install event |
| Upgrading Mass-Energy Weapon | Upgrade event for the above |
Cheat codes
All confirmed working in demo and retail:
| Code | Effect |
|---|---|
mmm |
Best Heatseeker class weapon (Afterburner Heatseeker) |
vvv |
Bonus Vehicle / extra life |
sss |
Shield restore |
hhh |
Health restore |
aaa |
Max ammo for all secondaries |