You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: _doc/features/agents.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -54,4 +54,4 @@ Without the flag, `grill` simply asks during setup.
54
54
55
55
## Keeping It Up to Date
56
56
57
-
The template is versioned. `grill install` detects when a project's `AGENTS.md` was generated from an older template and suggests refreshing it. Commit the file to version control so the whole team — and their agents — benefit.
57
+
The template is versioned. `grill install` detects when a project's `AGENTS.md` was generated from an older template and suggests refreshing it. Commit the file to version control so the whole team, including their agents, benefits.
Copy file name to clipboardExpand all lines: _doc/features/backends.md
+5-5Lines changed: 5 additions & 5 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -12,7 +12,7 @@ redirect_from:
12
12
- /tutorials/lua-jass-shim.html
13
13
---
14
14
15
-
WurstScript compiles to either **Jass** or **Lua**. The goal is to write code once and have it behave identically on both backends — no conditional code paths, no per-backend workarounds in user space.
15
+
WurstScript compiles to either **Jass** or **Lua**. The goal is to write code once and have it behave identically on both backends, with no conditional code paths or per-backend workarounds in user space.
16
16
17
17
## Choosing a Backend
18
18
@@ -28,15 +28,15 @@ Jass is the default and works well for classic and pre-Reforged patches. Lua tar
28
28
29
29
Jass and Lua have different runtime semantics in several areas. The most common differences that affect real maps:
30
30
31
-
**Null handles.** In Jass, calling a native with a `null` argument is valid — the function returns a type-appropriate zero value. In plain Lua, the same call raises a nil error and crashes.
31
+
**Null handles.** In Jass, calling a native with a `null` argument is valid: the function returns a type-appropriate zero value. In plain Lua, the same call raises a nil error and crashes.
32
32
33
33
**Handle IDs.** `GetHandleId` in Jass returns stable integers across a session, commonly used as table keys or for comparisons. In Lua, the equivalent is not stable across sessions and is a known cause of desyncs.
34
34
35
35
**Uninitialized variables.** Jass initializes all variables to zero values (`0`, `0.0`, `false`, `""`, `null`). Lua leaves uninitialized variables as `nil`, causing type errors when first used.
36
36
37
37
## The Jass Shim Pass
38
38
39
-
To close these gaps, the compiler applies a dedicated **Jass shim pass** to all generated Lua code. This pass inserts targeted emulation so that Lua behaves like Jass for the cases above — without any changes needed in user code.
39
+
To close these gaps, the compiler applies a dedicated **Jass shim pass** to all generated Lua code. This pass inserts targeted emulation so that Lua behaves like Jass for the cases above, without any changes needed in user code.
40
40
41
41
### Null-safe natives
42
42
@@ -50,11 +50,11 @@ Null handle arguments return the same defaults as Jass instead of erroring:
50
50
| `GetUnitName(null)` | `""` | nil error | `""` |
51
51
| `GetHandleId(null)` | `0` | nil error | `0` |
52
52
53
-
This applies across the native surface — integer, real, boolean, and string return types all fall back to their Jass defaults when called with null handles.
53
+
This applies across the native surface. Integer, real, boolean, and string return types all fall back to their Jass defaults when called with null handles.
54
54
55
55
### Handle ID replacement
56
56
57
-
All `GetHandleId` usage is replaced by the compiler with a safe alternative that produces consistent, desync-free identifiers. This is transparent — the replacement behaves the same way as the Jass `GetHandleId` for the purposes code actually relies on.
57
+
All `GetHandleId` usage is replaced by the compiler with a safe alternative that produces consistent, desync-free identifiers. This is transparent; the replacement behaves the same way as the Jass `GetHandleId` for the purposes code actually relies on.
Copy file name to clipboardExpand all lines: _doc/features/map-formats.md
+4-4Lines changed: 4 additions & 4 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -14,19 +14,19 @@ WurstScript supports both of Warcraft III's map storage formats: the classic MPQ
14
14
15
15
## MPQ Archives
16
16
17
-
`.w3x` and `.w3m` files are MPQ archives — binary containers that pack all map assets and data into a single file. This is the traditional format and remains the default output of the World Editor.
17
+
`.w3x` and `.w3m` files are MPQ archives, binary containers that pack all map assets and data into a single file. This is the traditional format and remains the default output of the World Editor.
18
18
19
19
Wurst reads MPQ archives natively for building and running. No unpacking step is needed.
20
20
21
21
## Map Folders
22
22
23
23
The Reforged World Editor can also load and save maps as plain folders, as long as the folder name ends in `.w3x` or `.w3m`. All the files that would normally be packed into the MPQ archive are stored directly on disk instead.
24
24
25
-
Wurst supports map folders as a first-class input. A map stored as a folder behaves identically to a packed archive from Wurst's perspective — open, build, and run work the same way.
25
+
Wurst supports map folders as a first-class input. A map stored as a folder behaves identically to a packed archive from Wurst's perspective: open, build, and run work the same way.
26
26
27
27
**Why use folders:**
28
28
29
-
- Full version control over map data — every file is a plain file, so diffs and history work naturally
29
+
- Full version control over map data because every file is a plain file, so diffs and history work naturally
30
30
- No binary merge conflicts
31
31
- Works well with the Export to Folder workflow described below
32
32
@@ -38,7 +38,7 @@ The VS Code extension can convert an existing MPQ map to folder format directly:
38
38
2. Use **Export to Folder** from the context menu or command palette.
39
39
3. The extension unpacks the entire archive into a new folder with the same `.w3x`/`.w3m` name.
40
40
41
-
From that point, the folder can be opened in the World Editor and used with Wurst exactly like the original archive — but now all files are accessible individually for editing, scripting, and version control.
41
+
From that point, the folder can be opened in the World Editor and used with Wurst exactly like the original archive, but now all files are accessible individually for editing, scripting, and version control.
Copy file name to clipboardExpand all lines: _doc/features/vscode.md
+9-9Lines changed: 9 additions & 9 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -10,17 +10,17 @@ author: Frotty
10
10
layout: doc
11
11
---
12
12
13
-
The [Wurst VS Code extension](https://marketplace.visualstudio.com/items?itemName=peterzeller.wurst) turns VS Code into a full Warcraft III development environment. Installing it is all that is needed to get started — the extension manages the compiler and CLI automatically.
13
+
The [Wurst VS Code extension](https://marketplace.visualstudio.com/items?itemName=peterzeller.wurst) turns VS Code into a full Warcraft III development environment. Installing it is all that is needed to get started because the extension manages the compiler and CLI automatically.
14
14
15
15
## Language Support
16
16
17
17
The extension provides first-class editing support for `.wurst` files:
18
18
19
19
-**Syntax highlighting** and semantic tokens
20
-
-**Hover documentation** for functions, types, and variables — including native documentation pulled from [JassDoc](https://github.com/lep/jassdoc) where available
20
+
-**Hover documentation** for functions, types, and variables, including native documentation pulled from [JassDoc](https://github.com/lep/jassdoc) where available
21
21
-**Inlay hints** for type information and code flow
22
22
-**Go-to-definition** and **find references** across the full project
23
-
-**Inline diagnostics** from the compiler — errors and warnings appear in the editor as you type
23
+
-**Inline diagnostics** from the compiler; errors and warnings appear in the editor as you type
24
24
-**Code completion** for identifiers, packages, and native functions
25
25
26
26
## Build and Run
@@ -50,7 +50,7 @@ Wurst supports both MPQ-era classic installations and CASC-backed clients such a
50
50
51
51
The extension is the editor-facing part of Wurst’s broader patch-aware workflow. It detects the available Warcraft III client when possible and uses the selected game data for previews and map tooling, whether the project targets classic Jass or modern Reforged Lua.
52
52
53
-
Wurst can also read assets directly from the Warcraft III installation — not only from files inside your project. This works with both Reforged CASC storage and classic Warcraft III MPQ installations.
53
+
Wurst can also read assets directly from the Warcraft III installation, not only from files inside your project. This works with both Reforged CASC storage and classic Warcraft III MPQ installations.
54
54
55
55
For MPQ-era classic installations, Wurst follows the game’s layered archive model, resolving files through the base game, expansion, locale, and patch archives so patched assets override their older versions:
56
56
@@ -64,13 +64,13 @@ That means the asset browser, object metadata, icons, model viewer, textures, an
64
64
65
65
-**Browse** the archive file tree without unpacking
66
66
-**Extract** individual files from the archive
67
-
-**Export to Folder** — unpacks the entire archive into a `.w3x` or `.w3m` folder for use with version control or the map folder workflow (see [Map Formats](/features/map-formats.html))
67
+
-**Export to Folder**: unpacks the entire archive into a `.w3x` or `.w3m` folder for use with version control or the map folder workflow (see [Map Formats](/features/map-formats.html))
The null-safe operator `?.` accesses a member only when the receiver is not `null`.
284
-
The receiver is evaluated exactly once; if it is `null`, the access is skipped entirely — for a method call this means the arguments are not evaluated either — and the result of the whole expression is `null`.
284
+
The receiver is evaluated exactly once. If it is `null`, the access is skipped entirely. For a method call, this means the arguments are not evaluated either, and the result of the whole expression is `null`.
Copy file name to clipboardExpand all lines: _news/map-folders-mpq-lua-guardrails.md
+3-3Lines changed: 3 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -18,15 +18,15 @@ This means you can open, build, and run a map that lives as an unpacked director
18
18
19
19
The VSCode extension gained an MPQ inspector that lets you browse the contents of a `.w3x`/`.w3m` file directly in the editor without needing the World Editor.
20
20
21
-
From there you can extract individual files or use the new **Export to Folder** action, which unpacks the entire map archive into a folder — matching the `.w3x`/`.w3m` folder format described above. This pairs well with the map folder support: open a legacy map, export it to a folder, and from that point on work with it as a plain directory.
21
+
From there you can extract individual files or use the new **Export to Folder** action, which unpacks the entire map archive into a folder matching the `.w3x`/`.w3m` folder format described above. This pairs well with the map folder support: open a legacy map, export it to a folder, and from that point on work with it as a plain directory.
22
22
23
23
The inspector also has better asset integration now. Icons can be previewed directly, and Ctrl-clicking asset paths opens a preview for the referenced model or texture, making it much faster to check whether an imported path resolves to the file you expected.
24
24
25
25
Under the hood, there is now rudimentary read support for most Warcraft III binary formats. That gives the tooling a broader view into map data and lays the groundwork for richer inspection and editor features in future updates.
26
26
27
27
## Lua Jass Shimming
28
28
29
-
The Lua backend now applies a dedicated **Jass shim pass** to the generated Lua code. The goal is to emulate Jass runtime behavior in places where plain Lua would act differently — so that code written for the Jass backend keeps working on Lua without any user-side changes.
29
+
The Lua backend now applies a dedicated **Jass shim pass** to the generated Lua code. The goal is to emulate Jass runtime behavior in places where plain Lua would act differently, so that code written for the Jass backend keeps working on Lua without any user-side changes.
30
30
31
31
The most common case is natives called with `null`. In Jass, this is well-defined: most natives simply return a default value. In plain Lua the same call raises a nil error and crashes. With the shim pass, the behavior matches Jass:
The same principle applies across the native surface — integer, real, boolean, and string returns all fall back to their Jass defaults when called with null handles, rather than erroring.
39
+
The same principle applies across the native surface: integer, real, boolean, and string returns all fall back to their Jass defaults when called with null handles, rather than erroring.
40
40
41
41
**Handle ID safety.**`GetHandleId` in Jass returns stable integers that code commonly stores and compares. In Lua the equivalent is fragile and a known source of desyncs. The compiler replaces `GetHandleId` usage with a safe alternative that avoids this class of problem entirely.
excerpt: Reforged 3.0 joins WurstScript's supported patch targets, with updated tools, standard library support, and new native APIs.
4
+
date: 2026-09-13
5
+
image: /assets/images/news/wurst-perfect.png
6
+
layout: newsarticle
7
+
author: Frotty
8
+
---
9
+
10
+
Warcraft III: Reforged 3.0.0 has arrived alongside **Forsaken Kingdom**, the first new official Warcraft III campaign in more than two decades. The paid campaign follows the last days of Lordaeron and the rise of the Forsaken, while the free 3.0 update brings substantial changes for players and mapmakers alike.
11
+
12
+
## Patch 3.0 Joins the Supported Targets
13
+
14
+
WurstScript supports building maps for different Warcraft III patches rather than tying every project to one game version. Projects can target older patches or current Reforged releases and compile to either Jass or Lua, with the appropriate core definitions and standard library for the selected target.
15
+
16
+
Support for Reforged 3.0 has now been added to the tools and standard library, including the patch's new flows and native API additions. You can select the version and backend that fit your map while still taking advantage of the latest functionality when targeting 3.0.
17
+
18
+
## Updating an Existing Project
19
+
20
+
Grill keeps an existing project's patch target unchanged, so `grill install` will not automatically move a project from 2.0 to 3.0. To opt in, update the target in `wurst.build`:
21
+
22
+
```yaml
23
+
wc3Patch: v3.0
24
+
```
25
+
26
+
Make sure the Wurst VS Code extension is up to date, then refresh the project dependencies:
27
+
28
+
```bash
29
+
grill install
30
+
```
31
+
32
+
The command updates dependencies such as the standard library and prepares the core JASS definitions for the selected patch. Your existing Jass or Lua backend choice remains unchanged. New projects, and older projects without a recorded `wc3Patch`, are offered the patch selector by Grill with 3.0 as the default.
33
+
34
+
The new scripting surface includes natives for resetting a unit's attack cooldown, changing the remaining cooldown of a unit ability, enabling or disabling a unit's aura abilities, and more. The update also adds a broad set of World Editor features, including expanded lighting, fog and water controls, a free camera, per-player HUD selection, and new doodad and minimap options.
35
+
36
+
Whether you are maintaining an older Jass map, building a modern project with Lua, or moving between supported patch targets, Wurst lets you keep the workflow that fits your project. Update your Wurst installation and project dependencies through the usual workflow to build for 3.0.
37
+
38
+
Read the full [Warcraft III: Reforged: Forsaken Kingdom patch notes](https://us.forums.blizzard.com/en/warcraft3/t/warcraft-iii-reforged-forsaken-kingdom-patch-notes/38400).
0 commit comments