Dwarf Fortress

Dwarf Fortress

41 ratings
Modding - Custom Workshops and You
By Kungfufishstick
This guide will go over modding in a custom workshop.

We will cover declaring your workshop, graphics creation, graphics breakdown, custom structure declaration, reactions, adding to an existing creature and finally pulling everything together by adding your new workshop and reaction to the dwarf entity so you can build the workshop and craft your new recipe.
4
3
2
   
Award
Favorite
Favorited
Unfavorite
Introduction
My memory is not great so I tend to write in-depth guides like I'm trying to teach myself how to mod before I learned how.

This started off as a personal reference I made to try and get everything I needed put together so I didn't have to look in so many places for each bit of information. It ended up becoming this guide and I hope it helps.

I figured it would be nice to have steam guides about modding since Dwarf Fortress Classic has modding guides on the wiki.

In this guide I am going walk you through creating a custom workshop from scratch and adding it to Dwarf Fortress.


Guide Goal


This guide is geared towards actually creating a new workshop from scratch. Everything from custom graphics to adding it to the dwarf entity.

If you are looking to just add to the vanilla workshops in the game already, this guide should have enough information to point you in the right direction, but that isn't the actual goal of this guide.

I'm new to modding so if anything is not quite right or is completely wrong, let me know so I can make adjustments.

This is made to teach someone new to modding. If you aren't understanding something, use a search engine to do your own research. I also provide plenty of links to the dwarf fortress wiki.

Struggling to understand something is the first step to knowing something well. That is a big part of why I decided to make this a guide. It helps me study what I have learned and maybe help someone learn to mod the game in the process.

Don't be afraid to break things in your mod. If something breaks, figure out why and how you can fix it.


Mod File Editing


Finally, a pretty simple way to create and edit your files is by using Visual Studio Code. You can get an extension called Dwarf Fortress RAW that has syntax highlighting and good checking to make sure your mod files are looking good before you attempt to test them.

Happy modding!
Where Does My Mod Go?
To start this all off, a mini guide on where to put your mod when you are working on it and where it goes when you are ready to upload it to steam. Bay 12 has a short guide on this on their website.[bay12games.com]

For this guide we will be making a theoretical mod named Boozer.

When you are first creating and working on your mod, you will want to make a folder with your mod's name in the mods folder. For our example it will look like this:

steamapps\common\Dwarf Fortress\mods\Boozer


info.txt


Inside of the Boozer folder, you will want to create a new folder named objects and a new text file named info.txt.

Here is a the layout for the info.txt file. I left the fields blank so you can copy and paste it into your own info.txt.

[ID:] [NUMERIC_VERSION:] [DISPLAYED_VERSION:] [EARLIEST_COMPATIBLE_NUMERIC_VERSION:] [EARLIEST_COMPATIBLE_DISPLAYED_VERSION:] [AUTHOR:] [NAME:] [DESCRIPTION:] [STEAM_TITLE:] [STEAM_TAG:]


info.txt Example


For our Boozer mod, our info.txt file will look something like this:

[ID:boozer] [NUMERIC_VERSION:1] [DISPLAYED_VERSION:1.0] [EARLIEST_COMPATIBLE_NUMERIC_VERSION:1] [EARLIEST_COMPATIBLE_DISPLAYED_VERSION:1.0] [AUTHOR:Kungfufishstick] [NAME:Boozer] [DESCRIPTION:DF, now with more booze.] [STEAM_TITLE:Boozer] [STEAM_TAG:mod] [STEAM_TAG:brewing] [STEAM_TAG:booze]


Steam ID?


STEAM_FILE_ID is not needed when you first start to make your mod. This will automatically be added to your info.txt file when you successfully upload the mod to steam. When it is finally added to your info file, you need to make sure you include that line in your info file from there on out.

You wont get an ID until you actually place the mod folder into the mod_upload folder and use the Mod menu from the main menu of the game to upload the mod.


Mod Testing


One last thing before we get this guide under way. As you work on your mod, any changes will not show up in a pre-existing world generation.

Since the game does not currently have an object testing arena, the only way to test changes is create a new world and add your mod every time. You also have to close the game and reopen it for it to see the new mod changes.

Two options on this end are:

1. After closing the game and making your edits to your mod, go into the installed_mods folder and delete your mod. Reopen the game, create new world, add your mod, and start playing to test it.
2. Close the game. Save any mod changes and edit your mod's info.txt file to increase the NUMERIC_VERSION and DISPLAYED_VERSION. Reopen the game, create new world, add your mod to the game.





For the first time loading the game, click Mods from the main menu to make sure your mod name shows up on the list.

From the main menu you will click Create New World. On the world settings screen you need to click the Mods button.









If your info.txt file and other mod files are in order, your mod will show up and you can click the arrow next to the mod name to add it to the world generation.

I prefer to set the World Map Size to smaller and the History Length to 5 years so the game starts up fast.

If you test your mod frequently, you will want to delete old saves of generated worlds. The save folder can quickly balloon up in size if you aren't paying attention.

Lets get to it.
Declaring Our Custom Workshop
For this example we will use a custom workshop. For it to work you have to create a new text file in your mod's graphics\ folder. This is a theoretical mod so I will be using mod name in place of steam # for the mod. Name the text file something like:

tile_page_buildings_(mod name).txt


Our custom workshop is going to be called the Boozer's Workshop so our file is named:

tile_page_buildings_boozer.txt


Boozer Tile Definition


In the file declare your information. For our example we will use the following:

tile_page_buildings_boozer [OBJECT:TILE_PAGE] [TILE_PAGE:BOOZER] [FILE:image/boozer.png] [TILE_DIM:32:32] [PAGE_DIM_PIXELS:128x256]

Our graphic will only contain the image for a single custom workshop. Since it is declared with the tile dimensions of 32x32, the overall pixel size comes out to 128 pixels in height and 256 pixels in width.

All vanilla workshop graphics have their tile dimensions defined as 32x32. This represents a single grid square of your graphic.

A 3x3 workshop is just that, 3x3 grid squares of your workshop graphic. However, the game also accounts for a 4th row of tiles at the top of your graphic to provide you some room for structures from the workshop to stick out above the workshop area.
Understand By Seeing
If you use an image editor program, like GIMP, and load up the vanilla workshops.png in the vanilla_buildings_graphics\graphics\images folder, you can overlay the image with a grid to see what I mean.

If you don't have an image editor, go download GIMP. Its not so bad to pick it up and it's completely free.


Graphic Grid Overlay


GIMP comes with the ability to overlay a grid.

If you opened the vanilla workshops.png file in gimp, you can click on the workshops.png file in the layers panel in the bottom right, go up to the toolbar, click Image, and then click Configure Grid.




Set the spacing to 32.00 Horizontal and Vertical to 32.00 for pixels. Make any changes you want to the grid appearance and click OK.




Now you have to set it so the grid shows up. Go to View and click Show Grid.




