v50 Steam/Premium information for editors
  • v50 information can now be added to pages in the main namespace. v0.47 information can still be found in the DF2014 namespace. See here for more details on the new versioning policy.
  • Use this page to report any issues related to the migration.
This notice may be cached—the current version can be found here.

Difference between revisions of "Modding"

From Dwarf Fortress Wiki
Jump to navigation Jump to search
(wrapping the whole chunk of code in a pre tag to make it easier to read)
 
(111 intermediate revisions by 35 users not shown)
Line 1: Line 1:
{{Quality|Exceptional|14:13, 7 November 2013 (UTC)}}
+
{{migrated article}}
 +
{{Quality|Fine}}
 
{{av}}
 
{{av}}
{{catbox|DF2014:Modding}}
+
{{For/see|a list of Dwarf Fortress mods|[[List of mods]]}}
 +
{{Modding}}
 +
'''Modding''', or creating [[mod]]s, refers to modifying the behavior of the base game (vanilla). ''Dwarf Fortress'' is remarkably moddable.
 +
 
 +
== Resource Overview==
 +
[[File:modding_icon.png|120px|right]]This section serves as a portal to all modding-related pages on the wiki.
 +
 
 +
; Using Mods:
 +
* [[Mod#Installing Mods|Installing mods]]
 +
* [[Mod#Enabling Mods|Enabling mods in-game]]
 +
 
 +
; Guides and references:
 +
* [[Modding guide|DF RAWs modding guide]]
 +
* [https://docs.dfhack.org/en/latest/docs/guides/modding-guide.html#dfhack-modding-guide DFHack modding guide]
 +
* [[Modding pitfalls]] for troubleshooting
 +
 
 +
* [[Mod#Mod Format|Mod Format]] and [[Game folders and files]]
 +
* [[Mod#Publish on Steam Workshop|Publish on Steam Workshop]]
 +
* [[Memory hacking]], [[Main:Offset Finding Methods|Offset Finding Methods]]
 +
* [[Character table]]
 +
 
 +
; Where to get help?
 +
* This [http://www.bay12forums.com/smf/index.php?board=13.0 forum] is the official DF subforum dedicated to discussions about modding.
 +
* [https://discord.com/channels/329272032778780672/629902895138996264 Kitfox modding discord]
 +
* [https://docs.dfhack.org/en/stable/docs/Introduction.html#getting-help DFhack questions]
 +
 
 +
; Modding tools
 +
There are several [[Utilities#Modding_tools|utilities]] that assist in modding efforts. There is [http://www.bay12forums.com/smf/index.php?topic=28829.0 a list of them] on the [[Bay 12 Forums]].
 +
* Text Editors are used in all areas of modding. Use a good text editor to edit files and search into multiple files (like the free [https://notepad-plus-plus.org/ Notepad++] for example) or more advanced editors capable of highlighting and formatting the displayed text (like [[Utilities#DF_RAW_Language_server|DF RAW Language server]])
 +
* Image Editor will be needed for doing custom graphics. [https://www.getpaint.net/ Paint.NET], Photoshop and GIMP are the most used, but whatever supports the .png format will work.
 +
 
 +
=== Documentation===
 +
; [[Raw file]]s
 +
 
 +
These object files, stored in <code>/data/vanilla/*/objects/</code>, define various specifics of game items, materials, and creatures, and can be changed using mods to alter how the game behaves. These are text based and can be edited with any text editor, however, editing the vanilla raw files is now discouraged.
 +
 
 +
See [[Token|Token reference]] - It's always good to refer to tokens on the wiki. Even experienced modders have to look up tokens! A list of articles about tokens can be found here.
 +
 
 +
; [[Graphics|Graphics Files]]:
 +
 
 +
The `/data/art/` subfolder of Dwarf Fortress is used to store user-customizable graphics sets.
 +
 
 +
; [[Reaction]]s:
 +
 
 +
; [[Language token|Language]] and [[Speech file]]:
 +
 
 +
; [[Audio|Sound and Music files]]:
  
{{For/see|a list of Dwarf Fortress mods|[[List of mods]]}}
+
All sound and music files used by ''Dwarf Fortress'' are stored in the [https://en.wikipedia.org/wiki/Ogg .ogg] format within the <code>/data/sound/</code> subfolders. You can replace the existing ogg files with different ones. That has to be performed manually and isn't actually supported by the game. You can also change some of the definitions of when certain musical cues are played, using available [[music token]]s and [[sound token]]s in the raw files. However, you can't add new music or sounds other than replacing what's already there.
  
'''Modding''' refers to modifying the game's files. ''Dwarf Fortress'' is remarkably moddable.
+
=== Best practice ===
 +
The current best practice is to not modify the original raw files, since most modifications can be made via mods. Mods can add new objects, add tokens to existing objects, and cut objects entirely. You should prefer SELECT over CUT, and prefer CUT over not loading vanilla raws.
  
 
== Guide ==
 
== Guide ==
Line 15: Line 63:
  
 
=== Token reference ===
 
=== Token reference ===
 +
It's always good to refer to tokens on the wiki. Even experienced modders have to look up tokens! A list of articles about tokens can be found [[Token|here]].
 +
 +
=== Basics of DF modding ===
 +
To make a mod, one must put a folder into the <code>/mods/</code> folder. The vast majority of modifications to the game can be done via this method. This folder should contain a file named "info.txt" and two subfolders: "graphics" (where you insert [[Graphics set repository|graphics sets]]), and "objects", which contains all the data for, generally, everything in the game that is not hardcoded.
  
It's always good to refer to tokens on the wiki. Even experienced modders have to look up tokens! A list of articles about tokens can be found [http://dwarffortresswiki.org/index.php/Token here].
+
The [[info.txt]] is formatted like so:
  
=== Basics of DF modding ===
+
{{code|
 +
[ID:my_first_mod]
 +
[NUMERIC_VERSION:1]
 +
[DISPLAYED_VERSION:1.0.0]
 +
[EARLIEST_COMPATIBLE_NUMERIC_VERSION:1]
 +
[EARLIEST_COMPATIBLE_DISPLAYED_VERSION:1.0.0]
 +
[AUTHOR:Your Name Here]
 +
[NAME:My First Mod]
 +
[DESCRIPTION:A cool mod I made!]
 +
}}
  
All the base data that can be edited by prospective modders can be found in the \raw\ folder. This folder contains two subfolders: "graphics" (where you insert [[Graphics set repository|graphics sets]]), and "objects", which contains all the data for generally everything in the game that is not hardcoded.
+
A mod should have all of these. There are a [[mod info token|few more tokens]], but the above are the important ones.
  
Within the \raw\objects folder are a large number of text files - these are the [[raw file|raw files]], and editing them is quite easy - you can also create your own if you wish. For now, take a look at one of the existing files. For example if you open creature_standard.txt it should look something like this:
+
Most of the game's vanilla content is in the same format as mods. Many text files can be found in the subfolders of the <code>/data/vanilla</code> folder - these are the [[raw file|raw files]], and using them as a basis for modification is quite easy. For now, we will take a look at one of the existing files. For example, if you open <code>/data/vanilla/vanilla_creatures/creature_standard.txt</code>, it should look something like this:
  
 +
{{code|
 
  creature_standard
 
  creature_standard
 
   
 
   
Line 35: Line 97:
 
     [CREATURE_SOLDIER_TILE:2]
 
     [CREATURE_SOLDIER_TILE:2]
 
  ...
 
  ...
 +
}}
 +
 +
As you can see, each file comprises a header string stating the file name, a second header stating the type of object data it contains, followed by the contents of the file itself. These are all necessary elements of the file, and without them, the file will be ignored by the game.
 +
 +
'''In other words, to be recognized by the game, a raw file must have all of the following:'''
  
As you can see, each file comprises a header string stating the file name, a second header stating the type of object data it contains, followed by the contents of the file itself. These are all necessary elements of the file, and without them, the file won't be parsed correctly by the game. You may have also noticed the file naming scheme - this is also important; files containing creatures have names starting with "creature_", entity file names must begin with "entity_", etc..
+
# A filename that refers to the type of objects contained therein. '''Creature files must start with creature_, entity files must start with entity_, and so on.'''
 +
# The filename on the first line of the file.
 +
# [OBJECT:type], where "type" is replaced with the relevant object type.
  
Below the headers, there begins a list of entries. Each entry is made up of its own header (in this case, "[CREATURE:DWARF]"), again stating the type of object, and then the object's unique identifier - if an identifier isn't unique, the game will mess up and you'll get some serious, and potentially very trippy, errors. Below that, we have the body of the entry, which determines the entry's specific properties.
+
Below the headers, there begins a list of entries. Each entry is made up of its own header (in this case, "[CREATURE:DWARF]"), again stating the type of object, and then the object's unique identifier - if an identifier isn't unique, the game will mess up and you'll get some serious, and potentially very trippy, errors. ([[Duplicated raws|For example...]])  Below that, we have the body of the entry, which determines the entry's specific properties.
  
 
The body of an entry is made up of a series of "tokens", which are essentially flags that can be added or removed to affect the entry's attributes. Most of these effects are hardcoded: for example, it's possible to make a creature only eat meat with the [CARNIVOROUS] token, but it's impossible to create your own token detailing a specific diet for the creature.
 
The body of an entry is made up of a series of "tokens", which are essentially flags that can be added or removed to affect the entry's attributes. Most of these effects are hardcoded: for example, it's possible to make a creature only eat meat with the [CARNIVOROUS] token, but it's impossible to create your own token detailing a specific diet for the creature.
Line 44: Line 113:
 
Before we continue, a few key things to remember when modding the raw files:
 
Before we continue, a few key things to remember when modding the raw files:
  
* Try to avoid modifying the existing raw files when adding objects. It makes removing mods far easier.
+
* Try to avoid modifying the existing raw files when possible. You should make a mod instead!
* When adding files, all you need to include to ensure proper references are maintained is the token identifiers.  The game will load up all *.txt files in the raw folder, and searches through them by tokens.  For example, you can add a new pair of leather boots and not even have to add it to the item_shoes.txt file, but rather make your own file, say item_shoes_new.txt and ensure you have the token listed, ex. [ITEM_SHOES:ITEM_SHOES_BOOTS_NEW].
+
* When adding files, token identifiers are all you need to include to ensure proper references are maintained.  The game searches through all loaded raw files by tokens.  For example, you can add a new pair of leather boots and not even have to add it to a file named item_shoes.txt, but rather your own file, say item_shoes_new.txt and ensure you have the token listed, ex. [ITEM_SHOES:ITEM_SHOES_BOOTS_NEW].
 +
 
 +
* When a new world is generated, the mods included are "baked in" and cannot be modified except to be updated--for this, the game checks that the mod used by the save is of a compatible NUMERIC_VERSION.
 +
* There's nothing stopping you from just copying an existing creature/entity/whatever, changing the identifier, and modifying it. This can save you a lot of time, especially when it comes to entities.
  
* If you want to edit an already-existing creature, always back up the files you plan on editing to a different location. Since v0.31.22, the game no longer loads backup files with an extension other than ".txt", but duplicate entries are still a very bad thing.
+
=== Modifying the vanilla objects ===
* When a new world is generated, all the raw files get copied into a \raw\ folder within the applicable save folder. If you want to change something within a world that's already been generated, you'll have to edit those files, not the ones in ~DF\raw\objects.
+
 
* There's nothing stopping you from just copying an existing creature/entity/whatever, changing the identifier, and modifying it. This can save you a lot of time, especially when it comes to entities... which are coincidentally what we'll be talking about next.
+
You should not modify the vanilla raws where they originally are if you can help it. Instead, patch them using the patching functions provided with ''Dwarf Fortress'' since v50.01.
 +
 
 +
There are two patching functions: SELECT and CUT. When SELECT is used, it lets you make changes to an object without needing the entire entry to be present in your mod file. When CUT is used, it forces the game to not use that object, even though it is still found in the vanilla raws (or in any other mods earlier in the load order). Both of these functions take the form of tokens. These functions are not universally applicable to any token found in any entry, just the following list of objects:
 +
 
 +
CREATURE, ENTITY, INTERACTION, ITEM, WORD, TRANSLATION, SYMBOL, INORGANIC, PLANT, MUSIC, REACTION, SOUND
 +
 
 +
The syntax required for these functions is: '''['''<function>'''_'''<object>''':'''<specific object being affected>''']'''. For instance, [CUT_PLANT:MUSHROOM_HELMET_PLUMP] cuts the plump helmet object in the vanilla file plant_standard.txt, so the game will not use that object at all. However, [SELECT_ITEM_HELM:ITEM_HELM_HELM] does not select the helm object from the vanilla file item_helm.txt, even though that's how the object appears in that file, because there is no [SELECT_ITEM_HELM] token. Instead, the helm would be selected with [SELECT_ITEM:ITEM_HELM_HELM].
 +
 
 +
For example, if you wanted to mod beards onto dwarven women while also removing elephants from the game:
 +
 
 +
{{code|
 +
creature_mypatch
 +
 
 +
[OBJECT:CREATURE]
 +
 
 +
[SELECT_CREATURE:DWARF] starts editing DWARF from the end of the entry
 +
    [SELECT_CASTE:FEMALE]
 +
        [BODY_DETAIL_PLAN:FACIAL_HAIR_TISSUE_LAYERS]
 +
 
 +
[CUT_CREATURE:ELEPHANT] removes the ELEPHANT creature
 +
}}
 +
 
 +
Or, say, add your own reaction and building to dwarves:
 +
 
 +
{{code|
 +
entity_mypatch
 +
 
 +
[OBJECT:ENTITY]
 +
 
 +
[SELECT_ENTITY:MOUNTAIN]
 +
    [PERMITTED_REACTION:MY_REACTION]
 +
    [PERMITTED_BUILDING:MY_BUILDING]
 +
}}
 +
 
 +
And in any of these, one can add the token [LOG_CURRENT_ENTRY] somewhere under one of the objects of the file, which logs the full contents of the object in question to logs\current_entry.txt. This can be useful to make sure that the patch is doing what you think it is. For instance if [LOG_CURRENT_ENTRY] were added on the next line after [CREATURE:DWARF] in your mod file, then the dwarf object would be the object detailed in the log entry.
 +
 
 +
...Speaking of, let's move on to modifying and adding entities.
  
 
=== Modding civilizations (entities) ===
 
=== Modding civilizations (entities) ===
  
Entities - the objects that determine how civilizations work - are stored in entity_default.txt (though, like all other files, you may add more). They follow the same format as any other raw file:
+
Entities - the objects that determine how civilizations work - are stored in <code>vanilla_entities/entity_default.txt</code> (though, like all other files, you may add more). They follow the same format as any other raw file:
  
 +
{{code|
 
  entity_default
 
  entity_default
 
   
 
   
Line 62: Line 171:
 
     [CREATURE:CREATURETYPE]
 
     [CREATURE:CREATURETYPE]
 
     [TRANSLATION:LANGUAGETYPE]
 
     [TRANSLATION:LANGUAGETYPE]
     [BIOME_SUPPORT:BIOMETOKEN:FREQENCY]
+
     [BIOME_SUPPORT:BIOMETOKEN:FREQUENCY]
 
     ...[OTHER TAGS]...
 
     ...[OTHER TAGS]...
 +
}}
  
 
Most of the time, it doesn't matter which order these tokens are in or where they're placed so long as they're below the "ENTITY:" identifier, but there are some important exceptions in the case of other files, especially creatures, which can contain a lot of "nested" tokens.
 
Most of the time, it doesn't matter which order these tokens are in or where they're placed so long as they're below the "ENTITY:" identifier, but there are some important exceptions in the case of other files, especially creatures, which can contain a lot of "nested" tokens.
  
"[CREATURE:]" links the civilization with a specific creature defined in a creature file. This is the creature that'll be making up the entity's population, and will therefore be the creature you'll be playing as in fortress or adventure mode if the entity is a playable one. For example, if you wanted to do something silly, you could switch the "CREATURE:DWARF" entry in entity_default.txt with "CREATURE:ELF" and you would be marching elves around in fortress mode, although they would still use dwarven technology and language and names and so forth.
+
"[CREATURE:]" links the civilization with a specific creature defined in a creature file. This is the creature that'll be making up the entity's population, and, therefore, the creature you'll be playing as in fortress or adventure mode if the entity is a playable one. For example, if you wanted to do something silly, you could switch the "CREATURE:DWARF" entry in entity_default.txt with "CREATURE:ELF" and you would be marching elves around in fortress mode, although they would still use dwarven technology, language and names and so forth. Oh, and before you get any funny ideas - it ''is'' possible to define more than one creature for a civ, but that won't work in quite the way you probably expect; it will pick only one of the defined creatures at random to use for the civ. Later on, in the creature section, you'll learn about castes, which will provide a much more viable alternative, so try to bear with us until then.
 
 
Oh, and before you get any funny ideas - it ''is'' possible to define more than one creature for a civ, but that won't work in quite the way you probably expect; later on, in the creature section, you'll learn about castes, which will provide a much more viable alternative, so try to bear with us until then.
 
  
 
"[TRANSLATION:]" defines the language file that the entity will be using, which will determine what their untranslated words are for things. This doesn't determine which words they use for naming things, only the way those words are spelled. The default language files are HUMAN, DWARF, ELF, and GOBLIN.
 
"[TRANSLATION:]" defines the language file that the entity will be using, which will determine what their untranslated words are for things. This doesn't determine which words they use for naming things, only the way those words are spelled. The default language files are HUMAN, DWARF, ELF, and GOBLIN.
Line 75: Line 183:
 
"[BIOME_SUPPORT:]" defines the biomes that civs will attempt to settle in. The "FREQUENCY" value determines the likelihood of them building there, but also raises an important point: most of the values you'll be setting for things are relative to each other. If one were to type:
 
"[BIOME_SUPPORT:]" defines the biomes that civs will attempt to settle in. The "FREQUENCY" value determines the likelihood of them building there, but also raises an important point: most of the values you'll be setting for things are relative to each other. If one were to type:
  
 +
{{code|
 
  [BIOME_SUPPORT:ANY_FOREST:1]
 
  [BIOME_SUPPORT:ANY_FOREST:1]
 
  [BIOME_SUPPORT:SAVANNA:2]
 
  [BIOME_SUPPORT:SAVANNA:2]
 +
}}
  
 
This would have very much the same effect as:
 
This would have very much the same effect as:
  
 +
{{code|
 
  [BIOME_SUPPORT:ANY_FOREST:5]
 
  [BIOME_SUPPORT:ANY_FOREST:5]
 
  [BIOME_SUPPORT:SAVANNA:10]
 
  [BIOME_SUPPORT:SAVANNA:10]
 +
}}
  
 
This holds true for a lot of values throughout the files, excluding when it simply doesn't make sense, such as in materials.
 
This holds true for a lot of values throughout the files, excluding when it simply doesn't make sense, such as in materials.
  
You can find many details about the rest of the civilization tokens [[entity token|here]]. Besides those mentioned, some fundamental ones are the CIV_CONTROLLABLE token, which lets you control the civ in fortress mode, the INDIV_CONTROLLABLE token, which allows you to play the civ in adventure mode as an outsider, and the ADVENTURE_TIER token, which allows you to play a civ native (non-outsider) in adventure mode. Other tokens that you should pay attention to are START_BIOME and the ones regarding sites, but in general, you can just run through the aforementioned list and add or remove what you want.
+
You can find many details about the rest of the civilization tokens [[entity token|here]].  
  
If you have more than one civ with the CIV_CONTROLLABLE token, all the available civs from those entities will appear in the group selection section on the embark screen. It may not be immediately obvious from which species each civ may be - while this can be determined from legends mode, the topmost species in the "neighbors" display in the embark screen is always the same as the currently selected species; if your group is dwarven, dwarves will be topmost, whilst (say) elves will be topmost if your chosen group is elven. By default, the game seems to choose a civ (and therefore a species if there is more than one) at random.
+