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
94 lines
4.1 KiB
Markdown
94 lines
4.1 KiB
Markdown
# 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):
|
|
- `Pulse`
|
|
- `Frequency-Modulated Pulse`
|
|
- `Particle Accelerator`
|
|
- `High-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 |
|