|
Ground of Aces Modding
|
A mod can give the game's objects a new look without changing what they do: a chair that is still a chair, a tree that still gives wood, a kitchen that still cooks - drawn with your own model, your own textures and your own icon in the build menu. It can also re-paint the ground types the terrain is drawn with.
Two folders in the mod hold the art:
Art is different from every other kind of mod content in one way: it is imported once, when the game starts. Changing a model, a texture, a thumbnail or a biome PNG takes a restart of the game - neither loading a level nor Refresh or the Enabled switch in the Mods window re-imports it.
Objects/ and Biomes/. A future update adds an option to reload mods from the main menu, which will make the restart unnecessary.A model's file name is the id of the object it replaces. Four kinds of object share the one folder, and their ids never overlap:
| Kind | Where the ids come from | Examples |
|---|---|---|
| Objects you place from the build menu | the ID column of BuildingComponents.csv | Chair, Shelf, WoodenChair |
| Workbenches | the list below | FieldKitchen, SawStation |
| Training objects | the list below | ShootingSimpleTargetRange |
| Map objects - trees, rocks, ponds and other harvestables | the ID column of MapObjects.csv | tree, bush_big, large_rock |
Workbenches: FieldKitchen, IndoorKitchen, SawStation, Brickstation, CementMixer, MetalworksWorkbench, CanningStation, ElectronicsWorkbench, TailorStation, EspionageRadio, WaterCooker, HerbDryer, Distillery.
Training objects: BombingAdvancedSimulator, BombingSimpleBench, EnduranceAdvancedBikeExerciser, EnduranceSimpleRack, EngineeringAdvancedEngine, EngineeringSimpleMechanicWorkstation, FlyingAdvancedLinkTrainer, FlyingSimpleWoodenConstruction, NavigationAdvancedNaviTrainer, NavigationSimpleBoard, ShootingAdvancedTurret, ShootingSimpleTargetRange.
Ids are matched without regard to case, so chair.fbx re-dresses the chair too.
The id of every build menu object, workbench and training object a mod can re-dress is listed on Moddable objects.
Every file that belongs to one object follows the pattern <objectId>[.<variant>][.destroyed|.thumbnail] before its extension:
| File | What it is |
|---|---|
Chair.fbx or Chair.glb | the chair's model |
Chair.destroyed.fbx | the model the chair switches to when it is destroyed |
Chair.thumbnail.png | the chair's icon in the build menu |
tree.2.glb | variant 2 of the map object tree only |
tree.glb | every variant of tree that has no file of its own |
.glb (binary glTF) or .fbx. When both exist for the same object, the .glb is used and the .fbx is reported in the log as ignored.0: tree.0 is the first variant of tree, tree.1 the second.tree.2, never tree.02. This is also why Blender's duplicate names such as Chair.001.fbx are refused - rename the export.config.json is reported in the log and ignored.Objects/ holds every model and every texture of the mod, and you may sort them into subfolders as you like. Subfolder names mean nothing: a file is known by its name alone. Objects/Chair/model.fbx is a model for an object called model, not for the chair - name it Objects/Chair/Chair.fbx instead.
Because the folder is one pool, two files with the same name in different subfolders clash: the game keeps one and reports the other. Symbolic links and junctions are never followed.
There is no TerrainObjects/ folder any more. Map objects are re-dressed from Objects/ like everything else, and a mod whose only content is a TerrainObjects/ folder is not noticed at all.
LOD0, LOD1, LOD2, … (any case; LOD1_Trunk and lod2.001 count too) and they become its levels of detail, switched at the same distances as the built-in object's. With fewer levels than the built-in object, the last one is kept up to the distance where the object disappears. A model without LOD names is drawn the same at every distance. Levels only switch on an object that has levels of detail built in. On any other object every LOD part is drawn at once, one on top of the other - give such an object a single level.The game reads an FBX itself, without the Unity editor, so it understands a narrower part of the format than Blender writes:
Textures are PNGs anywhere in Objects/, found by their names. There are three ways to name them, tried in this order - each fills only what the one before leaves empty:
| Name the PNG after | Example | Needs a model | |
|---|---|---|---|
| 1 | the material in your model: <material>_BaseMap_<tile>, <material>_Specular_<tile> | BedMetal_Toon-Main_BaseMap_1001.png for a material called BedMetal_Toon-Main | yes |
| 2 | the texture your model's material uses | wood-01.png for a material painted with wood-01 | yes |
| 3 | a built-in texture of the game (Re-painting an object without a model) | BedMetal_Toon-Main_BaseMap_1001.png | no |
Way 1 is the simplest for a model: no image has to be connected to the material in Blender at all - name the material and the PNGs alike. Ways 1 and 3 belong to the game's material (see Game material or your own - config.json): with "UseGameMaterial": false your model keeps its own material and draws only the texture it names (way 2), without specular maps or UDIM tiles (see UDIM tiles and specular maps).
A model's materials name the images they use, and the game looks for a PNG of that name anywhere in Objects/. A material that uses an image called wood-01 gets Objects/wood-01.png (or Objects/any/subfolder/wood-01.png). Directories and the extension in the name the model carries are dropped first, so a material painted with C:\art\wood-01.jpg still finds wood-01.png. One PNG can serve any number of models, and is loaded only once.
The two formats differ in what happens when no PNG matches:
.glb | .fbx | |
|---|---|---|
| Texture slots read | base colour, metallic-roughness, normal, occlusion, emissive | base colour, normal (or bump), emissive |
No PNG of that name in Objects/ | the image embedded in the glb is used | the slot stays untextured, and the log names the texture it looked for |
| Images outside the file | refused - a glb has to be self-contained | never read - only the PNGs in Objects/ count |
Any PNG in Objects/ whose name does not end in .thumbnail counts as a texture. A texture neither a model nor a built-in object names is simply never loaded.
A PNG named like one of the game's own textures replaces that texture, with no model needed: Objects/BedMetal_Toon-Main_BaseMap_1001.png re-paints the metal bed wherever the game draws it. The replacement goes into every material slot that uses the built-in texture - base map, specular map or UDIM tile - on every object that uses it, the destroyed look included. Only the object's own art is re-painted: what every object shares - the construction crate, placement markers, range indicators - keeps the built-in texture, and so do airplanes (see New airplane skins) and the ground (see Biomes - the ground types). The game's texture names follow the pattern <Material>_Toon-Main_BaseMap_<tile> and <Material>_Toon-Main_Specular_<tile>; paint over the built-in image at the same size and UV layout, since the model stays the built-in one. Every object's texture names, and the slot each one sits in, are listed on Built-in texture names.
When two mods ship the same name, the one later in the load order wins.
A model on the game's material (see Game material or your own - config.json) can spread its UVs over up to three UDIM tiles, the way the game's own art does, with a specular map per tile. For a material called Crate:
| Base colour | Specular | Used for UVs with U in |
|---|---|---|
Crate_BaseMap_1001.png | Crate_Specular_1001.png | 0 to 1 |
Crate_BaseMap_1002.png | Crate_Specular_1002.png | 1 to 2 |
Crate_BaseMap_1003.png | Crate_Specular_1003.png | 2 and above |
Crate_Specular_1001.png._ or a .: crate_1001 and crate.1001 both start a set, and a Blender image saved as a tile set, crate.<UDIM>.png, finds crate.1001.png. The specular map is the same name with _BaseMap replaced by _Specular, so it needs a texture name with _BaseMap in it.1001 base colour has at least one further tile; a single texture is drawn as before. A missing tile in between draws white.config.jsonBy default a re-dressed object is drawn with the game's own material for that object, carrying over your model's base colour texture and base colour. That is what makes battle damage, and every other effect the game paints onto an object while it plays, show on your model as well. The normal, metallic-roughness, occlusion and emissive maps of your model are not used on this path; its specular map and UDIM tiles are (see UDIM tiles and specular maps).
To keep the material exactly as you authored it instead, switch it off for that object in Objects/config.json - the only config.json read, directly inside Objects/:
tree also covers tree.2, unless tree.2 has an entry of its own."UseGameMaterial": false keeps its full physically based look, and does not show battle damage.false, a material that has no base colour texture uses the game's material anyway, keeping the colour you gave it. So does a glb material that is not a standard metallic-roughness material - an unlit or a specular-glossiness one.config.json the game cannot read is reported, and every object falls back to the default.<objectId>.thumbnail.png replaces the object's icon in the build menu and everywhere else that icon is shown.
The terrain is painted with a fixed set of ground types, numbered from 0 - the same numbers as the rows of the Biomes table on Changing game data with a CSV mod (0-23). Biomes/<number>.png re-paints one of them, on every map:
8.png, not 08.png). A number beyond the game's range is reported in the log together with the valid range.Biomes/ count. Subfolders, other file types and other names are reported and ignored.Biomes table on Changing game data with a CSV mod; this folder changes only how it looks.Every file in Objects/ and Biomes/ is checked before it is loaded:
| File | Largest size | Largest file |
|---|---|---|
Model (.glb, .fbx) | - | 32 MB |
| Texture | 4096 × 4096 | 10 MB |
| Thumbnail | 512 × 512 | 10 MB |
| Biome | 4096 × 4096 | 10 MB |
.png is refused.For every object id and every ground type, the mod applied last wins, following the load order on How mods work. The log says which mod overrode which. Objects are decided as a whole: one mod's model is never combined with another mod's thumbnail for the same object.
The game logs every file it refused and why - the wrong name pattern, a missing texture, an oversized image - on lines that start with [Mod <your mod id>]. Where to find the log is on How mods work; the detailed lines appear in development builds and in the Unity editor.