# Defining Units¶

A world can have the following types of units:

• Critters: Animals that will move around the map at random

• Immovables: Trees, rocks, artifacts and eye candy

• Resources: Mineable map resources like fish, water, coal, …

• Terrains: The base of the landscape. Meadows, mountains, water…

The definitions for the world’s units are located in the subdirectories of data/world. Each unit needs to have an init.lua file, which will load the unit to be used in the game.

Each init.lua file needs to have a matching register.lua file that will list the names of all units defined in the init.lua, and their attributes if they have any. This is needed for registering the objects before they are loaded. For a given init.lua:

push_textdomain("world")

wl.Descriptions():new_immovable_type{
name = "alder_summer_sapling",
...
}

wl.Descriptions():new_immovable_type{
name = "alder_summer_pole",
...
}

wl.Descriptions():new_immovable_type{
name = "alder_summer_mature",
...
}

wl.Descriptions():new_immovable_type{
name = "alder_summer_old",
...
}

pop_textdomain()


The matching register.lua would look like this:

return {
alder_summer_sapling = { "tree_sapling" },
alder_summer_pole = {},
alder_summer_mature = {},
alder_summer_old = { "tree" }
}


Note that alder_summer_pole and alder_summer_mature in this example have no attributes, so their attribute tables are empty.

Every unit defined by an add-on needs to define exactly one of the special attributes __skip_if_exists or __replace_if_exists. This attribute determines how the engine proceeds if a description of the same name has already been registered. Units not contained in an add-on may not use these attributes.