What you see
- An older map no longer loads, drops back to the menu or crashes at map select.
- It loads, but models are invisible or black, or stats and objects behave differently.
- It works for friends on one version and not on another.
Why it happens
The return bug (1.24). Maps written for 1.23 and earlier often turned handles into integers with a function that has two returns, such as H2I. Patch 1.24 closed this as an exploit. From 1.30 the game shows an error at map select instead of crashing.
Memory hacks and platform natives. Some 1.26-era maps read and write game memory at fixed offsets, or call natives that only a third-party launcher provides (JAPI families, DzAPI, UjAPI). Any patch moves memory, and the game refuses a script that declares natives it does not have.
Relocated and HD assets (1.31 to 1.33). Textures moved around 1.31, HD graphics arrived in 1.32 and custom FX had to be rebaked in 1.33. Old models with bad data the old client tolerated can crash Reforged while loading.
Missing game data version (3.0). A map saved before the game-data-version field existed can be played with the newest data set on 3.0.0, so stats and objects change.
The classic client is 1.29. On 3.0, LAN and offline play go through the bundled classic client, which is patch 1.29: no Lua, no frames, nothing added from 1.31 on.
How to fix it
- Return bug: replace
H2I(h)withGetHandleId(h)and integer-to-handle lookups with hashtables, then compile with pjass. - Memory hacks and platform natives: do not port the exploit. Rebuild each feature with official natives (object fields from 1.29 to 1.31, frames and damage events from 1.31, input polling from 3.0), or keep a separate build for that platform.
- Assets: re-import overrides under
war3mapImported\and point object data at them, fix texture paths and animations in a model editor, and decide whether the map ships as SD or with HD assets. - Game data version: open the map in the 3.0.1 editor, set the data set under Scenario, Map Options, and save.
- Friends on the classic client need a JASS-only build that uses nothing newer than 1.29. Everyone else can host on Battle.net.
How WC3 Map Doctor detects it
- ErrorsA function returns a value of a different type than its other return (the return bug), which the compiler rejects since 1.24.BRK-return-bug
- ErrorsThe script declares a native that the target build's common.j does not have (a JAPI or memory-hack native).BRK-native-decl-unknown
- ErrorsThe script uses natives of a platform client (KK, DzAPI, JAPI/EX, JN, YDWE or BzAPI) that Warcraft III 3.0 does not have, so the map does not compile or load there without a port.BRK-platform-natives
- SevereThe script declares third-party API natives or reads and writes game memory (a memory-hack map).SEC-memhack-natives
- ErrorsThe map info format version is newer than the target build can read (v39 needs 3.0.0, v33 2.0.3, v31 1.32, v28 1.31).W3I-version-vs-patch
- ErrorsThe map uses Lua as its script language, which needs 1.31 or later.LUA-min-patch
Operations that fix it on a copy
- compat.return-bug Fix the return bug for Warcraft III 1.24+
- compat.legacy-data Load an old map with its own game data in 3.0
compat.legacy-data lets an old map load on 3.0 with its own game data. It is skipped when the map must still run on 1.26 or 1.31.
Sources
Written in our own words from our lab notes; these are the pages behind them.
- publishedLiquipedia: Patch 1.24 (return bug closed, hashtables added)
- publishedLiquipedia: Patch 1.30.0
- authorpjass: the JASS syntax checker
- authorJassHelper manual: patch 1.24 return bug fixer
- forumXGM: UjAPI documentation (Russian)
- publishedLiquipedia: Patch 1.31.0
- publishedLiquipedia: Patch 1.33.0
- forumHive Workshop: Warcraft III 3.0 bugs and issues
- forumWarcraft 3 Reforged 3.0 LAN and offline play (classic client)
- publishedBlizzard: Warcraft III Reforged Forsaken Kingdom patch notes (3.0.0 and 3.0.1)