Skip to content

Unciv Lua API Extension (VSCode)

One-time install, forever-fresh autocompletion. The unciv-lua-api VSCode extension is a thin cloud puller: every time you start VSCode (or open a .lua file) it fetches the latest lua-api.lua / lua-map-api.lua from the UncivCN docs site and syncs them into ~/.unciv/lua-api/. Combined with the LuaLS language server you get autocompletion, hover docs and typo checking for ctx.… that never goes stale — no manual downloads, no copying files, no checking for updates.

Why you want this

The Lua API definitions (lua-api.lua / lua-map-api.lua, generated from the game code) change with every game release. Copying them into your mod by hand means:

  • you forget to check for new releases → stale autocompletion, wrong hints;
  • every mod needs its own copy that must be re-synced;
  • new APIs (e.g. civ.discoverTech()) simply don't autocomplete until you remember to update.

The extension solves this by separating data from logic: the definitions live in the cloud (deployed automatically on every release) and the extension just pulls them. The extension itself almost never needs updating.

Install

  1. Install the Lua language server: in VSCode, install the Lua extension by sumneko (the LuaLS language server).
  2. Install the Unciv Lua API extension: download unciv-lua-api.vsix from the latest UncivCN release (it's attached to every release, ~6 KB), then in VSCode run Extensions → ⋯ → Install from VSIX… and pick the file.
  3. Configure once: open the command palette (Ctrl+Shift+P) and run Unciv: Configure Lua API autocompletion. It adds ~/.unciv/lua-api (absolute path) to your user-level Lua.workspace.library setting — this applies to every mod workspace on your machine, you never do this again.

Done. Open any mod folder and start writing: ctx. autocompletes, hovering ctx.civ.addGold( shows its signature, typos like ctx.civ.addGoldd(...) get red squiggles immediately. Map scripts (GenerateMap(ctx)) get the same treatment from lua-map-api.lua — both files are managed automatically.

How it works

Game code → generates lua-api.lua / lua-map-api.lua (with a -- Unciv version: header)
    ↓ deployed automatically on every release
docs site: https://club.unciv.cn/Unciv/Modders/lua-api.lua
    ↓ pulled on every VSCode start / on opening a .lua file (fallback: GitHub raw)
extension → ~/.unciv/lua-api/
    ↓ one-click configure
LuaLS workspace.library (user-level setting) → autocompletion everywhere
  • Update check: the generated files carry a -- Unciv version: 4.21.6.6 (build 1250) header, so old and new copies are instantly distinguishable; the extension only writes when the content actually changed.
  • Offline: if the cloud is unreachable, the last synced copy is kept (with its version header) and your autocompletion keeps working; it catches up automatically next time.
  • Manual refresh: command palette → Unciv: Update Lua API definitions now.

Manual setup (alternative)

If you prefer not to use the extension, copy the definitions from the repo's docs/Modders/ (or from the docs site) into your mod and create a .luarc.json:

json
{
    "runtime.version": "Lua 5.2",
    "workspace.library": [
        ".lua-api"
    ],
    "diagnostics.globals": ["ctx"]
}

The mod checker whitelists .luarc.json in the mod root - keep this exact file name (LuaLS only reads .luarc.json from the workspace root; renaming it breaks autocompletion and the checker reports it as misplaced).

Remember to re-copy the files after each game update — this is exactly the chore the extension eliminates.

FAQ

Does this require the game or the source code? No. Only VSCode + the Lua language server + this extension.

Why isn't it on the VSCode marketplace? The extension is deliberately a thin puller — the definitions come from the cloud in real time, so it doesn't depend on marketplace auto-updates to stay fresh. If it ever needs a marketplace listing (Open VSX / VSCode Marketplace), publishing is a one-step CI addition; the extension itself doesn't change.

I use VSCodium / Cursor / another LuaLS-capable editor? The extension targets VSCode's extension API; on other editors you can still get the same result by pointing LuaLS's workspace.library at ~/.unciv/lua-api (after running the extension once in VSCode, or syncing the files by hand).

Where do the definitions come from? They are generated from the game code (LuaApiDocs / LuaMapGenApiDocs tables, see Coding Standards) — the same source as Lua API Reference, so the docs you read online and the definitions in your editor can never disagree.

See also