So, having recently gotten back into both DF and DFhacking, I decided to take a crack at seeing if I could retrofit an older fort from 0.40.xx to have working scholars and performers, and I'm pleased to say its at least partially possible:
This is probably most interesting for succession games and such but some people like to play forts for a long time so I thought I'd write it up. This most exists for people to test with and help
What's Needed - DFhack
- Patience
What Works: - SPecific item creation, i.e., bone ring, etc.
- Scholars ... scholar
- Making bookcases, paper, scrolls
- Pulping/slurry works
- Books, scrolls, etc.
What Doesn't (Yet) - Quicklime
- I managed to add the reaction, but something went wrong. Instead of quicklime, I end up with a !!dwarf!! and a !!bag!!
- Performers
- Instruments, styles, etc. are generated as part of worldgen.
Untested - Paper plants
- If scholars come visit now that your library works
- actually getting drunk bar fights, should be a quick raw edit, but I'm not sure all the tags needed.
Unknowns - Getting items via trade
WARNING: This worked for me, but any major hacking with DFhack always can cause save file corruption and such. Be careful in hacking your saves.
1. Editing your raws.
First, you need to add the necessary items to your raw files. First, you need to add the new reactions to reaction_text.txt:
[REACTION:MAKE_QUICKLIME]
[NAME:make quicklime]
[BUILDING:KILN:CUSTOM_Q]
[REAGENT:A:1:BOULDER:NONE:NONE:NONE][REACTION_CLASS:CALCIUM_CARBONATE]
[REAGENT:B:1:BOX:NONE:NONE:NONE][EMPTY][BAG][PRESERVE_REAGENT]
[PRODUCT:100:1:POWDER_MISC:NONE:INORGANIC:QUICKLIME][PRODUCT_DIMENSION:150][PRODUCT_TO_CONTAINER:B]
[FUEL]
[SKILL:SMELT]
[REACTION:MAKE_MILK_OF_LIME]
[NAME:make milk of lime]
[BUILDING:ASHERY:CUSTOM_M]
[REAGENT:quicklime:150:POWDER_MISC:NONE:INORGANIC:QUICKLIME]
[REAGENT:quicklime container:1:NONE:NONE:NONE:NONE]
[CONTAINS:quicklime]
[PRESERVE_REAGENT]
[DOES_NOT_DETERMINE_PRODUCT_AMOUNT]
[REAGENT:bucket:1:BUCKET:NONE:NONE:NONE]
[EMPTY]
[PRESERVE_REAGENT]
[DOES_NOT_DETERMINE_PRODUCT_AMOUNT]
[PRODUCT:100:1:LIQUID_MISC:NONE:INORGANIC:MILK_OF_LIME]
[PRODUCT_TO_CONTAINER:bucket]
[PRODUCT_DIMENSION:150]
[SKILL:LYE_MAKING] close enough for now!
[REACTION:MAKE_PARCHMENT]
[NAME:make parchment]
[BUILDING:TANNER:CUSTOM_P]
[REAGENT:A:1:NONE:NONE:NONE:NONE][USE_BODY_COMPONENT][UNROTTEN]
[HAS_MATERIAL_REACTION_PRODUCT:PARCHMENT_MAT]
[REAGENT:milk of lime:150:LIQUID_MISC:NONE:INORGANIC:MILK_OF_LIME]
[REAGENT:lime container:1:NONE:NONE:NONE:NONE]
[CONTAINS:milk of lime]
[PRESERVE_REAGENT]
[DOES_NOT_DETERMINE_PRODUCT_AMOUNT]
[PRODUCT:100:1:SHEET:NONE:GET_MATERIAL_FROM_REAGENT:A:PARCHMENT_MAT]
[SKILL:TANNER] close enough for now!
[REACTION:MAKE_SCROLL]
[NAME:make scroll]
[BUILDING:CRAFTSMAN:NONE]
[REAGENT:sheet:10000:SHEET:NONE:NONE:NONE]
[REAGENT:scroll rollers:1:TOOL:ITEM_TOOL_SCROLL_ROLLERS:NONE:NONE]
[PRODUCT:100:1:TOOL:ITEM_TOOL_SCROLL:GET_MATERIAL_FROM_REAGENT:sheet:NONE]
[PRODUCT_TOKEN:scroll]
[IMPROVEMENT:100:scroll:SPECIFIC:ROLLERS:GET_MATERIAL_FROM_REAGENT:scroll rollers:NONE]
[SKILL:BOOKBINDING]
[REACTION:MAKE_QUIRE]
[NAME:make quire]
[BUILDING:CRAFTSMAN:NONE]
[REAGENT:sheet:10000:SHEET:NONE:NONE:NONE]
[PRODUCT:100:1:TOOL:ITEM_TOOL_QUIRE:GET_MATERIAL_FROM_REAGENT:sheet:NONE]
[SKILL:BOOKBINDING]
[REACTION:MAKE_SHEET_FROM_PLANT]
[NAME:make sheet from plant]
[BUILDING:FARMER:NONE]
[REAGENT:plant:1:PLANT:NONE:NONE:NONE]
[REACTION_CLASS:PAPER_PLANT]
[UNROTTEN]
[PRODUCT:100:1:SHEET:NONE:GET_MATERIAL_FROM_REAGENT:plant:NONE]
[PRODUCT_PRESSED]
[PRODUCT:100:1:SEEDS:NONE:GET_MATERIAL_FROM_REAGENT:plant:SEED_MAT]
[SKILL:PAPERMAKING]
[REACTION:MAKE_SLURRY_FROM_PLANT]
[NAME:mash plant into slurry]
[BUILDING:QUERN:NONE]
[BUILDING:MILLSTONE:NONE]
[REAGENT:plant:1:PLANT:NONE:NONE:NONE]
[HAS_MATERIAL_REACTION_PRODUCT:PRESS_PAPER_MAT]
[UNROTTEN]
[PRODUCT:100:1:GLOB:NONE:GET_MATERIAL_FROM_REAGENT:plant:PRESS_PAPER_MAT]
[PRODUCT_PASTE]
[PRODUCT:100:1:SEEDS:NONE:GET_MATERIAL_FROM_REAGENT:plant:SEED_MAT]
[SKILL:PAPERMAKING]
[REACTION:PRESS_PLANT_PAPER]
[NAME:press plant slurry into paper sheet]
[BUILDING:SCREW_PRESS:NONE]
[REAGENT:paste:150:GLOB:NONE:NONE:NONE]
[REACTION_CLASS:PAPER_SLURRY]
[NOT_PRESSED]
[PRODUCT:100:1:SHEET:NONE:GET_MATERIAL_FROM_REAGENT:paste:NONE]
[PRODUCT_PRESSED]
[SKILL:PAPERMAKING]
[REACTION:BIND_BOOK]
[NAME:bind book]
[BUILDING:CRAFTSMAN:NONE]
[REAGENT:quire:1:TOOL:ITEM_TOOL_QUIRE:NONE:NONE]
[HAS_WRITING_IMPROVEMENT]
[CAN_USE_ARTIFACT]
[CAN_USE_LOCATION_RESERVED]
[REAGENT:binding:1:TOOL:ITEM_TOOL_BOOK_BINDING:NONE:NONE]
[REAGENT:thread:15000:THREAD:NONE:NONE:NONE]
[NOT_WEB]
[PRODUCT:100:1:BOOK:NONE:GET_MATERIAL_FROM_REAGENT:binding:NONE]
[PRODUCT_TOKEN:book]
[TRANSFER_ARTIFACT_STATUS]
[IMPROVEMENT:100:book:PAGES:GET_MATERIAL_FROM_REAGENT:quire:NONE]
note -- right now, the above will auto-pull any writing from the quire and place it in the pages improvement
[SKILL:BOOKBINDING]
[REACTION:CARVE_BONE_FIGURINE]
[NAME:carve bone figurine]
[ADVENTURE_MODE_ENABLED]
[REAGENT:bone:1:NONE:NONE:NONE:NONE]
[USE_BODY_COMPONENT][ANY_BONE_MATERIAL][UNROTTEN]
[REAGENT:tool:1:NONE:NONE:NONE:NONE]
[PRESERVE_REAGENT][HAS_EDGE]
[PRODUCT:100:1:FIGURINE:NONE:GET_MATERIAL_FROM_REAGENT:bone:NONE]
[PRODUCT_TOKEN:figurine]
[SKILL:BONECARVE]
[CATEGORY:ADV_BONE_CARVING]
[CATEGORY_NAME:Carve bone]
[CATEGORY_DESCRIPTION:Make crafts from bone using a sharp weapon or tool.]
[REACTION:CARVE_BONE_RING]
[NAME:carve bone ring]
[ADVENTURE_MODE_ENABLED]
[REAGENT:bone:1:NONE:NONE:NONE:NONE]
[USE_BODY_COMPONENT][ANY_BONE_MATERIAL][UNROTTEN]
[REAGENT:tool:1:NONE:NONE:NONE:NONE]
[PRESERVE_REAGENT][HAS_EDGE]
[PRODUCT:100:1:RING:NONE:GET_MATERIAL_FROM_REAGENT:bone:NONE]
[PRODUCT_TOKEN:ring]
[SKILL:BONECARVE]
[CATEGORY:ADV_BONE_CARVING]
[REACTION:CARVE_BONE_EARRING]
[NAME:carve bone earring]
[ADVENTURE_MODE_ENABLED]
[REAGENT:bone:1:NONE:NONE:NONE:NONE]
[USE_BODY_COMPONENT][ANY_BONE_MATERIAL][UNROTTEN]
[REAGENT:tool:1:NONE:NONE:NONE:NONE]
[PRESERVE_REAGENT][HAS_EDGE]
[PRODUCT:100:1:EARRING:NONE:GET_MATERIAL_FROM_REAGENT:bone:NONE]
[PRODUCT_TOKEN:earring]
[SKILL:BONECARVE]
[CATEGORY:ADV_BONE_CARVING]
[REACTION:CARVE_BONE_SCEPTER]
[NAME:carve bone scepter]
[ADVENTURE_MODE_ENABLED]
[REAGENT:bone:1:NONE:NONE:NONE:NONE]
[USE_BODY_COMPONENT][ANY_BONE_MATERIAL][UNROTTEN]
[REAGENT:tool:1:NONE:NONE:NONE:NONE]
[PRESERVE_REAGENT][HAS_EDGE]
[PRODUCT:100:1:SCEPTER:NONE:GET_MATERIAL_FROM_REAGENT:bone:NONE]
[PRODUCT_TOKEN:scepter]
[SKILL:BONECARVE]
[CATEGORY:ADV_BONE_CARVING]
[REACTION:CARVE_BONE_AMULET]
[NAME:carve bone amulet]
[ADVENTURE_MODE_ENABLED]
[REAGENT:bone:1:NONE:NONE:NONE:NONE]
[USE_BODY_COMPONENT][ANY_BONE_MATERIAL][UNROTTEN]
[REAGENT:tool:1:NONE:NONE:NONE:NONE]
[PRESERVE_REAGENT][HAS_EDGE]
[PRODUCT:100:1:AMULET:NONE:GET_MATERIAL_FROM_REAGENT:bone:NONE]
[PRODUCT_TOKEN:amulet]
[SKILL:BONECARVE]
[CATEGORY:ADV_BONE_CARVING]
[REACTION:CARVE_BONE_BRACELET]
[NAME:carve bone bracelet]
[ADVENTURE_MODE_ENABLED]
[REAGENT:bone:1:NONE:NONE:NONE:NONE]
[USE_BODY_COMPONENT][ANY_BONE_MATERIAL][UNROTTEN]
[REAGENT:tool:1:NONE:NONE:NONE:NONE]
[PRESERVE_REAGENT][HAS_EDGE]
[PRODUCT:100:1:BRACELET:NONE:GET_MATERIAL_FROM_REAGENT:bone:NONE]
[PRODUCT_TOKEN:bracelet]
[SKILL:BONECARVE]
[CATEGORY:ADV_BONE_CARVING]
[REACTION:CARVE_BONE_CROWN]
[NAME:carve bone crown]
[ADVENTURE_MODE_ENABLED]
[REAGENT:bone:1:NONE:NONE:NONE:NONE]
[USE_BODY_COMPONENT][ANY_BONE_MATERIAL][UNROTTEN]
[REAGENT:tool:1:NONE:NONE:NONE:NONE]
[PRESERVE_REAGENT][HAS_EDGE]
[PRODUCT:100:1:CROWN:NONE:GET_MATERIAL_FROM_REAGENT:bone:NONE]
[PRODUCT_TOKEN:crown]
[SKILL:BONECARVE]
[CATEGORY:ADV_BONE_CARVING]
[REACTION:CARVE_BONE_GEM]
[NAME:carve bone cabochon]
[ADVENTURE_MODE_ENABLED]
[REAGENT:bone:1:NONE:NONE:NONE:NONE]
[USE_BODY_COMPONENT][ANY_BONE_MATERIAL][UNROTTEN]
[REAGENT:tool:1:NONE:NONE:NONE:NONE]
[PRESERVE_REAGENT][HAS_EDGE]
[PRODUCT:100:1:GEM:NONE:GET_MATERIAL_FROM_REAGENT:bone:NONE]
[PRODUCT_TOKEN:gem]
[SKILL:BONECARVE]
[CATEGORY:ADV_BONE_CARVING]
And the tools to item_tools.txt:
[ITEM_TOOL:ITEM_TOOL_SCROLL_ROLLERS]
[NAME:scroll rollers:scroll rollers]
[VALUE:10]
[HARD_MAT]
[TOOL_USE:ROLL_UP_SHEET]
[TILE:246]
[SIZE:100]
[MATERIAL_SIZE:1]
[INCOMPLETE_ITEM]
[UNIMPROVABLE]
[ITEM_TOOL:ITEM_TOOL_BOOK_BINDING]
[NAME:book binding:book bindings]
[VALUE:10]
[HARD_MAT]
[TOOL_USE:PROTECT_FOLDED_SHEETS]
[TILE:246]
[SIZE:100]
[MATERIAL_SIZE:1]
[INCOMPLETE_ITEM]
[UNIMPROVABLE]
[ITEM_TOOL:ITEM_TOOL_SCROLL]
[NAME:scroll:scrolls]
[VALUE:20]
[SHEET_MAT]
[TOOL_USE:CONTAIN_WRITING]
[TILE:236]
[SIZE:200]
[NO_DEFAULT_JOB]
[DEFAULT_IMPROVEMENT:SPECIFIC:ROLLERS:HARD_MAT]
[ITEM_TOOL:ITEM_TOOL_QUIRE]
[NAME:quire:quires]
[VALUE:20]
[SHEET_MAT]
[TOOL_USE:CONTAIN_WRITING]
[TILE:240]
[SIZE:100]
[NO_DEFAULT_JOB]
[INCOMPLETE_ITEM]
[UNIMPROVABLE]
[NO_DEFAULT_IMPROVEMENTS]
[ITEM_TOOL:ITEM_TOOL_BOOKCASE]
[NAME:bookcase:bookcases]
[VALUE:10]
[HARD_MAT]
[TOOL_USE:BOOKCASE]
[FURNITURE]
[TILE:240]
[INVERTED_TILE]
[SIZE:1000]
[MATERIAL_SIZE:6]
[CONTAINER_CAPACITY:100000]
2.
MAKE SURE YOU HAVE A BACKUP OF YOUR FORT! Load your fort up, but don't unpause on load. Open the DFHack console and type:
devel/inject-raws tool ITEM_TOOL_SCROLL_ROLLERS tool ITEM_TOOL_BOOK_BINDING tool ITEM_TOOL_SCROLL tool ITEM_TOOL_QUIRE tool ITEM_TOOL_BOOKCASE reaction MAKE_QUICKLIME reaction MAKE_MILK_OF_LIME reaction MAKE_PARCHMENT reaction MAKE_SCROLL reaction MAKE_QUIRE reaction MAKE_SHEET_FROM_PLANT reaction MAKE_SLURRY_FROM_PLANT reaction PRESS_PLANT_PAPER reaction BIND_BOOK reaction CARVE_BONE_FIGURINE reaction CARVE_BONE_RING reaction CARVE_BONE_EARRING reaction CARVE_BONE_SCEPTER reaction CARVE_BONE_AMULET reaction CARVE_BONE_BRACELET reaction CARVE_BONE_CROWN reaction CARVE_BONE_GEM
Follow the prompts. Immediately save, and reload your fort. If you can load, unpause, and don't immediately crash, you're in business. Now you just need to add the remainder of the tags to get it to work.
3. Add the necessary tokens to entity_default. You need to do this under the MOUNTAIN section for dwarves, and under PLAINS for humans. Simply copy and paste this block
[TOOL:ITEM_TOOL_SCROLL_ROLLERS]
[TOOL:ITEM_TOOL_BOOK_BINDING]
[TOOL:ITEM_TOOL_SCROLL]
[TOOL:ITEM_TOOL_QUIRE]
[TOOL:ITEM_TOOL_BOOKCASE]
[PERMITTED_JOB:PAPERMAKER]
[PERMITTED_JOB:BOOKBINDER]
[SCHOLAR:PHILOSOPHER]
[SCHOLAR:MATHEMATICIAN]
[SCHOLAR:HISTORIAN]
[SCHOLAR:ASTRONOMER]
[SCHOLAR:NATURALIST]
[SCHOLAR:CHEMIST]
[SCHOLAR:GEOGRAPHER]
[SCHOLAR:DOCTOR]
[SCHOLAR:ENGINEER]
[GENERATE_KEYBOARD_INSTRUMENTS]
[GENERATE_STRINGED_INSTRUMENTS]
[GENERATE_WIND_INSTRUMENTS]
[GENERATE_PERCUSSION_INSTRUMENTS]
[GENERATE_POETIC_FORMS]
[GENERATE_MUSICAL_FORMS]
[GENERATE_DANCE_FORMS]
[VALUE:KNOWLEDGE:15]
4. Make plants slurriable. You need to modify lots of plant entries for this, but for testing purposes, you can just open plant_standard.txt, find the pig tails entry and replace it with this:
[PLANT:GRASS_TAIL_PIG]
[NAME:pig tail][NAME_PLURAL:pig tails][ADJ:pig tail]
[USE_MATERIAL_TEMPLATE:STRUCTURAL:STRUCTURAL_PLANT_TEMPLATE]
[MATERIAL_VALUE:2]
[MATERIAL_REACTION_PRODUCT:DRINK_MAT:LOCAL_PLANT_MAT:DRINK]
[MATERIAL_REACTION_PRODUCT:SEED_MAT:LOCAL_PLANT_MAT:SEED]
[MATERIAL_REACTION_PRODUCT:PRESS_PAPER_MAT:LOCAL_PLANT_MAT:THREAD]
[BASIC_MAT:LOCAL_PLANT_MAT:STRUCTURAL]
[PICKED_TILE:231][PICKED_COLOR:7:0:0]
[GROWDUR:300][VALUE:2]
[USE_MATERIAL_TEMPLATE:DRINK:PLANT_ALCOHOL_TEMPLATE]
[STATE_NAME_ADJ:ALL_SOLID:frozen dwarven ale]
[STATE_NAME_ADJ:LIQUID:dwarven ale]
[STATE_NAME_ADJ:GAS:boiling dwarven ale]
[MATERIAL_VALUE:2]
[DISPLAY_COLOR:7:0:0]
[EDIBLE_RAW]
[EDIBLE_COOKED]
[PREFIX:NONE]
[DRINK:LOCAL_PLANT_MAT:DRINK]
[USE_MATERIAL_TEMPLATE:SEED:SEED_TEMPLATE]
[MATERIAL_VALUE:1]
[EDIBLE_VERMIN]
[EDIBLE_COOKED]
[SEED:pig tail seed:pig tail seeds:0:0:1:LOCAL_PLANT_MAT:SEED]
[SUMMER][AUTUMN]
[FREQUENCY:100]
[CLUSTERSIZE:5]
[USE_MATERIAL_TEMPLATE:THREAD:THREAD_PLANT_TEMPLATE]
[STATE_NAME_ADJ:SOLID:pig tail]
[STATE_NAME_ADJ:SOLID_PASTE:pig tail slurry]
[STATE_NAME_ADJ:SOLID_PRESSED:pig tail paper]
[PREFIX:NONE]
[REACTION_CLASS:PAPER_SLURRY]
[MATERIAL_VALUE:2]
[THREAD:LOCAL_PLANT_MAT:THREAD]
[PREFSTRING:twisting stalks]
[WET][DRY]
[BIOME:SUBTERRANEAN_WATER]
[UNDERGROUND_DEPTH:1:3]
[SHRUB_TILE:58]
[DEAD_SHRUB_TILE:58]
[SHRUB_COLOR:7:0:0]
[DEAD_SHRUB_COLOR:0:0:1]
That should be enough to get paper. I'll get the rest of the raw edits up for getting things like quicklime (which doesn't work right) posted and see if anyone beyond me actually cares about this.