Skip to content

Commit 3bd6897

Browse files
committed
Add Warcraft III 3.0 support news
1 parent fa4647a commit 3bd6897

16 files changed

Lines changed: 100 additions & 43 deletions

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ Adding a standard library doc page works almost the same as tutorials.
7070

7171
The site uses [`pagefind`](https://pagefind.app/) for fully local static search. No external API key is required.
7272

73-
**The index is generated automatically by CI on every deploy** — see
73+
**The index is generated automatically by CI on every deploy.** See
7474
[`.github/workflows/pages.yml`](.github/workflows/pages.yml). It builds the
7575
site, runs Pagefind against the *built* `_site`, and deploys the result to
7676
GitHub Pages. Because the index is rebuilt from the actual content on every
@@ -94,7 +94,7 @@ In repo **Settings → Pages → Build and deployment**, set **Source** to
9494
2. Generate the index into `_site/pagefind`: `npx -y pagefind@1.5.2 --site _site`
9595
3. Serve `_site` (e.g. `npx -y serve _site`). Search loads from `/pagefind/pagefind.js`.
9696

97-
Repeat steps 12 after content changes you want reflected in local search.
97+
Repeat steps 1-2 after content changes you want reflected in local search.
9898
Prerequisite: Node.js (for `npx pagefind`).
9999

100100
### Jenkins

_config.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@ kramdown:
4444
entity_output: as_char
4545
toc_levels: 1..6
4646
smart_quotes: lsquo,rsquo,ldquo,rdquo
47+
typographic_symbols:
48+
mdash: "---"
49+
ndash: "--"
4750
input: GFM
4851
hard_wrap: false
4952
footnote_nr: 1

_doc/features/agents.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,4 +54,4 @@ Without the flag, `grill` simply asks during setup.
5454

5555
## Keeping It Up to Date
5656

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.

_doc/features/backends.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ redirect_from:
1212
- /tutorials/lua-jass-shim.html
1313
---
1414

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.
1616

1717
## Choosing a Backend
1818

@@ -28,15 +28,15 @@ Jass is the default and works well for classic and pre-Reforged patches. Lua tar
2828
2929
Jass and Lua have different runtime semantics in several areas. The most common differences that affect real maps:
3030
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.
3232

3333
**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.
3434

3535
**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.
3636

3737
## The Jass Shim Pass
3838

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.
4040

4141
### Null-safe natives
4242

@@ -50,11 +50,11 @@ Null handle arguments return the same defaults as Jass instead of erroring:
5050
| `GetUnitName(null)` | `""` | nil error | `""` |
5151
| `GetHandleId(null)` | `0` | nil error | `0` |
5252

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.
5454

5555
### Handle ID replacement
5656

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.
5858

5959
### Uninitialized variable defaults
6060

_doc/features/map-formats.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,19 @@ WurstScript supports both of Warcraft III's map storage formats: the classic MPQ
1414

1515
## MPQ Archives
1616

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.
1818

1919
Wurst reads MPQ archives natively for building and running. No unpacking step is needed.
2020

2121
## Map Folders
2222

2323
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.
2424

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.
2626

2727
**Why use folders:**
2828

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
3030
- No binary merge conflicts
3131
- Works well with the Export to Folder workflow described below
3232

@@ -38,7 +38,7 @@ The VS Code extension can convert an existing MPQ map to folder format directly:
3838
2. Use **Export to Folder** from the context menu or command palette.
3939
3. The extension unpacks the entire archive into a new folder with the same `.w3x`/`.w3m` name.
4040

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.
4242

4343
## Which Format to Use
4444

_doc/features/vscode.md

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,17 @@ author: Frotty
1010
layout: doc
1111
---
1212

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.
1414

1515
## Language Support
1616

1717
The extension provides first-class editing support for `.wurst` files:
1818

1919
- **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
2121
- **Inlay hints** for type information and code flow
2222
- **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
2424
- **Code completion** for identifiers, packages, and native functions
2525

2626
## Build and Run
@@ -50,7 +50,7 @@ Wurst supports both MPQ-era classic installations and CASC-backed clients such a
5050

5151
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.
5252

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.
5454

5555
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:
5656

@@ -64,13 +64,13 @@ That means the asset browser, object metadata, icons, model viewer, textures, an
6464

6565
- **Browse** the archive file tree without unpacking
6666
- **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))
6868

6969
## Command Palette
7070

7171
Common Wurst actions are available via `F1`:
7272

73-
- `Wurst: Run` build and launch the map
74-
- `Wurst: Build` compile without running
75-
- `Wurst: Install` install/update the toolchain
76-
- `Wurst: New Wurst Project` project scaffolding
73+
- `Wurst: Run`: build and launch the map
74+
- `Wurst: Build`: compile without running
75+
- `Wurst: Install`: install/update the toolchain
76+
- `Wurst: New Wurst Project`: project scaffolding

_doc/manual.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,7 @@ temp.addAction(function action)
281281
### Null-safe operator
282282

283283
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`.
285285

286286
```wurst
287287
u?.kill() // only kills the unit if u is not null

_layouts/compress.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# Jekyll layout that compresses HTML
33
# v3.0.4
44
# http://jch.penibelst.de/
5-
# © 20142015 Anatol Broder
5+
# © 2014-2015 Anatol Broder
66
# MIT License
77
---
88

_news/map-folders-mpq-lua-guardrails.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,15 @@ This means you can open, build, and run a map that lives as an unpacked director
1818

1919
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.
2020

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.
2222

2323
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.
2424

2525
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.
2626

2727
## Lua Jass Shimming
2828

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.
3030

3131
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:
3232

@@ -36,7 +36,7 @@ GetUnitX(null) -- Jass: returns 0.0
3636
-- shimmed Lua: returns 0.0
3737
```
3838

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.
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.
4040

4141
**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.
4242

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
---
2+
title: Support for Warcraft III 3.0
3+
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

Comments
 (0)