Atlas of Bretonnia

Modders' workshop · guide · 48 min read

Terry, the guide: Total War: Warhammer III's terrain editor, from your first battle map to campaign terrain

Terry is the 3D terrain editor in Total War: Warhammer III's Assembly Kit. This guide takes you through it step by step: opening it, reading its window, moving around, painting, making a first battle map and seeing it in game. It then gathers what is known about campaign map terrain, which the kit does not ship, learnt while porting a whole map into Warhammer III.

Reviewed on 25 September 2026, update 9.0. Written against its sources, the Assembly Kit on patch 8.1, CA's wiki and tw-modding; what 9.0 changed on our project has been added, the rest has not been rechecked point by point. When in doubt, check, and tell us.

What Terry is, and what it does in the public kit§

Terry (Terrain Metadata Editor) is Creative Assembly's (CA) 3D terrain editor, shipped with the Total War: Warhammer III Assembly Kit. It is where a terrain is made: relief, textures, vegetation, props, logical zones, lighting and sounds. It is not a separate program: it is a mode of Tweak, the kit's editor.

Terry does not write the files the game reads, but sources, in the kit's raw_data folder. BOB, the kit's builder, builds them into working_data; RPFM puts them into a pack. Terry starts BOB itself: File → Process with BOB.

The journey of a battle map, from Terry to the game:

  1. Terry

    You paint the tile (relief, textures, props, logical zones) and place it in a tile map.

    .terry, .layer, .tif, tile_map.png in raw_data

  2. BOB

    It builds the tile map, then the tile, into game files.

    working_data/terrain/…

  3. RPFM

    The pack: the built files, a battles_tables row, a text, an image.

    my_map.pack

  4. In game

    The map appears in custom battle.

This guide follows that journey, then gathers what is known about campaign map terrain.

Terry's vocabulary§

A few words come up everywhere. Here is the meaning this guide gives them.

Nested wordsa battle map, from the outside inTile mapthe scenery all around the tile, borrowed from a vista (aready-made tile map): you take its tile_map.png andclimate_map.pngTile.terrythe ground you fight on, which you paintRasters.tifimages in which each pixel carries a value: relief,texture blend…Layers.layergroups of entities: a File Layer is a .layer file;a Logical Layer is just for tidyingEntitiesprops, prefabs (ready-to-place assemblies) andlogical entities: deployment zones, playable area,capture points…
Terry's words nest: the tile map, the scenery borrowed from a vista, surrounds the tile; the tile is a .terry project, its rasters (.tif images) and its layers; a layer holds entities.
WordMeaning
Tilea piece of terrain made in Terry: relief, textures, props, logic. A battle map is a tile placed in a tile map.
Tile mapthe large terrain, assembled from tiles, around the battlefield; your tile has its place in it. On a campaign map, tile_map.png says which kind of tile goes on each hex: land, sea, coast, road.
Rasteran image in which each pixel carries a value: a height, a texture blend, a mask. One .tif file per saved raster (relief, texture blend…).
Vistaa ready-made tile map, reused as scenery around your tile; the Warhammer III kit ships none (see the FAQ).
Layera group of entities. A File Layer is a .layer file; a Logical Layer is just for tidying.
Prefaba ready-to-place, reusable assembly of objects; battle or campaign.
Logical entitywhat the game reads without showing it: deployment zones, playable area, AI hints, no-go zones, capture points.
Playable Areain battle, the logical entity bounding where movement orders can be given; it also sets where units rout and reinforce from, and the minimap's edges (CA). CA's introduction page adds that its edges bound the camera.
Campaign playable areathe campaign_map_playable_areas row describing a campaign's map; its terrain_folder column names a battle terrain.
BOBthe kit's builder: it turns the sources in raw_data into game files, in working_data. Each execution is called a run here. See the BOB guide.
raw_data / working_datawhat the kit's tools read (your sources) / what they produce (the game files).
Catchmentan export variant of the same map (catchment_01…), picked by the catchment_name column of the battles table. On a campaign, catchment maps pick the battle map according to the location.

Opening Terry§

Since Terry is a mode of Tweak, there are three ways in, all leading to the same window.

How to check. The window is titled TWeak - Terry. It takes a while to come up: about 25 seconds for us. On start-up, the Project Wizard appears.

The Project Wizard§

The Project Wizard appears on start-up (Show on startup box) and reopens with File → Project Wizard…: it offers recent projects and the New tab, which it opens on (tw-modding).

In Warhammer III it shows three icons. The right-hand one, a dotted box, creates a prefab, battle or campaign (tw-modding, Custom Campaign Settlement Skins). The kit only knows three project types: tile, tile_map and prefab (file working_data/Terry/entity_configuration.xml). So the other two icons are probably the tile and the tile map (not checked on screen).

Terry's window§

Terry's window is made of panels that can be detached and docked: the layout is adjustable, and yours may differ. The figure shows a common layout, with numbered markers: menus and toolbars at the top, scene hierarchy on the left, properties at the bottom and on the right, 3D view in the centre, BOB's messages at the bottom right.

