How it works

Read the map. Fix a copy. Prove every change.

WC3 Map Doctor is a set of map readers, rules and small fixes that run on a copy of your map. Here is what happens to a map, step by step.

  1. Open, read-onlyThe archive is opened without writing to it. A protected or unreadable map stops here and is reported as protected. Nothing is unlocked.
  2. Decode everythingMap info, the JASS or Lua script, object data, strings, placed units and doodads, imports. Our readers were cross-checked against an independent reader on 1,343,690 object-data edits with 0 disagreements.
  3. Run the rules121 rules look for what crashes, desyncs, leaks, lags or breaks on a given patch, checked against 6 builds: 1.26, 1.31, 1.32, 2.0, 3.0.0, 3.0.1. Each finding links to the line it came from and to one of 75 error cards with the cause and the fix.
  4. Grade itFive areas get a grade from 0 to 100 and the worst weighted area sets the score. The chart is public on the scoring page.
  5. Plan the fixThe engine suggests operations that match the findings. Each one has a risk rating: safe, review or experimental. A one-click "make it work" plan uses only safe and review operations.
  6. Fix a copyEvery operation writes a new file. The input map's SHA-256 is checked before and after, so the original provably did not change.
  7. Prove itThe copy is re-opened from scratch, its script is compiled again with pjass, and it is re-scanned. If a fix introduced a new finding, the run says so.

Five areas

What each grade looks at

Stability

Crashes, maps that will not load, broken triggers, desyncs, logic slips and anything that breaks on a newer patch. Leaks projected to hit a game limit within a day count here too.

Performance

Handle leaks, effects that are never destroyed, timers that run every frame, unit orders re-issued many times a second and other things that lag older PCs.

Security

Executable files hidden in the archive, memory-hack natives and preload paths that reach outside the game. Reported only; nothing is removed for you.

Cleanliness

Leftover files the map never uses: unused imports, duplicate or empty files, debug leftovers. Weighs the least.

Text

How much of the map's text is in English. A grade, not a judgement: it tells players whether a translation would help.

What a fix looks like

Small, named edits you can read

From the example report: a map function that clashes with a native added in 3.0.0 is renamed, and so is every call to it. That one change is why the map would not load on 3.0.1.

// Old inventory helper, written before 3.0.0 added a native with the same name.function IsItemEquipped takes unit u, integer itemId returns booleanfunction MD_IsItemEquipped takes unit u, integer itemId returns boolean    return GetInventoryIndexOfItemTypeBJ(u, itemId) > 0endfunction

Questions

Can I upload a map?

Not yet: request it on Discord with a link to the map's page; private uploads open soon. Instant self-serve scans wait for public hosting and a security review.

Is my original map ever changed?

No. Every operation writes a new copy, and the run checks that the input file's SHA-256 is the same before and after.

Do you unprotect or deprotect maps?

Never. A protected map is reported as protected. Where its archive can be read without unlocking it, only play-side fixes are offered.

Which game versions does it check?

Six builds: 1.26, 1.31, 1.32, 2.0, 3.0.0, 3.0.1. A finding that only matters on one build says so.

Can it fix every crash?

No. The scan reads the map without running it, so some crashes only show up in a play test. Every report ends with a list of what it did not fix and why.

Does it work on Lua maps?

The scan reads JASS and Lua. Most fix operations edit JASS today; fog removal and the player-count conversions also handle Lua.

Is this AI?

The scan and the fixes are ordinary code: parsers and rules you can read on the scoring page. Two optional operations use a language model: translation and the custom script patch, which you review before it is applied.

See it on a real map

The example report walks through one map from 2 (F) to 75 (C), finding by finding.