You will see a dashed line grid overlay. The bottom of the the carpenter's workshop is right against the bottom of the 4th row of grid squares.


Creating Your Own Custom Workshop
To build your own workshop graphic, you count down to the 4th grid row. This is where the bottom of your workshop will begin. If you incorporate tile blocking in your custom workshop, it will only be used on the 3x3 grid space for the main workshop floor but not for the top row of your grid.

A 3x3 workshop will be 3 squares wide at the most.

You can do whatever you think looks good to you. The mod is yours so make it your own. I'm not sure about the rules involved with use of vanilla workshop graphics in your mod, but you can, and should, use them to line up your workshop on the grid.

NOTE: After some testing, I found that graphics I created for the Base would not take on the material color when the workshop was built. For some reason, only the exact color of the vanilla Base would take on the material color. Hopefully using the Base from the vanilla graphics is okay as long as you create your own overlay graphics.

Also use them as a guide for sizing things like tables and chairs. You can likely use their tools and other items as a reference as well. Just put some creativity into your mod and make it unique from the vanilla assets. Definitely give creating your own workshop graphics a shot.


Workshop Graphic Breakdown


A workshop graphic is broken down into the actual workshop floor (I'll call it the Base) and the Overlay.

The Base consists of the floor, tables, chairs, and any other structural components you want to setup for the workshop design.

The Overlay includes everything else that makes your workshop look nice and distinct. This can include tools, materials, boxes, debris, and so on to show what is worked on in the shop at a glance. Give your workshop some personality.


Workflow For Creating Workshop Graphics


What I like to do when I make a workshop is to create a layer group folder for Stage 3. I first create the Base of Stage 3 and create any furniture/structures I want for my shop. I make sure each piece of furniture or structure is on its own layer to allow for easy customization, reuse of graphics you worked so hard on, or removing them later on to change the workshop appearance.

I repeat this process using the vanilla workshop layouts as a reference for what to remove as I progress through each Stage graphic, down to the Pre-Build stage.

For the Pre-Build stage, just reference the vanilla workshops and come up with your own custom version. The Pre-Build stage is handled differently since it's a marker for the build site. The plus side to this is if you make more than one custom workshop you can re-use the Pre-Build graphic for every workshop.

NOTE: I just wanted to mention it again. For some reason no color I attempted to use for the Base would change color in game when the workshop was being built. Use the base that is present for the vanilla workshops (hopefully this is okay anyways) but make your Overlay custom.

After I have finished creating the look of each stage, I duplicate the Stage 3 folder. With everything in a folder, when you click the folder itself in the layers panel, you can move everything in that folder.

I move it over to where the Stage 3 Overlay will be (on the 3x3 grid next to the Pre-Build stage), create a new layer folder and name it Stage 3 Overlay. Make sure the Stage 3 Overlay group folder is above the duplicate Stage 3 folder so the layers you create in the overlay folder actually overlay the layers of Stage 3.

Now you create all of the tools and such that will be there when the workshop is finally built. This is just to help with aligning everything. Once you have your overlay finished, you will delete the duplicate Stage 3 folder, or click the eye shaped icon to hide it from view. I find just deleting it reduced file clutter in the layers panel. Besides, you can always just duplicate the Stage layer again if needed.

Rinse and repeat this for stage 2 and Stage 1. Remember to reference the look of things in the vanilla workshops.png file.
Tile Graphics Declaration
On to the tile graphics declarations.

You will want to create a new folder named graphics in your mod directory.

Using the Boozer's Workshop as an example, you would create a new text file in the following directory:

Dwarf Fortress\mods\Boozer\graphics\

Our file for Boozer will be named graphics_workshops_boozer.txt

The file will looks something like this:

graphics_workshops_boozer [OBJECT:GRAPHICS] graphics_workshops_boozer [OBJECT:GRAPHICS] [TILE_GRAPHICS:BOOZER:0:0:WORKSHOP_CUSTOM:BOOZER:3:0:0] [TILE_GRAPHICS:BOOZER:1:0:WORKSHOP_CUSTOM:BOOZER:3:1:0] [TILE_GRAPHICS:BOOZER:2:0:WORKSHOP_CUSTOM:BOOZER:3:2:0] [TILE_GRAPHICS:BOOZER:0:1:WORKSHOP_CUSTOM:BOOZER:3:0:1] [TILE_GRAPHICS:BOOZER:1:1:WORKSHOP_CUSTOM:BOOZER:3:1:1] [TILE_GRAPHICS:BOOZER:2:1:WORKSHOP_CUSTOM:BOOZER:3:2:1] [TILE_GRAPHICS:BOOZER:0:2:WORKSHOP_CUSTOM:BOOZER:3:0:2] [TILE_GRAPHICS:BOOZER:1:2:WORKSHOP_CUSTOM:BOOZER:3:1:2] [TILE_GRAPHICS:BOOZER:2:2:WORKSHOP_CUSTOM:BOOZER:3:2:2] [TILE_GRAPHICS:BOOZER:0:3:WORKSHOP_CUSTOM:BOOZER:3:0:3] [TILE_GRAPHICS:BOOZER:1:3:WORKSHOP_CUSTOM:BOOZER:3:1:3] [TILE_GRAPHICS:BOOZER:2:3:WORKSHOP_CUSTOM:BOOZER:3:2:3] [TILE_GRAPHICS:BOOZER:3:0:WORKSHOP_CUSTOM:BOOZER:2:0:0] [TILE_GRAPHICS:BOOZER:4:0:WORKSHOP_CUSTOM:BOOZER:2:1:0] [TILE_GRAPHICS:BOOZER:5:0:WORKSHOP_CUSTOM:BOOZER:2:2:0] [TILE_GRAPHICS:BOOZER:3:1:WORKSHOP_CUSTOM:BOOZER:2:0:1] [TILE_GRAPHICS:BOOZER:4:1:WORKSHOP_CUSTOM:BOOZER:2:1:1] [TILE_GRAPHICS:BOOZER:5:1:WORKSHOP_CUSTOM:BOOZER:2:2:1] [TILE_GRAPHICS:BOOZER:3:2:WORKSHOP_CUSTOM:BOOZER:2:0:2] [TILE_GRAPHICS:BOOZER:4:2:WORKSHOP_CUSTOM:BOOZER:2:1:2] [TILE_GRAPHICS:BOOZER:5:2:WORKSHOP_CUSTOM:BOOZER:2:2:2] [TILE_GRAPHICS:BOOZER:3:3:WORKSHOP_CUSTOM:BOOZER:2:0:3] [TILE_GRAPHICS:BOOZER:4:3:WORKSHOP_CUSTOM:BOOZER:2:1:3] [TILE_GRAPHICS:BOOZER:5:3:WORKSHOP_CUSTOM:BOOZER:2:2:3] [TILE_GRAPHICS:BOOZER:6:0:WORKSHOP_CUSTOM:BOOZER:1:0:0] [TILE_GRAPHICS:BOOZER:7:0:WORKSHOP_CUSTOM:BOOZER:1:1:0] [TILE_GRAPHICS:BOOZER:8:0:WORKSHOP_CUSTOM:BOOZER:1:2:0] [TILE_GRAPHICS:BOOZER:6:1:WORKSHOP_CUSTOM:BOOZER:1:0:1] [TILE_GRAPHICS:BOOZER:7:1:WORKSHOP_CUSTOM:BOOZER:1:1:1] [TILE_GRAPHICS:BOOZER:8:1:WORKSHOP_CUSTOM:BOOZER:1:2:1] [TILE_GRAPHICS:BOOZER:6:2:WORKSHOP_CUSTOM:BOOZER:1:0:2] [TILE_GRAPHICS:BOOZER:7:2:WORKSHOP_CUSTOM:BOOZER:1:1:2] [TILE_GRAPHICS:BOOZER:8:2:WORKSHOP_CUSTOM:BOOZER:1:2:2] [TILE_GRAPHICS:BOOZER:6:3:WORKSHOP_CUSTOM:BOOZER:1:0:3] [TILE_GRAPHICS:BOOZER:7:3:WORKSHOP_CUSTOM:BOOZER:1:1:3] [TILE_GRAPHICS:BOOZER:8:3:WORKSHOP_CUSTOM:BOOZER:1:2:3] [TILE_GRAPHICS:BOOZER:9:0:WORKSHOP_CUSTOM:BOOZER:0:0:0] [TILE_GRAPHICS:BOOZER:10:0:WORKSHOP_CUSTOM:BOOZER:0:1:0] [TILE_GRAPHICS:BOOZER:11:0:WORKSHOP_CUSTOM:BOOZER:0:2:0] [TILE_GRAPHICS:BOOZER:9:1:WORKSHOP_CUSTOM:BOOZER:0:0:1] [TILE_GRAPHICS:BOOZER:10:1:WORKSHOP_CUSTOM:BOOZER:0:1:1] [TILE_GRAPHICS:BOOZER:11:1:WORKSHOP_CUSTOM:BOOZER:0:2:1] [TILE_GRAPHICS:BOOZER:9:2:WORKSHOP_CUSTOM:BOOZER:0:0:2] [TILE_GRAPHICS:BOOZER:10:2:WORKSHOP_CUSTOM:BOOZER:0:1:2] [TILE_GRAPHICS:BOOZER:11:2:WORKSHOP_CUSTOM:BOOZER:0:2:2] [TILE_GRAPHICS:BOOZER:9:3:WORKSHOP_CUSTOM:BOOZER:0:0:3] [TILE_GRAPHICS:BOOZER:10:3:WORKSHOP_CUSTOM:BOOZER:0:1:3] [TILE_GRAPHICS:BOOZER:11:3:WORKSHOP_CUSTOM:BOOZER:0:2:3] [TILE_GRAPHICS:BOOZER:12:0:WORKSHOP_CUSTOM_OVERLAY:BOOZER:3:0:0] [TILE_GRAPHICS:BOOZER:13:0:WORKSHOP_CUSTOM_OVERLAY:BOOZER:3:1:0] [TILE_GRAPHICS:BOOZER:14:0:WORKSHOP_CUSTOM_OVERLAY:BOOZER:3:2:0] [TILE_GRAPHICS:BOOZER:12:1:WORKSHOP_CUSTOM_OVERLAY:BOOZER:3:0:1] [TILE_GRAPHICS:BOOZER:13:1:WORKSHOP_CUSTOM_OVERLAY:BOOZER:3:1:1] [TILE_GRAPHICS:BOOZER:14:1:WORKSHOP_CUSTOM_OVERLAY:BOOZER:3:2:1] [TILE_GRAPHICS:BOOZER:12:2:WORKSHOP_CUSTOM_OVERLAY:BOOZER:3:0:2] [TILE_GRAPHICS:BOOZER:13:2:WORKSHOP_CUSTOM_OVERLAY:BOOZER:3:1:2] [TILE_GRAPHICS:BOOZER:14:2:WORKSHOP_CUSTOM_OVERLAY:BOOZER:3:2:2] [TILE_GRAPHICS:BOOZER:12:3:WORKSHOP_CUSTOM_OVERLAY:BOOZER:3:0:3] [TILE_GRAPHICS:BOOZER:13:3:WORKSHOP_CUSTOM_OVERLAY:BOOZER:3:1:3] [TILE_GRAPHICS:BOOZER:14:3:WORKSHOP_CUSTOM_OVERLAY:BOOZER:3:2:3] [TILE_GRAPHICS:BOOZER:15:0:WORKSHOP_CUSTOM_OVERLAY:BOOZER:2:0:0] [TILE_GRAPHICS:BOOZER:16:0:WORKSHOP_CUSTOM_OVERLAY:BOOZER:2:1:0] [TILE_GRAPHICS:BOOZER:17:0:WORKSHOP_CUSTOM_OVERLAY:BOOZER:2:2:0] [TILE_GRAPHICS:BOOZER:15:1:WORKSHOP_CUSTOM_OVERLAY:BOOZER:2:0:1] [TILE_GRAPHICS:BOOZER:16:1:WORKSHOP_CUSTOM_OVERLAY:BOOZER:2:1:1] [TILE_GRAPHICS:BOOZER:17:1:WORKSHOP_CUSTOM_OVERLAY:BOOZER:2:2:1] [TILE_GRAPHICS:BOOZER:15:2:WORKSHOP_CUSTOM_OVERLAY:BOOZER:2:0:2] [TILE_GRAPHICS:BOOZER:16:2:WORKSHOP_CUSTOM_OVERLAY:BOOZER:2:1:2] [TILE_GRAPHICS:BOOZER:17:2:WORKSHOP_CUSTOM_OVERLAY:BOOZER:2:2:2] [TILE_GRAPHICS:BOOZER:15:3:WORKSHOP_CUSTOM_OVERLAY:BOOZER:2:0:3] [TILE_GRAPHICS:BOOZER:16:3:WORKSHOP_CUSTOM_OVERLAY:BOOZER:2:1:3] [TILE_GRAPHICS:BOOZER:17:3:WORKSHOP_CUSTOM_OVERLAY:BOOZER:2:2:3] [TILE_GRAPHICS:BOOZER:18:0:WORKSHOP_CUSTOM_OVERLAY:BOOZER:1:0:0] [TILE_GRAPHICS:BOOZER:19:0:WORKSHOP_CUSTOM_OVERLAY:BOOZER:1:1:0] [TILE_GRAPHICS:BOOZER:20:0:WORKSHOP_CUSTOM_OVERLAY:BOOZER:1:2:0] [TILE_GRAPHICS:BOOZER:18:1:WORKSHOP_CUSTOM_OVERLAY:BOOZER:1:0:1] [TILE_GRAPHICS:BOOZER:19:1:WORKSHOP_CUSTOM_OVERLAY:BOOZER:1:1:1] [TILE_GRAPHICS:BOOZER:20:1:WORKSHOP_CUSTOM_OVERLAY:BOOZER:1:2:1] [TILE_GRAPHICS:BOOZER:18:2:WORKSHOP_CUSTOM_OVERLAY:BOOZER:1:0:2] [TILE_GRAPHICS:BOOZER:19:2:WORKSHOP_CUSTOM_OVERLAY:BOOZER:1:1:2] [TILE_GRAPHICS:BOOZER:20:2:WORKSHOP_CUSTOM_OVERLAY:BOOZER:1:2:2] [TILE_GRAPHICS:BOOZER:18:3:WORKSHOP_CUSTOM_OVERLAY:BOOZER:1:0:3] [TILE_GRAPHICS:BOOZER:19:3:WORKSHOP_CUSTOM_OVERLAY:BOOZER:1:1:3] [TILE_GRAPHICS:BOOZER:20:3:WORKSHOP_CUSTOM_OVERLAY:BOOZER:1:2:3] [TILE_GRAPHICS:BOOZER:21:0:WORKSHOP_CUSTOM_OVERLAY:BOOZER:0:0:0] [TILE_GRAPHICS:BOOZER:22:0:WORKSHOP_CUSTOM_OVERLAY:BOOZER:0:1:0] [TILE_GRAPHICS:BOOZER:23:0:WORKSHOP_CUSTOM_OVERLAY:BOOZER:0:2:0] [TILE_GRAPHICS:BOOZER:21:1:WORKSHOP_CUSTOM_OVERLAY:BOOZER:0:0:1] [TILE_GRAPHICS:BOOZER:22:1:WORKSHOP_CUSTOM_OVERLAY:BOOZER:0:1:1] [TILE_GRAPHICS:BOOZER:23:1:WORKSHOP_CUSTOM_OVERLAY:BOOZER:0:2:1] [TILE_GRAPHICS:BOOZER:21:2:WORKSHOP_CUSTOM_OVERLAY:BOOZER:0:0:2] [TILE_GRAPHICS:BOOZER:22:2:WORKSHOP_CUSTOM_OVERLAY:BOOZER:0:1:2] [TILE_GRAPHICS:BOOZER:23:2:WORKSHOP_CUSTOM_OVERLAY:BOOZER:0:2:2] [TILE_GRAPHICS:BOOZER:21:3:WORKSHOP_CUSTOM_OVERLAY:BOOZER:0:0:3] [TILE_GRAPHICS:BOOZER:22:3:WORKSHOP_CUSTOM_OVERLAY:BOOZER:0:1:3] [TILE_GRAPHICS:BOOZER:23:3:WORKSHOP_CUSTOM_OVERLAY:BOOZER:0:2:3]

Since this is a custom workshop, it will have WORKSHOP_CUSTOM instead of just WORKSHOP like you see in the vanilla workshop file. You can use the soap maker as a great example of a custom workshop graphic declaration, as well as how it should look to create the code used by the game for how it handles construction of the shop, which we will also be covering later on.

There is a WORKSHOP_CUSTOM set of declarations, as well as WORKSHOP_CUSTOM_OVERLAY. This is because the game uses the 4 stages I mentioned previously and the Overlays that get placed on top of each Base. So Base will use WORKSHOP_CUSTOM and Overlay will use WORKSHOP_CUSTOM_OVERLAY.
Tile Graphics Breakdown
Before I get into the meat of it, just know the game uses zero-index for counting grid spaces on the graphic file.

If you are like me, you count starting at 1, but the game uses zero-index and starts at 0. So the 4 row height of the workshop graphic will count 0, 1, 2, and 3.

Lets use the first line of our Boozer declaration to provide a breakdown of what all of this means.

Code
Description
[TILE_GRAPHICS:BOOZER:0:0: WORKSHOP_CUSTOM:BOOZER:3:0:0]
- TILE_GRAPHICS is the identifier used by the game engine.
- BOOZER is name given to it when we define the graphic for the workshop in the tile_page_buildings file.
- 0:0 is the Row and Column grid number. The numbering is zero-indexed and starts at 0.
- WORKSHOP_CUSTOM tells the game this is a custom workshop.
- BOOZER is the name of the workshop itself and is the same as how it is set in the building_custom file.
:3:0:0
Build Stage:Graphic Grid Column:Graphic Grid Row

You can take a look at graphics_buildings.txt. There are some 5x5 workshops declared here. They also have stages 0 through 3, graphic column 0 through 4 and graphic rows 0 through 5.

This breakdown also applies to the overlay since it is being placed on top of the Base graphic.
Workshop Structure Declaration
I haven't messed around with these options much since they are still hard for me to understand. The TILE tokens feel like a carry over from how it was used in Dwarf Fortress Classic. I will give an explanation a shot.

I also reference the info that is currently on the wiki about modding workshops.[www.dwarffortresswiki.org]

First we will look at the soap maker workshop found vanilla_buildings\objects named building_custom.txt.

building_custom [OBJECT:BUILDING] [BUILDING_WORKSHOP:SOAP_MAKER] [NAME:Soap Maker's Workshop] [NAME_COLOR:7:0:1] [DIM:3:3] [WORK_LOCATION:2:2] [BUILD_LABOR:SOAP_MAKER] [BUILD_KEY:CUSTOM_SHIFT_P] [BLOCK:1:0:0:0] workbenches no longer block [BLOCK:2:0:0:0] [BLOCK:3:0:0:0] [TILE:0:1:' ':' ':150] [TILE:0:2:' ':' ':'/'] [TILE:0:3:'-':' ':' '] [COLOR:0:1:0:0:0:0:0:0:6:0:0] [COLOR:0:2:0:0:0:0:0:0:6:0:0] [COLOR:0:3:6:0:0:0:0:0:0:0:0] [TILE:1:1:' ':' ':'='] [TILE:1:2:'-':' ':8] [TILE:1:3:' ':' ':150] [COLOR:1:1:0:0:0:0:0:0:6:0:0] [COLOR:1:2:6:0:0:0:0:0:6:0:0] [COLOR:1:3:0:0:0:0:0:0:6:0:0] [TILE:2:1:'-':' ':8] [TILE:2:2:' ':' ':8] [TILE:2:3:' ':150:' '] [COLOR:2:1:6:0:0:0:0:0:6:0:0] [COLOR:2:2:0:0:0:0:0:0:6:0:0] [COLOR:2:3:0:0:0:6:0:0:0:0:0] [TILE:3:1:150:' ':8] [TILE:3:2:' ':' ':8] [TILE:3:3:' ':240:' '] [COLOR:3:1:6:0:0:0:0:0:6:7:0] [COLOR:3:2:0:0:0:0:0:0:6:7:0] [COLOR:3:3:0:0:0:7:0:1:0:0:0] [BUILD_ITEM:1:BUCKET:NONE:NONE:NONE][EMPTY][CAN_USE_ARTIFACT] [BUILD_ITEM:1:NONE:NONE:NONE:NONE][BUILDMAT][WORTHLESS_STONE_ONLY][CAN_USE_ARTIFACT] [TOOLTIP:Use tallow (rendered fat) or oil here with lye to make soap.]

Just like the DF wiki, a line by line breakdown follows.
Workshop Structure Declaration Breakdown
Code
Description
[BUILDING_WORKSHOP:SOAP_MAKER]
This declares it as a workshop and has the same name used in the graphics declaration file.
[NAME:Soap Maker's Workshop]
The name of the workshop as it will be displayed in the UI.
[NAME_COLOR:7:0:1]
This is the display color of the workshop's name when you see it in the UI.
[DIM:3:3]
Dimensions of the workshop itself. This should also match with the declared tile dimensions set in the tile_page_building file.
[WORK_LOCATION:2:2]
This is the location where the dwarf will stand in relation to the workshop while it is used. For a 3x3 workshop, set to this work location, the dwarf will stand in the middle of the workshop area when they are using it. This is counting the actual 3x3 area of the Workshop Base only. It also starts numbering with 1 instead of 0, and starts its count location in the upper right corner of the Base area. You can set this to be outside of the workshop area if you like as well.
[BUILD_LABOR:SOAP_MAKER]
This is the labor token[dwarffortresswiki.org] that specifies the occupation of the dwarf who should build this.
[BUILD_KEY:CUSTOM_SHIFT_P]
This is the hotkey that is set for the workshop building. You can press Shift and P to pull up the soap maker without having to navigate through the UI menus to get to it. This can also be set as NONE if you don't want to set a hotkey, or don't want to look for a hotkey combination that is not currently in use.
[BLOCK:1:0:0:0] [BLOCK:2:0:0:0] [BLOCK:3:0:0:0]
This used to set if a specific tile in the workshop's construction would be impassible, but blocking is no longer a thing so you should just set all values for BLOCK to 0.
[TILE:0:1:' ':' ':150] [TILE:0:2:' ':' ':'/'] [TILE:0:3:'-':' ':' ']
TILE is the identifier, 0 is the build stage, and the 3 colon separated values are ASCII style blocking. TILE is similar to how BLOCK is setup (format wise, it doesn't perform blocking). It uses colon separated values to set how it appears in ASCII. Numbers are set without quotes around each value. These will be displayed if you have Use Classic ASCII Glyphs set to yes in the settings menu. 150 in this example is the text designation for bucket.

You can check the wiki for more info on Tilesets.[www.dwarffortresswiki.org]

TILE designations are needed for each row of the workshop. There aren't any examples of 5x5 workshops in the vanilla files but all you need to do is add two more colon separated values on each TILE line and add in two more TILE lines. Like [TILE:0:1:' ':' ':' ':' ':150]
[COLOR:0:1:0:0:0:0:0:0:6:0:0] [COLOR:0:2:0:0:0:0:0:0:6:0:0] [COLOR:0:3:6:0:0:0:0:0:0:0:0]
COLOR is the ID, 0 is the build stage, and there are 3 sets of values separated by colons that correspond to each column of the workshop graphic.

This uses Color information.[www.dwarffortresswiki.org] These give the tiles their color. It uses a color value or MAT. Use the color information found in the link to the wiki above. If you want the color to reflect the material that's used to build the workshop, set the color like this: [COLOR:0:1:MAT:MAT:MAT]. Even though these values are typically 0-7, you can go up to 15 according to the wiki. Values 8-15 will make it a bright variation of that color.

For a 5x5 workshop, there would be 5 sets of numbers, or 5 MAT declarations. It would look like [COLOR:0:1:MAT:MAT:MAT:MAT:MAT]. Anywhere you dont want to specify MAT you can replace it with 3 colon separated numbers to use colors instead [COLOR:0:1:6:0:0:MAT:6:0:0:MAT:6:0:0]
[BUILD_ITEM:1:BUCKET:NONE:NONE:NONE][EMPTY][CAN_USE_ARTIFACT] [BUILD_ITEM:1:NONE:NONE:NONE:NONE][BUILDMAT][WORTHLESS_STONE_ONLY][CAN_USE_ARTIFACT]
These follow a similar format to a Reaction's reagent.[www.dwarffortresswiki.org]

These establish what material or items are needed to be able to build the workshop. The format for them is:
- BUILD_ITEM
- quantity
- item token[www.dwarffortresswiki.org]
- material token[www.dwarffortresswiki.org]
- followed by any additional modifiers.

[EMPTY] is a modifier[www.dwarffortresswiki.org] saying the bucket must be empty
[CAN_USE_ARTIFACT] allows the bucket to be an artifact.
[TOOLTIP:Use tallow (rendered fat) or oil here with lye to make soap.]
This sets the tooltip of the workshop when you mouse over it in the UI.
Custom Workshop Declaration Example
Let's reference the Boozer's Workshop again for this example. This custom workshop's text file would be added to your mod in the location Dwarf Fortress\mods\Boozer\objects\ and we will give it the name building_custom_boozer.txt.

building_custom_boozer [OBJECT:BUILDING] [BUILDING_WORKSHOP:BOOZER] [NAME:Boozer's Workshop] [NAME_COLOR:7:0:1] [DIM:3:3] [WORK_LOCATION:2:2] [BUILD_LABOR:BREWER] [BUILD_KEY:CUSTOM_SHIFT_J] [BLOCK:1:0:0:0] [BLOCK:2:0:0:0] [BLOCK:3:0:0:0] [TILE:0:1:' ':' ':150] [TILE:0:2:' ':' ':'/'] [TILE:0:3:'-':' ':' '] [COLOR:0:1:0:0:0:0:0:0:6:0:0] [COLOR:0:2:0:0:0:0:0:0:6:0:0] [COLOR:0:3:6:0:0:0:0:0:0:0:0] [TILE:1:1:' ':' ':'='] [TILE:1:2:'-':' ':8] [TILE:1:3:' ':' ':150] [COLOR:1:1:0:0:0:0:0:0:6:0:0] [COLOR:1:2:6:0:0:0:0:0:6:0:0] [COLOR:1:3:0:0:0:0:0:0:6:0:0] [TILE:2:1:'-':' ':8] [TILE:2:2:' ':' ':8] [TILE:2:3:' ':150:' '] [COLOR:2:1:6:0:0:0:0:0:6:0:0] [COLOR:2:2:0:0:0:0:0:0:6:0:0] [COLOR:2:3:0:0:0:6:0:0:0:0:0] [TILE:3:1:150:' ':8] [TILE:3:2:' ':' ':8] [TILE:3:3:' ':240:' '] [COLOR:3:1:6:0:0:0:0:0:6:7:0] [COLOR:3:2:0:0:0:0:0:0:6:7:0] [COLOR:3:3:0:0:0:7:0:1:0:0:0] [BUILD_ITEM:1:GOBLET:NONE:INORGANIC:IRON][CAN_USE_ARTIFACT] [BUILD_ITEM:1:NONE:NONE:NONE:NONE][BUILDMAT][WORTHLESS_STONE_ONLY][CAN_USE_ARTIFACT] [TOOLTIP:Make all the things boozey.]

This requires one of the build items to be 1 goblet made of iron. The other item is any material that is a build material that is also considered non-economic stone.

NOTE: Previously I wasn't understanding the BUILD_LABOR. You can look over the labor tokens[dwarffortresswiki.org] to find a labor that is as close of a match as possible to your custom workshop's purpose. Boozer's workshop brews alcoholic drinks, so brewing is our match.
Reaction Declaration
Reactions[www.dwarffortresswiki.org] are the jobs that can take place in your workshop.

Now we get to the part where customization gets fun. Lets look at the Soapmaker's Workshop reactions. In reaction_other.txt it has two reactions. One of them lets you make soap from tallow.

[REACTION:MAKE_SOAP_FROM_TALLOW] [NAME:make soap from tallow] [BUILDING:SOAP_MAKER:CUSTOM_T] [REAGENT:lye:150:LIQUID_MISC:NONE:LYE] [REAGENT:lye container:1:NONE:NONE:NONE:NONE] [CONTAINS:lye] [PRESERVE_REAGENT] [DOES_NOT_DETERMINE_PRODUCT_AMOUNT] [REAGENT:tallow:150:GLOB:NONE:NONE:NONE][REACTION_CLASS:TALLOW][UNROTTEN] [HAS_MATERIAL_REACTION_PRODUCT:SOAP_MAT] [PRODUCT:100:1:BAR:NONE:GET_MATERIAL_FROM_REAGENT:tallow:SOAP_MAT][PRODUCT_DIMENSION:150] [SKILL:SOAP_MAKING]
Reaction Declaration Breakdown
Code
Description
[REACTION:MAKE_SOAP_FROM_TALLOW]
Reaction token with the ID of the reaction, which is used by the game. This is the name you give the reaction for the game to use to reference the reaction details.
[NAME:make soap from tallow]
The name as the reaction appears in the menu.
[BUILDING:SOAP_MAKER:CUSTOM_T]
The building ID as it's set in the custom building text file and the custom hotkey.
[REAGENT:lye:150:LIQUID_MISC:NONE:LYE]
Required item for the reaction to take place. REAGENT is the token, lye is the name given to the reagent that is only used within this reaction. It's simply a placeholder name, or kind of like a variable if you are familiar with programming, so you can reference this particular reagent elsewhere in this reaction.
[REAGENT:lye container:1:NONE:NONE: NONE:NONE]
This ties into the first required reagent. The name can be whatever you want, but here it is named lye container, since it is supposed to be have lye in it. Since lye is a liquid, you also have to setup a container reagent to hold the lye. The four NONE makes it so any thing can be used, but this is specified using modifiers.
[CONTAINS:lye]
Specifies lye container must have lye in it.
[PRESERVE_REAGENT]
This preserves the container. Without this tag, you would destroy a container every time you make soap from tallow.
[DOES_NOT_DETERMINE_PRODUCT_AMOUNT]
This lets the game know that that the reagent quantity does not have any relation to the product output. This will let you determine the quantity of product that results from the reaction separately.
[REAGENT:tallow:150:GLOB:NONE:NONE:NONE]
Names the reagent tallow, requires an amount of 150. The game considers these as globs with no other item or material requirements, but this is specified with the modifiers.
[REACTION_CLASS:TALLOW]
The glob has to have the reaction class of tallow. This is a default value in the game that certain materials have so they can be used as a generic reagent.
[UNROTTEN]
The glob material is organic so this tag is needed so the reaction will only look for globs that are non-rotten.
[HAS_MATERIAL_REACTION_PRODUCT:SOAP_MAT]
This sets the required reaction product of the reagent. The reaction products can be found throughout the various text files in the vanilla objects folder.

SOAP_MAT is found in the file material_template_default.txt.
[PRODUCT:100:1:BAR:NONE: GET_MATERIAL_FROM_REAGENT:tallow: SOAP_MAT]
This specifies the product that is produced from the reaction.
- PRODUCT is the identifier
- 100 is the probability of success. The wiki says percentage chance, so this is likely from 0-100.
- 1 is the quantity
- BAR:NONE is the item token[www.dwarffortresswiki.org] and its subtype. For BAR there is no subtype.
- GET_MATERIAL_FROM_REAGENT:tallow will get the material value of the product from a reagent's material token.[www.dwarffortresswiki.org] in the reaction, which is tallow in this case.
- SOAP_MAT is the identifier for the reagent and this is set to be a soap_mat.
[PRODUCT_DIMENSION:150]
This sets the dimension of your product. The default for bars is 150.
[PRODUCT_DIMENSION:150]
This sets the dimension of your product. The default for bars is 150.
[SKILL:SOAP_MAKING]
Sets the skill that is leveled up from using this reaction. This is entirely optional and comes with some additional modifiers that can be added, like increasing how much the skill levels up.

I believe skill tokens[www.dwarffortresswiki.org] are hard-coded and there is currently no way to add to them. There are a lot of skills you can point to, so don't worry about a lack of options.
Reaction Declaration Example
Continuing to use Boozer's Workshop for our example, lets make a custom reaction. For our workshop lets put the bees to work and use their royal jelly to create something we will call Royal Mead.

This recipe is actually easier to create than mead due to not needing a screw press to extract the liquid from another material.

The reaction text file will go into the following directory:

Dwarf Fortress\mods\

Name of the file will be reaction_boozer.txt

reaction_boozer [OBJECT:REACTION] [REACTION:BREW_ROYAL_MEAD] [NAME:make royal mead] [BUILDING:BOOZER:NONE] [REAGENT:royal jelly:150:LIQUID_MISC:NONE:CREATURE_MAT:HONEY_BEE:ROYAL_JELLY] [UNROTTEN] [REAGENT:royal jelly container:1:NONE:NONE:NONE:NONE] [CONTAINS:royal jelly] [PRESERVE_REAGENT] [DOES_NOT_DETERMINE_PRODUCT_AMOUNT] [PRODUCT:100:10:DRINK:NONE:GET_MATERIAL_FROM_REAGENT:royal jelly:DRINK_MAT] [PRODUCT_TO_CONTAINER:royal jelly container] [PRODUCT_DIMENSION:150] [SKILL:BREWING] [SKILL_IP:50] [CATEGORY:BOOZE_BREWING] [CATEGORY_NAME:Boozecraft] [CATEGORY_DESCRIPTION:Make special booze and brews here.]

NOTE: This text is different from what was originally in the guide. For some reason I couldn't use the same format as mead. Attempting to include a third reagent in the reaction would cause the recipe in the workshop to highlight red and refuse to produce it. So for our example we are going to act like we are putting the Royal Mead back in the original royal jelly container to add a stronger jelly flavor to it. Let's just keep that between us.

This recipe uses royal jelly to create royal mead. It requires the material honey bee royal jelly, which is a liquid and is stored in a container. So we require a second reagent to be the container that must contain the royal jelly. After the reaction has succeeded, we put the royal mead back in the royal jelly container.

Also at the bottom is something I havent mentioned yet but is pretty straight forward.

Since this will likely not be the last recipe you would want to add to an entire custom workshop, you want to categorize your reactions so they are better organized.

Code
Description
[CATEGORY:BOOZE_BREWING]
This is an internal name used by the game engine, which also allows this category to be used elsewhere in your mod files. We let the game know our category is booze_brewing.
[CATEGORY_NAME:Boozecraft]
This is the name as it appears in the workshop menu in game. Boozecraft will be what you see when you first click on the Boozer's Workshop, and any reactions that also belong to the category will show up under that workshop category.
[CATEGORY_DESCRIPTION:Make special booze and brews here.]
This is similar to a tooltip but for the workshop menu UI.


NOTE: Something I noticed while testing this mod example is the name you give a reagent will actually display in game if conditions for it to be displayed are met. In our example, if an empty storage container for honey bee royal jelly is not found, the recipe within the workshop will be red to show its not currently possible to produce it and in red text it will say what is missing, which will include the name we gave the reagent in our reaction.
Royal Jelly Mead in Real Life
Here is something that may or may not be interesting to you. I was thinking about this reaction in terms of real life. Since mead recipes usually call for honey in its production, how would it actually work to make mead out of royal jelly. It turns out it would take a larger amount of royal jelly compared to how much honey is in the recipe (due to sugar content differences between the two), and the taste would potentially not be very good.

Royal jelly[en.wikipedia.org] potentially has over 10% of its composition as sugars but is largely made up of water.

Honey[en.wikipedia.org] can have over 70%.


So?

So if you were to make this reaction closer to what you would be looking for in real life, you would probably want to include honey in the reagents and up the amount of royal jelly used. Percentage wise you would want it to be around 30% royal jelly and 70% as honey.
Adding Royal Mead to Honey Bees
We are almost to the finish line. In order for the Royal Mead to have that name, we need to add to the honey bee so it can be given to the product of the reaction.

We go back to our mod folder and add a text file to the objects folder. Our Boozer's Workshop file will be named creature_insects_boozer.txt

The file for our example with Boozer's Workshop will look like this:

creature_insects_boozer [OBJECT:CREATURE] [SELECT_CREATURE:HONEY_BEE] [SELECT_MATERIAL:ROYAL_JELLY] [MATERIAL_REACTION_PRODUCT:DRINK_MAT:LOCAL_CREATURE_MAT:ROYAL_MEAD] [GO_TO_TAG:NOBONES] [USE_MATERIAL_TEMPLATE:ROYAL_MEAD:CREATURE_ALCOHOL_TEMPLATE] [STATE_NAME_ADJ:ALL_SOLID:frozen royal mead] [STATE_NAME_ADJ:LIQUID:royal mead] [STATE_NAME_ADJ:GAS:boiling royal mead] [PREFIX:NONE]

NOTE: You need to make sure you select the creature and select the material itself. If you Select the creature and then add [USE_MATERIAL_TEMPLATE:HONEY:CREATURE_EXTRACT_TEMPLATE], it will override the royal jelly material's properties. You need to also use [SELECT_MATERIAL:ROYAL_JELLY] to append additional information to what is already present for the creature.


Code
Description
[SELECT_CREATURE:HONEY_BEE]
This selects the creature honey_bee for modification.
[SELECT_MATERIAL:ROYAL_JELLY]
This is our honey bee's extract that we are targeting.
[MATERIAL_REACTION_PRODUCT:DRINK_MAT: LOCAL_CREATURE_MAT:ROYAL_MEAD]
This adds to the royal jelly extract to set it up as usable in our reaction. The material reaction product will be called ROYAL_MEAD.
[GO_TO_TAG:NOBONES]
This tells the game to go to the creature token[dwarffortresswiki.org] within the honey bee creature, called [NOBONES], and append our new creature alcohol template. Without this go to tag line, the game would append the alcohol template to the end of the creature file, after the caste information. We want it to be in the file before the caste information.
[USE_MATERIAL_TEMPLATE:ROYAL_MEAD: CREATURE_ALCOHOL_TEMPLATE]
This creates a new material for the Royal Mead.
[STATE_NAME_ADJ:ALL_SOLID:frozen royal mead]
This sets the name when frozen
[STATE_NAME_ADJ:LIQUID:royal mead]
Sets the name when liquid
[STATE_NAME_ADJ:GAS:boiling royal mead]
Sets the name when in a gaseous state
[PREFIX:NONE]
Added prefix if desired. I wasn't sure on this tag so I left it as none, like the other entry for honey bee called MEAD.
Putting It All Together
Now that everything is in place, its time to tie it all together. To make this straight forward, we are just going to be adding the workshop and everything else needed to the default dwarves.

Another option is to cut them and then re-add them again, but that is a lot extra unnecessary lines just to add 2 items to the default entity.

To do this, you need to create a new text file in your mod folder directory in the objects folder. For our example it is:

Dwarf Fortress\mods\Boozer\objects

The file we are adding our workshop to is for the entity_default.txt file for the dwarves, which is found in the directory vanilla_entities\objects.

Let's create a new text file named entity_default_boozer.txt
Entity Default Example
entity_default_boozer [OBJECT:ENTITY] [SELECT_ENTITY:MOUNTAIN] [PERMITTED_BUILDING:BOOZER] [PERMITTED_REACTION:BREW_ROYAL_MEAD]

This selects the entity that the dwarves belong to, named Mountain.

It then adds the building and reaction so the dwarves can build the workshop and brew the royal mead.

We are now ready to go and test out the Boozer's Workshop mod.
Loading Your New Mod For Testing
Like I said at the start of this guide, there is no object testing arena.

Each time you test your mod, you have to close out the game, re-open the game, add your mod to the world generation, and generate a new world.

When you make a change to the mod you can go one of two ways to test it.

Method 1:
1. Close the game
2. Make any mod edits
3. Edit the info.txt file to increase the NUMERIC_VERSION and DISPLAYED_VERSION
4. Restart the game
5. Create new world
6. Add your mod to the world generator

This will allow the game to show the new version and install the mod file changes when you create a new world.

Method 2:
1. Close the game
2. Make any mod edits
3. Delete your mod folder from installed_mods
4. Restart the game
5. Create new world
6. Add your mod to the world generator

NOTE: I did notice when testing this mod to get the guide details nailed down that if there were not any major changes to the files in the installed_mods folder, I could get away with:
1. Close the game
2. Making changes to the text files as needed.
3. Save changes
4. Restart the game
5. Continue active game

Not sure on the limits to this, but I managed to do testing on the creature insects mod file to change and test code, as well as adding/removing entire reagent lines in the reaction file.

More testing on this is needed but it almost looks like you can make any changes you want to text files that were already present within your mod folders when your mod was added to the world generation mod menu.
Mod Ready For Steam
Bay 12 created a guide[bay12games.com] to cover steam mod uploads. There are some other files that you need to add before you want to upload it.

You can also add an image and preview file so your mod has an image for people to see when they are browsing the workshop. Name them image.png and preview.png

I'm not sure on the file size limitations but if you receive an error message when you finally upload your mod to steam, double check your file sizes on the image and preview files, make adjustments to lower their size, and reattempt your upload.

Summary
Well I hope this guide is helpful to people who are interested in modding Dwarf Fortress.

This just covers modding in a custom workshop.

Any folder you see in the directory \Dwarf Fortress\data\vanilla can have mod files created to change how the game looks and plays.

For example, you can even switch out the reagent on our reaction for brewing wildflower mead and the material template we specify to actually use honey bee venom to make spicy wildflower mead.

NOTE: Not for sure on this yet. I am still testing adding material_reaction_products to existing material templates on creatures.

However, since I didn't test that idea, it might in fact make a poison. The options for what you can do in the game is pretty fantastic.

Go out there and make something great for this wonderful game.
Links Used
I also wanted to provide a section that has the various Dwarf Fortress Wiki links that were used throughout the guide:

- Bay 12 Steam Upload Guide[bay12games.com]
- Workshops[www.dwarffortresswiki.org]
- Labor Tokens[dwarffortresswiki.org]
- Tilesets[www.dwarffortresswiki.org]
- Color[www.dwarffortresswiki.org]
- Reactions[www.dwarffortresswiki.org]
- Item Tokens[www.dwarffortresswiki.org]
- Material Tokens[www.dwarffortresswiki.org]
- Modifiers[www.dwarffortresswiki.org]
- Labor Tokens[dwarffortresswiki.org]
- Reactions[www.dwarffortresswiki.org]
- Creature Tokens[dwarffortresswiki.org]
Contributions
This area will be reserved for anyone who contributes in a way that requires editing of the guide and improve it.



Putnam:

Let me know that the original way of attempting to add the new material reaction to the honey bee was actually completely overwriting the honey template for the honey bee. This changed it from

[SELECT_CREATURE:HONEY_BEE] [USE_MATERIAL_TEMPLATE:HONEY:CREATURE_EXTRACT_TEMPLATE]
to

[SELECT_CREATURE:HONEY_BEE] [SELECT_MATERIAL:HONEY]



Qev:

Spent a lot of time helping me test various changes to the mod files to attempt to figure out how exactly to add a new MATERIAL_REACTION_PRODUCT to the honey bee.

Also showed me the [GO_TO_TAG:] function that lets you pick and choose where you append your information in a vanilla file.


Change Log
1.0.0
- Initial guide release

1.0.1
- Additional edits to grammar and wording.

1.0.2
- Note added to section about graphics creation. Custom workshop base graphic would not change color to match the material that was used. If the vanilla graphics base was used, the workshop color would change to match the material.

1.0.3
- More edits to adding to the Honey Bee. Testing is ongoing but it currently looks like you can only have a single MATERIAL_REACTION_PRODUCT entry per item that is produced. Once I have tested this fully and this is the case, I will be updating the guide to reflect the material reaction product going elsewhere on the honey bee. The most likely target for it is royal jelly.

1.0.4
- Started to notice I was adding more and more notes to the guide. I set them up to be quotes instead so they stand out a bit. This should improve the readability of the guide.

1.1.0
- Setup all breakdowns of code into a table format to hopefully improve readability.
- Reduced header level blue text within a section to improve readability.
- Updated all wiki links to point to the updated wiki pages.

1.1.1
- Stared at TILE hard enough and had a breakthrough (breakdown?). It helped that you can now switch to ASCII glyphs. TILE seems to be how the workshop is represented in ASCII.

1.1.2
- Removed details on BLOCK for the workshop breakdown section. Tile blocking is not longer a function in the game.
12 Comments
Kungfufishstick  [author] 23 Jan, 2023 @ 2:22pm 
@Old Man Jenkins They have a mod up on the workshop that mods the game in the style of elder scrolls. Its like a modding guide in action with a lot of stuff going on to give plenty of examples in the mod files to show how things are done.
Old Man Jenkins 23 Jan, 2023 @ 10:48am 
I don't know much about the dev of DF other than that Tarn basically did it single-handed. I know what DFHack is but I started with v0.50 so I haven't gotten a chance to use DFHack. Who is Putnam?
Kungfufishstick  [author] 22 Jan, 2023 @ 9:41am 
@Old Man Jenkins I'm glad you like and it is a lot of work when I make a guide. I try to cover everything I can that relates to the subject. I think the only eyes that have seen the actual code are Tarn and now Putnam, which is awesome. Bringing Putnam on board was a great move since they have done so much for the game and community. I believe Putnam is part of the team that works on DFHack and they are very active on the kitfox discord for modding.
Old Man Jenkins 22 Jan, 2023 @ 8:18am 
I also love that this gives me a better idea of how Tarn made the game. As I play I think about the years of work he put in and wonder how he programmed a lot of it. This guide definitely gives a surface-level glance at how it all works, and your explanations are clear and easy to understand. Again, I thank you, you're a credit to the community.
Old Man Jenkins 22 Jan, 2023 @ 8:14am 
Oh baby is this shit spicy. Thanks, brother, this is my kind of guide. You clearly put a lot of work into this, and naming it Boozer is hilarious.
GhostPutty 5 Jan, 2023 @ 2:28pm 
Oh, I figured it out. This part hasn't been implemented yet for the interface build menu, but it shows up when selecting the workstation. It's in graphics_building_icons.txt
[CUSTOM_WORKSHOP_GRAPHICS:SOAP_MAKER]
[LIST_ICON:BUILDING_ICONS:2:12]
Kungfufishstick  [author] 5 Jan, 2023 @ 2:09pm 
@GhostPutty I will have to look it over to see if I talk about it. If the workshop is successfully added, it shows up under the workshops menu. It's in alphabetical order.
GhostPutty 3 Jan, 2023 @ 9:36am 
I feel like I'm missing something. Did you cover how this is configured in the build interface menu? I don't see that part.
Mil 3 Jan, 2023 @ 6:02am 
Insanely well done. Thank you for this guide!
Llamageddon 29 Dec, 2022 @ 6:25am 
This is great, I wish there were some more step by step modding guides. You break it down and explain it in a way that is much easier to follow and digest than trying to read through the wiki guides. It helped me wrap my head around a couple of things I was a bit confused by, thanks.