TWeak - TerryFile View Tools1234World | EditorVisual · Logical · OtherScene Hierarchy▸ base.layer▸ decor.layer▸ logic.layerEntity PropertiesProject ErrorsPlayable AreaAlliance 1Alliance 0Tool PropertiesScale · HardnessMap Properties | SettingsBOB's messages123456789
  1. Menus and toolbarsFile, View, Tools; toolbars open from View → Toolbars.
  2. The Basic toolbartools 1 to 4 (select, move, rotate, scale), four painting modes, the Process with BOB globe (Ctrl+P), World or Editor View; then Entity Creation (Visual, Logical, Other).
  3. Scene Hierarchyentities, sorted into layers; a double-click makes a layer active (in red).
  4. Entity Propertiesthe selection's properties, editable for several objects at once.
  5. Project Errorswhatever would stop the map working in game.
  6. The viewportthe 3D scene: the tile grid, the playable area, the deployment zones (Alliance 0 = attacker, blue in Warhammer III's Terry; 1 = defender, dark red; the 2016 docs had it the other way round: trust the number).
  7. Tool Propertiesthe active tool's settings: brush, or a prefab picker.
  8. Map Properties and Settingsthe project's settings; Terry's own (autosave, BOB, camera).
  9. BOB's messagesbottom right, during a run: pop-ups, according to tw-modding.
Terry's window, in a common layout (diagram): panels can be detached and docked, yours may differ.
PanelWhat it is for
Viewportthe 3D scene. World View shows a game-like preview; Editor View adds the debug lines. The G key switches between them.
Scene Hierarchythe entities, sorted into layers: a File Layer per .layer file (at least one per project), Logical Layers for tidying. Double-clicking makes a layer active: it turns red, and new objects land in it. Unticking Export turns it into a reference layer, which is not exported.
Entity Propertiesthe selection's properties, editable for several objects at once. Bottom left.
Tool Propertiesthe active tool's settings: the brush, or the choice of a prefab, with a search field.
Map Propertiesthe project's settings. Bottom right.
SettingsTerry's own settings, not the map's: autosave, BOB options, overlays, camera, preview environment (Set As Default For Project Type button).
Project Errorswhatever would stop the map working in game.
Toolbarsthrough View → Toolbars, or the Tools menu. Basic: tools 1 to 4, the four painting modes, Show in Explorer, World / Editor View, and the export: the globe with an arrow, Process with BOB (Export Map in the first Warhammer). Then Advanced, and Entity Creation (Visual, Logical, Other).

A project's files§

In these XML files, a property carries the name it shows in Terry, in lower case, with spaces turned into underscores: Lighting File is written lighting_file. Handy for finding in a file what you set in the window.

Coordinates§

Getting around: camera and shortcuts§

These shortcuts come from CA's documentation. The keyboard ones are in the Warhammer III kit's shortcut file (working_data/Terry/local/keyboard.xml); the mouse ones in CA's pages and the kit's status tooltips (working_data/Terry/status_tooltips.xml). Ctrl+S and Ctrl+Shift+S are missing: the file lists “save as” with no key, and “save” not at all.

Cheat sheet: keyboard and mousekeyboard from keyboard.xml and CA; mouse from CA's pagesCameraWASDmove · Shift: fasterQErotateCXup · downRtop-down view, centredZzoom to selectionLetters of a QWERTY keyboard. On AZERTY, try both:W A S D, then Z Q S D.Tools and view1234select · move · rotate · scaleTabedit the entity5align the terrain under the selectionShift+5raise itAlt+5lower itGworld / editor viewHcoloured reliefBrush[]sizeOPopacity − / +NMother value − / +,.palette ← / →Mouseleft click:select, paintright click or Esc:leave the tool(select mode: menu)wheel: zoommiddledrag: panAlt+ middle: rotateShift+ middle: up, downCtrl+PProcess with BOB(or the globe)Ctrl+Snot confirmed in Warhammer IIIsave through File → SaveAlso in the file; meaning to be checkedShift+Cswitch cameraLlocal or world axesShift+Tclamp and orient to terrainShift+2place tool
Terry's keys as the Warhammer III kit declares them, and the mouse as CA describes it. Letters are those of a QWERTY keyboard: see the “Non-QWERTY keyboards” box. Ctrl+S is not in the file: save through the File menu.
KeysAction
W A S D (Shift: faster) · Q / Emove · rotate
C / X · R · Zup / down · top-down view, centred · zoom to the selection
wheel · middle button · Alt + middle · Shift + middlezoom · pan · rotate · up or down
right-click or Escleave the current tool
1 2 3 4 · Tabselect, move, rotate, scale · edit the entity
Shift + drag · Ctrl + dragduplicate · rotate the selection
Ctrl+G / Ctrl+Ugroup / ungroup
Ctrl+A · Ctrl+D · Ctrl+I · Ctrl+H · Fselect all · select none · invert the selection · hide · freeze the selection
[ / ] · O / P · N / M · , / .brush size · opacity − / + · “other value” − / + · previous / next palette
hold Shift · Alt + click · Ctrl+Alt + mousequick smoothing · pick a value · brush size and rotation
5 · Shift+5 · Alt+5align · raise · lower the terrain under the selection
H · Gcoloured relief (topography) · world / editor view
Shift+C · L · Shift+T · Shift+2switch camera (probably perspective or orthographic) · local or world axes · clamp and orient to the terrain · place tool (meanings deduced from the file's command names: to be checked)
Ctrl+N · Ctrl+O · Ctrl+Pnew · open · Process with BOB
Ctrl+S · Ctrl+Shift+Ssave · save as (unconfirmed in Warhammer III)

Two commands have no default key: CopyCamera and PasteCamera. They copy and paste the viewpoint through the clipboard, in the form camv3;eye x;y;z;target x;y;z: a way to compare two states of a terrain from the same angle. To give them one, the ConfigureKeyset command is probably the shortcut settings (its menu label is still to be checked); keys are stored in keyboard.xml.

The painting and creation modes§

Terry works in modes: pick a mode, a tool, then paint or place. The four painting modes are on the Basic toolbar; the creation modes on the Entity Creation toolbar and in the Tools menu.

The four painting modesHeightTerrain Height Paintingpaints the relief<project>.height.<id>.tifAdd · Subtract · Absolute · Smooth · EraseTextureTerrain Texture Paintingpaints the textures, one channel each(grass01, mud01…)<project>.blend.<id>.tifNormal · Smooth · Erase · Replacelow flow: textures blend softlyForestTerrain Forest Paintingpaints the forest texture: trees above 60%<project>.blend.<id>.tifforest01 channel (kit's example tile); deduced:the kit has no forest raster.a "hybrid" texture mode, for forests (CA)60%OtherTerrain Painting (Other)overrides the computed logical ground typeGroundType rasterfile name to be checkedSet · Clearsame texture, two ground typesABBrush gesturesleft clickpaintright clickEscleaveShiftsmooth[]sizeOPopacityCtrl+Alt+ mouse: size, rotationAlt+ click: sample (textures)
The four painting modes on the Basic toolbar: what each paints, the file it writes and its operations (the kit's tool_state.xml), then the brush gestures.

Relief: Terrain Height Painting§

Textures: Terrain Texture Painting§

Forests: Terrain Forest Painting§

You don't place trees one by one: you paint the forest texture, and forest grows wherever that texture exceeds 60%.

Logical ground: Terrain Painting (Other)§

This mode paints logical ground types: what the game knows about the ground, regardless of the texture you see.

Objects: Entity Creation (Visual)§

Logic: Entity Creation (Logical)§

The battlefield from aboveATile map (vista)scenery, out to 8 km from the centreBYour 8 × 8 tileCUsable Area = the tile · 2,048 mDPlayable Area−1Alliance 1 · defender+0Alliance 0 · attacker+EGJNo-GoI123FH0 blue1 dark redin Warhammer III's Terry2016: the other way round. Trust the number, never the colour.Defensive Hillclosed polygonDefensive Hillleft open:probable crash(CA)diagram, not to scale; alliances in Terry's colours
  1. Tile mapthe scenery all around, borrowed from a vista; drawn out to 8 km from the centre (CA).
  2. Your 8 × 8 tilethe ground you fight on, which you paint, in the middle of the tile map.
  3. Usable Areathe same square as the tile (B): an 8 × 8 tile is 2,048 m across (read off the kit's example tile); placed in the centre, it covers exactly the Usable Area, 2,048 m centred on the battlefield, the only place with physics and unit pathfinding (CA).
  4. Playable Areawhere move orders can be given; its edges set where units flee and reinforcements arrive, and the minimap's edges (CA, Creating Zones); CA's introduction page adds that they bound the camera.
  5. Deployment ZonesAlliance 0 = attacker, 1 = defender; in Warhammer III's Terry, 0 is blue and 1 dark red (the 2016 docs had it the other way round): trust the number. Each zone has its additive region (+), created with it (tutorial); an optional subtractive region (−) cuts a piece out (CA).
  6. Capture pointsfor a domination map: type domination 1, 2, 3; importance score; from 80 × 80 to 180 × 180 (tutorial).
  7. Reinforcement linesAI Hint attacker or defender teleport reinforcement line: a short two-point line; about 20 units long is enough (tutorial).
  8. Procedural Exclusion Zonelaid between the playable area and the tile's edge, to make the map lighter: no procedural vegetation outside play, grass but also forest trees; repaint the forests you want by hand (tutorial).
  9. No-Goa closed polygon marking an impassable area (CA).
  10. Defensive Hillan AI Hint showing the AI a defensive position: a closed polygon; left open, a probable crash (CA).
A battle map seen from above: your tile in the middle of a tile map borrowed from a vista, and what you lay on it (logical entities, exclusion zone), marked by letters.

Advanced tools: Advanced and Other§

A ruler to measure; Snap BBox and Snap Verts to align; the grid and snapping; a perspective or orthographic camera; Sound Marker to place sounds; Camera Bounds, which limits the editor's camera only, not the game's.

Several variants of one map§

A layer can carry an export type (catchment_01…). The catchment_name column of the battles table then picks the variant the game loads. That is how one terrain gives both a domination map and a classic battle.

Your first battle map, step by step§

This walkthrough follows the tw-modding wiki's Warhammer III tutorial, completed with CA's documentation. Two pieces of advice first. Save often: CA warns that Terry sometimes crashes. And set the autosave in Settings (on our install, it was set to 15 minutes). Terry keeps its autosaves in working_data/Terry/local/autosave/ and logs its errors in working_data/Terry/local/terry_error_log.txt, in the kit folder.

A battle map is two Terry projects. The tile is the ground where the fighting happens, which you paint in detail; the tile map is the scenery around it, drawn out to 8 km (CA), which you borrow from a vista. Only a 2,048 m square in the centre, the Usable Area, has physics and unit pathfinding (CA). The figure shows both projects one above the other, with their files, BOB's two runs and the battles_tables row that links it all to the game.

raw_data · what you makeTile mapterrain/battles/<map>/<map>.terry · tile_map.pngclimate_map.png · explicit_tilescreated once, after the tile: Tools → Createbattle for tile…The tileterrain/tiles/battle/<tile set>/<map>/<map>.terry · .layer<map>.height.<id>.tif<map>.blend.<id>.tifwhat you paint: relief, textures, props, zonesexplicit_tiles: x,y= where the tile goesBOB: 1. the tile mapthen 2. the tileworking_data · what the game readsThe outputterrain/battles/<map>/: tile_map.bmd,tile_list.bin, map_info.xml…terrain/tiles/battle/…:tile_height_map.compressed_map, blend0.dds…RPFM: declare itbattles_tables: key · type · specification= terrain/battles/<map>/battle_environment · screenshot_path(image 3:1)battles_localised_name_<key>then: the pack installed, without the kit'sexample map, ticked in the launcher, in custombattle
A battle map: the tile map (the scenery, created once) places the tile (what you paint); BOB builds the tile map, then the tile; RPFM declares it in battles_tables.
A battle map, move by movesave often, through the File menu: Terry sometimes crashes (CA)Terry: the tile, then the tile mapgrey tag: the project open in TerryCreate the tilethe tileProject Wizard → New: a battle tile1Save it straight awaythe tileFile → Save As…: map name and tile set in lower case,size 8x8, climate<map>.terry.layer.tif2Paint itthe tilerelief, textures, forests, then the props3Place the logicthe tileTools → Entity Creation (Logical):a Playable Area, two Deployment ZonesAlliance 0 · attackerAlliance 1 · defenderThe Project Errors panel reports nothing.4Create the tile map: once is enoughthe tileTools → Create battle for tile…tile_map.pngclimate_map.pngexplicit_tiles5Place your tile in itoutside Terrytile_map.png and climate_map.png: a vista's;explicit_tiles: change x,y (black square's corner)6BOB: the tile map, then the tileafter each run, bob.log ends with Exit code: 0A run on the tile mapthe tile mapopen it, Process with BOB (Ctrl+P), then reload itYour tile is in its place.7A run on the tilethe tilereopen it; in Map Properties,untick legacy vegetation generation; then Ctrl+P8RPFM, then the gameDeclare it with RPFMthe pack, a battles_tables row, the name, the image9Test itin a custom battle, with the pack enabled in the launcher10
The ten moves of a first battle map, in order: in Terry, the tile, then the tile map; two BOB runs, tile map first; RPFM declares the map, and you test it in a custom battle.
  1. Create the project. In the Project Wizard, on the New tab, choose a battle tile. The exact label of that choice is not confirmed in Warhammer III.
  2. Save it straight away (File → Save As…): the dialog asks for the map name, in lower case (a folder name, not the name shown in game); the tile set, a folder name of your own, in lower case (the tutorial, which makes a domination map, calls it domination); the size, 8x8, to stay compatible with Warhammer II's tile maps; the climate (which drives, among other things, grass and trees). Leave the bottom box ticked, as the tutorial says (its label is not confirmed here). Check: going by the kit's example map, the tile is stored in raw_data/terrain/tiles/battle/<tile set>/<map>/. The Show in Explorer button opens the folder: a .terry, at least one .layer, some .tif files.
  3. Paint the relief, textures and forests, then place the props. To make the map lighter, the tutorial places a Procedural Exclusion Zone between the playable area and the tile's edge: no more grass outside play, but no more trees in that band's forests either; it repaints them by hand. Check in World View (G key), the game-like preview, and with H, the coloured relief.
  4. Place the logic, with Tools → Entity Creation (Logical). A Playable Area: 2x2 to 3x3, the tutorial advises, without giving the unit; without one, the game sets it between 800 and 1,300 m depending on the number of units, or fits it to the deployment zones, whichever is larger (CA). Two Deployment Zones, each with its additive Deployment Zone Region: Alliance ID 0 for the attacker, 1 for the defender, Zone ID at 0. In Warhammer III's Terry, alliance 0 shows in blue and 1 in dark red (CA's 2016 documentation had it the other way round): trust the number. For a domination map, capture points: type domination 1/2/3, importance score, from 80 × 80 to 180 × 180; the tutorial adds a second region to each deployment zone, of type guerilla exclusion additive, for vanguard deployment (the opposite alliance cannot deploy in it), and makes sure no player can vanguard-deploy onto a capture point. And reinforcement lines: an attacker or defender teleport reinforcement line AI Hint, a short two-point line; about 20 units long is enough, the tutorial says. Check: the zones show in the 3D view, and the Project Errors panel reports nothing.
  5. Create the tile map with Tools → Create battle for tile…: Terry creates its project in raw_data/terrain/battles/<map>/. Once is enough, the tutorial says; after that you work in the files it created. Check: the folder holds a .terry, tile_map.png, climate_map.png and explicit_tiles.
  6. Place your tile in the tile map. In that folder, replace tile_map.png and climate_map.png with those of an existing vista, a ready-made tile map that will serve as scenery. Then, in explicit_tiles, change the first two numbers of the line x,y,tile path,0 (see right after the list): x,y is your tile's top-left corner in tile_map.png, in pixels. An 8 × 8 tile in the centre of a 64 × 64 tile map goes at 28,28; the kit's example map has its own in the same place.
  7. Build the tile map: open it in Terry, run File → Process with BOB (Ctrl+P, or the globe on the Basic toolbar), then reload it. Check: your tile is in its place.
  8. Build the tile. Reopen it. In Map Properties, untick legacy vegetation generation (in the .terry, the use_legacy_procedural_vegetation property). Then Process with BOB. The tile map always comes before the tile; after that, when you touch up the tile, only the tile needs re-exporting.
  9. Declare the map to the game with RPFM: see the next section.
  10. Test it in a custom battle, with the pack enabled in the launcher.

By default, the tutorial says, explicit_tiles holds something like this:

3,3,terrain/tiles/battle/lzd_hills_infield/chaqua_pit,0

Change only the first two numbers. x,y are read in pixels of tile_map.png, x from the left, y from the top: open the image in your drawing program and point at the top-left corner of the vista's black square, that is 28,28 in a 64 × 64 tile map (tutorial). Check that the path is your tile's, from terrain/, with forward slashes; keep the final 0.

Placing the tile in the tile mapa vista's tile_map.png · 64 × 64 pixels00881616242432324040484856566464x →y ↓281282black 8 × 8 square: your tile's placeexplicit_tiles28,28,terrain/tiles/battle/<tile set>/<map>,012341x = the column, counted from the left.2y = the row, counted from the top.3your tile's path: check it (from terrain/, with forwardslashes).4the tutorial's final 0: keep it.Reading x,yopen the image in a paint program and point at theblack square's top-left cornerThe kit's example mapit paints its tile in the tile's colour,(0, 255, 127), in the same place,with no explicit_tiles.one BOB run on the tile map, then reload it: your tile is inthe middleavoid: a path starting with raw_data/, backslashes
In a vista's tile map, your tile takes the black square's place: explicit_tiles gives its top-left corner in pixels, then its path. An 8 × 8 tile in the middle of a 64 × 64 tile map goes at 28,28.

The kit's example map places its tile differently: its tile (raw_data/terrain/tiles/battle/test_tiles/assembly_kit_example_tile/) declares the colour (0, 255, 127) in its .terry, and its tile map's tile_map.png, 64 × 64 pixels, carries a block of it from 28,28 to 35,35, without explicit_tiles.

Declaring it to the game with RPFM, and testing it§

BOB has produced the game files. What remains is to put them in a pack and tell the game the map exists: that is the job of a battles_tables row, a text and an image. RPFM does all of it; its basic moves are in the RPFM guide.

One row, four referencesbattles_tables: a classic row copied, its key changed firstbattles_tablesfile never named data__keymyprefix_my_mapa key of your owntype · classicspecificationterrain/battles/my_map/trailing slash includedscreenshot_pathui/frontend ui/battle_map_images/my_map.pngthe space is intendedteam_size_1 · 1team_size_2 · 1singleplayer · 1multiplayer · 1battle_environmentweather/battle/wh_day_clear_04.environment_groupThe name (.loc)battles_localised_name_<key>what the player seesThe tile mapproduced by BOB,in your packThe image, 3:1in the packThe atmospherenot to be confused withbattle_environment_audiothe size of the two sides, andwhere the map is offeredThen, from pack to gameThe packwithout the kit'sexample mapPackFile → Installthen enabledin the launcherCustom battlethe map, with its nameand its image
One battles_tables row declares the map: its key gives the name (in a .loc), specification points to the tile map, screenshot_path to the image, battle_environment to the atmosphere. Then the pack, without the kit's example map, is installed, and the map is tried in a custom battle.
  1. Create a pack and add the working_data/terrain folder to it, as the tutorial does, then remove everything that is not yours: the kit's example map (assembly_kit_example_tile_map, assembly_kit_example_tile, _tile_database/TILES/test_tiles_assembly_kit_example_tile.*) and any game file you may have extracted there. Check in RPFM that only your folders remain: the tile map, the tile and its _tile_database/TILES/<tile set>_<map>.* entry.
  2. Add a row to battles_tables: right-click the pack → Create… → Create DB → battles_tables, a file named after you (never data__, which would replace the game's table); copy a classic row from the game, Paste as New Row, and change the key first (the RPFM guide). That way you keep every column; fill them in from the table below.
  3. Add the text battles_localised_name_<key>: it is the name the player will see.
  4. Add the image at the path given by screenshot_path: three times as wide as it is tall (tutorial). The space in frontend ui is intended.
  5. Save the pack, then PackFile → Install in RPFM, which copies it into the game's data folder. A square image with the same name as the pack serves as its thumbnail (the tutorial plans it for the Workshop). Then enable the pack in the launcher.
  6. Test with a custom battle. A domination map is tested in multiplayer, or with a community mod (see the tw-modding tutorial).
battles_tables columnWhat it takesExample
keyyour map's key: a key of your own, never that of a game mapmyprefix_my_map
typeclassic or dominationclassic
specificationthe tile map's folder, with the trailing slash, as in the tutorial; CA mostly writes terrain\battles\<map>\: if you copy a CA row, keep its formterrain/battles/my_map/
screenshot_paththe map's image; it must be in the packui/frontend ui/battle_map_images/my_map.png
team_size_1, team_size_2the size of the two sides1, 1
singleplayer, multiplayerwhere the map is offered1, 1
battle_environmentthe atmosphere: an .environment_group file from weather/battle/ (CA leaves it empty in 715 of its 1,216 rows); not to be confused with battle_environment_audio, right next to itweather/battle/wh_day_clear_04.environment_group
catchment_namethe export variant to load (see the modes, above)your layers' export type; with no export type, to be checked (259 CA rows leave it empty)

Campaign map terrain: what we know§

For a campaign map, the kit ships nothing: no Terry project, no raw terrain data. That is true of the Warhammer III kit, and of the Warhammer I kit. Yet Terry can open a campaign-type project. ChaosRobie, the author of Immortal Empires Expanded, proved it: he rebuilt the Immortal Empires map as a Terry project, and shared that project with the community. Here it is, dissected: it is the blueprint to follow.

ItemWhat it is
the raw_data/terrain/campaigns/<map>/ foldermissing from the kits: this is what you create
<map>.terrythe project, in XML (version 27): the map's settings, one entity per region, named after its database key, and ten terrain layers
<map>.terry.userthe preview settings: without it, Terry shows neither water nor trees
rules.bob, two filesBOB's recipe is in the parent folder, raw_data/terrain/campaigns/rules.bob: [Terrain] with PrefabRoot = art\prefabs\campaign (ChaosRobie's project's value; battle for a battle), TileDatabase = terrain\tiles\campaign\_tile_database, HeightPatch = true…; the one in the map folder only holds [Copy] and [+AssetGraph], which copy the raw project into the kit's retail folder on every run. Recreate only the map folder and you lose the recipe.
tile_map.pngthe tile map: land, sea, coasts, cliffs, roads, one colour per type
ten .tif rastersrelief, sea floor, texture blend, colours, shroud, trees, corruption, snow, patch visibility
one .layer per regionplaced objects: set dressing, mountains, water
The campaign project, folder by folderafter the project ChaosRobie sharedraw_data/terrain/campaigns/missing from the kit: to be createdrules.bobBOB's recipe, in the parent folder[Terrain]PrefabRoot = art\prefabs\campaignTileDatabase = terrain\tiles\campaign\_tile_databaseHeightPatch = true…<map>/the map's folder, to be created too<map>.terrythe project, in XML (version 27): ten terrain layers,one entity per region, named after its database key<map>.terry.userthe preview settings: without it, no water and no treestile_map.pngone colour per type: land, sea, coast, cliff, road*.tiften rasters: relief, sea floor, texture blend, colours,shroud, trees, corruption, snow, patch visibility*.layerone per region: the placed objects,set dressing, mountains, waterrules.bob[Copy][+AssetGraph]only copies the raw projectinto the kit's retail folder, on every runRecreate only <map>/ and you lose the recipe.One more region:one more entity in the .terry, and one more .layer.
The kit ships no campaign project: you rebuild one on the model of ChaosRobie's. BOB's recipe is in the parent folder's rules.bob; the one in the map folder only copies the project.

Remember that the project is tied to the map's list of regions: one more region means one more entity and one more layer. The logical half (regions, ground, roads, towns) is made in CAIME (Campaign AI Map Editor), the Campaign Map Toolkit's editor: the CAIME guide.

Raster sizes follow from the number of hexes§

Every resolution is proportional to the map's number of hexes, the CAIME one (read from ChaosRobie's project and applied to our map). The last column gives the example of our map, 400 × 440 hexes.

LayersPixels per hexExample, 400 × 440 hexes
Height, HeightSea, BlendCampaign, ColorOverlay, ColorOverlaySea8 (plus 4 rows)3200 × 3524
HeightShroud4 (plus 2 rows)1600 × 1762
CampaignTree, CorruptionMask, SnowMask, and tile_map.png2 (plus 1 row)800 × 881
PatchVisibilityMaskone cell per patch of p tile-map pixels, p = ceiling(longest side / 128)114 × 125

The arithmetic: 400 × 8 = 3200 pixels wide, 440 × 8 + 4 = 3524 high. For the patches, the tile map is 800 × 881: p = ceiling(881 / 128) = 7, and you count whole patches (800 / 7 gives 114, 881 / 7 gives 125).

One hex, four resolutions8 × 8 pixels+ 4 rows in allHeightHeightSeaBlendCampaignColorOverlayColorOverlaySea4 × 4 pixels+ 2 rows in allHeightShroud2 × 2 pixels+ 1 row in allCampaignTreeCorruptionMaskSnowMasktile_map.pngPatchVisibilityMaskone cell per p × p pixel patchof tile_map.png:p = ceiling(longest side / 128)here p = 7: one patch ≈ 3.5 hexesOur map: 400 × 440 hexes8 px per hex, + 4 rows3200 × 35244 px per hex, + 2 rows1600 × 17622 px per hex, + 1 row800 × 881p = ceiling(881 / 128) = 7114 × 125800 / 7 → 114; 881 / 7 → 125: whole patches onlyGrid too small: ground in one corner only;elsewhere, roads and the sky showing through.Read off ChaosRobie's project, applied to our map.
A campaign Terry project's rasters are sized on the hex count: 8, 4 or 2 pixels per hex, plus a few rows; PatchVisibilityMask counts patches. A schematic view of one hex.

Campaign terrain: conventions, BOB's order and limits§

Conventions§

They were established on our project and on ChaosRobie's; CA does not document them.

Sea, coast, roadstile_map.png: 1 hex = 2 × 2 pixelsThe seasea · 83, 141, 213yellow: the coast(see below)0water plane at 0, pivot inside the mapfloor below 0 everywhere,even under landThe coasta one-hex band; each hex has1 to 3 sea neighbours in asingle runa one-hex spit:"Failed to find tile", a holesea_coast · 255, 255, 0cliff_gen · 253, 3, 1shore (sea_coast) or cliff (cliff_gen): same rule.whole hexes: 0 failures; drawn by the pixel: 148 (our map)Roadsa solid 2 × 2 pixel blockper hexa one-pixel line: holesAfter each BOB run, count the "Failed to find tile" linesin bob_warnings.log: aim for 0.Established on our own project and ChaosRobie's; CA does notdocument it.
In tile_map.png each hex is a 2 × 2 pixel block: the sea is declared by its colour, the coast is painted as a one-hex band, roads as solid blocks. Any departure gives “Failed to find tile”, so holes.

The order of runs§

The tw-modding tutorial on campaign maps gives this order; the details, which are the reference, are in the BOB guide:

  1. The relief first: the next steps depend on it and read it from your pack. Put it in your pack, in the game's data folder, then close and reopen BOB.
  2. The tile map: into the pack again, then close and reopen BOB.
  3. The global tile map (roads and cliffs).
  4. global_props.bin, the placed objects: redo it whenever a region is added or removed (BOB then reads CAIME's map.hex); up to ten minutes on a large map, the tutorial says.
Campaign: the order of runsfor a map the game's database knowsA map unknown to the game's database (the one in CA's packs): BOBonly runs 6 actions out of 15, without a message. A control case,then the community.The reliefthe next steps read it from your packfull_height_map.ddsfull_logic_map.compressed_map1Relief into your pack, the pack into the game's data folder, thenclose and reopen BOBThe tile maptile_list.bintile_mask.ddspatch_mask.dds2Tile map into your pack, then close and reopen BOBThe global tile maproads and cliffs, taken from the tile map in your packglobal_map/tile_list.bin3The placed objectsBOB reads CAIME's map.hex, which must match the database;redo it for every region added or removed; up toten minutes, the tutorial saysglobal_props.bin4Generate Camera Height Map: this action crashes BOB;camera_heightmap.png is made separately (the tutorial:approximated from the heightmap, scaled).
The order from tw-modding's campaign map tutorial. BOB reads the packs in the game's data folder: after the relief, then after the tile map, the pack goes there, then you close and reopen BOB; from Terry, each Process with BOB starts a new BOB.

From Terry, each Process with BOB starts a new BOB. After each run, read bob_warnings.log, in assembly_kit/binaries/, and count the “Failed to find tile”: each one is a hole in the terrain. Check bob.log too: its first line states how many actions were selected (N action(s) were selected for execution.), and each finished action has its (STATUS: Finished) line; how many to expect: see the limits, below. Finally, look in working_data/terrain/campaigns/<map>/: the built relief (full_height_map.dds), tile_list.bin and global_props.bin.

Known limits§

One campaign, two terrainsThe campaign playable areacampaign_map_playable_areasterrain_folder = <folder>The campaign terrainterrain/campaigns/<map>/the map's relief, tiles andplaced objectsThe battle terrainterrain/battles/<folder>/a battle tile map; CA's alsocarries battle locations andcatchment mapsWithout that battle terrain: a crash at the first land battle,even between two AIs, so often at the very first end of turn.
A campaign map has two terrains: its own, and a battle terrain, named by the terrain_folder column of its campaign playable area.

The full story of a port, walls included: the porting tutorial.

Terry's pitfalls§

First, the working_data lock, in four cases:

Terry open: what works, what's blockedTerry is a mode of Tweak: Terry open means Tweak openAn open Terry locks working_dataincluding the packs placed thereProcess with BOB (Ctrl+P), started from Terrynot affected: Terry starts BOB itselfBOB started from its own windowclose Terry and the game first, then start BOBSaving a pack into working_dataclose Terry and the game first, then saveCAIME's Map Data and Dynamic Resources exportsTweak and Terry closed. CAIME's warning looks forTweak.AssemblyKit, not tweak.modder.x64.exe:don't rely on it.BOB rewrites its outputs on every run: don't touch anything upby hand in working_data.
Terry is a mode of Tweak: when open, it locks working_data. Of the four cases, only Process with BOB, started from Terry, is not affected; for the others, close it first.

For an AI reading this page§

If you are an AI helping someone use Terry, here are the essentials, checked on a real project. These facts were gathered on the game's patch 8.1 (September 2026), then reviewed for update 9.0 (for us, the kit update rewrote the raw_data\db tables but touched neither the terrain nor working_data): check them again after an update.

Frequently asked questions

Can Terry edit a campaign map?

It can open a campaign-type project, but the public kit ships none, nor any campaign terrain data: you have to rebuild one, on the model of the project ChaosRobie shared for Immortal Empires Expanded.

How do I open Terry?

From the Assembly Kit launcher in Steam (Play Battle Map Editor: Terry, which runs the command below), from Tweak (Plugins → Terry), or with the command tweak.modder.x64.exe /standalone TerrainMetadataEditor, run from the kit's binaries folder. Don't try any other option.

Can Terry be driven from the command line?

No: you can only open it. Everything else happens in its window, with keyboard and mouse; BOB is started from Terry with File → Process with BOB.

Alliance ID 0 or 1: who attacks?

0 is the attacker, 1 the defender. In Warhammer III's Terry, 0 shows in blue and 1 in red; CA's 2016 documentation had it the other way round. Trust the number, never the colour.

Why doesn't my map show up in custom battle?

Check that the pack is in the game's data folder and enabled in the launcher, that it holds the built files of both the tile map and the tile, that the specification in battles_tables points to the tile map's folder (terrain/battles/<map>/ with the trailing slash, as in the tutorial; if you copied a CA row, keep its form), and that the battles_localised_name_<key> text and the image exist.

Why doesn't Terry show my map the way the game does?

Its preview is not the game: every culture variant at once, white spheres instead of decals, no map-specific textures, water rendered differently. Campaign tree-map forests only show if the show_campaign_tree_map option is on in the Settings, and only for tree families the kit's database knows. Fidelity is judged in game.

Why does BOB only build part of my new campaign map's terrain?

A full run on a campaign terrain has 15 actions (for us, about a minute once the relief is compressed, 25 minutes the first time). For a map that the game's database (the one in CA's packs) does not know, BOB runs only 6 of them, without a message; adding the map to the kit's database or to a mod pack changes nothing. We know of no official way to lift this limit: make a control case, then ask the community.

Terry crashes when opening my campaign project: what can I do?

As long as no built terrain exists for that map, Terry crashes when opening it in 3D: untick 3D View in the opening dialog (Open…).

Must I close Terry before running BOB?

Before running BOB from its own window, or saving a pack into working_data, close Terry and the game: an open Terry locks working_data. Process with BOB, started from Terry, is not affected.

Terry crashed: where should I look?

In the kit's working_data/Terry/local folder: terry_error_log.txt, where Terry logs its errors, and the autosave folder, where it keeps its autosaves (every 15 minutes on our install; the delay is set in the Settings). Save often: CA warns that Terry sometimes crashes.

My tile doesn't show in the tile map: what should I check?

The explicit_tiles line: x,y in pixels of tile_map.png, x from the left, y from the top, at the top-left corner of the vista's black square; a path starting from terrain/, with forward slashes, to the tile's folder; the final 0. Then run Process with BOB on the tile map and reload it in Terry, as the tutorial says. Finally, read bob_warnings.log, in the kit's binaries folder.

The armies deploy in the wrong place: why?

Check the Alliance ID of both deployment zones: 0 for the attacker, 1 for the defender, whatever their colour. Each zone has its additive Deployment Zone Region, Zone ID at 0. Then redo the BOB run on the tile and put its files back into the pack.

Where can I find a vista?

The Warhammer III kit ships none. The tw-modding tutorial for Warhammer III provides some, taken from Warhammer II; the same wiki's Custom Vistas page, written for Warhammer II, explains how to make one from those in the Warhammer II kit (raw_data/terrain/vistas). From a vista you take tile_map.png and climate_map.png, which you place in your tile map's folder.

This guide as plain text (Markdown), for AIs and offline reading

This is a community guide

A mistake, a pitfall you hit, a tip or a newer tool version: tell us, and every correction will be checked, then added with its source.

Suggest an idea
↑ Contents