- 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.
Difference between revisions of "23a:Item quality"
(2 intermediate revisions by the same user not shown) | |||
Line 96: | Line 96: | ||
|- | |- | ||
|22 || ''Legendary+7''**|| || || || || 70.7% || 29.3% ||7.053||0.093 | |22 || ''Legendary+7''**|| || || || || 70.7% || 29.3% ||7.053||0.093 | ||
+ | |- | ||
+ | |23 || ''Legendary+8''***|| || || || || 69.3% || 30.7% ||7.146||0.093 | ||
+ | |- | ||
+ | |24 || ''Legendary+9''***|| || || || || 68.0% || 32.0% ||7.24||0.093 | ||
+ | |- | ||
+ | |25 || ''Legendary+10''***|| || || || || 66.7% || 33.3% ||7.333||0.093 | ||
|} | |} | ||
:''(* Proficient is the highest level a dwarf can have at embark.)'' | :''(* Proficient is the highest level a dwarf can have at embark.)'' | ||
:''(** Legendary+6 and Legendary+7 can '''only''' be reached by making items that coincide with the dwarf's preferences)'' | :''(** Legendary+6 and Legendary+7 can '''only''' be reached by making items that coincide with the dwarf's preferences)'' | ||
+ | :''(** Legendary+8 thru Legendary+10 are only relevant for certain non-crafting-related skills, such as Farming, Fishing, and Plant Gathering)'' | ||
::''(The above table is based on the formula discovered by [[User:0x517A5D|0x517A5D]])'' | ::''(The above table is based on the formula discovered by [[User:0x517A5D|0x517A5D]])'' | ||
Line 117: | Line 124: | ||
According to inspections of the memory values, it seems that artifacts have a quality of 5. | According to inspections of the memory values, it seems that artifacts have a quality of 5. | ||
+ | |||
+ | :::::::::''Full code breakdown here:'' | ||
+ | {{Spoil small|Here is Quietust's disassembly and analysis of version 0.23.130.23a:<br /><br /> | ||
+ | |||
+ | --------------------------------------------------------------------------------- | ||
+ | <nowiki> | ||
+ | ; First, check what skill is being used | ||
+ | push 1 ; ignore_building | ||
+ | mov ecx, ebx ; job * | ||
+ | call job_getSkill | ||
+ | |||
+ | ; Next, get the level of that skill, if there is one (if not, it will use 0 instead) | ||
+ | mov edi, [esp+2Ch+maker] | ||
+ | push eax ; skill | ||
+ | mov ecx, edi ; unit * | ||
+ | call unit_getSkillLevel | ||
+ | |||
+ | ; Cap the skill level to a maximum of 20 | ||
+ | mov esi, eax | ||
+ | cmp esi, 20 | ||
+ | mov [ebp+item_craftedst.skill_level], si | ||
+ | jle short loc_5DC657 | ||
+ | mov esi, 20 | ||
+ | |||
+ | ; Check if the item's type/subtype match any Item preferences in the maker | ||
+ | loc_5DC657: | ||
+ | mov eax, [ebp+itemst.vftable] | ||
+ | push 1 ; activatePrefs | ||
+ | push -1 ; matgloss | ||
+ | push -1 ; material | ||
+ | mov ecx, ebp | ||
+ | call [eax+vtable_item.getSubtype] | ||
+ | mov edx, [ebp+itemst.vftable] | ||
+ | push eax ; item_subtype | ||
+ | mov ecx, ebp | ||
+ | call [edx+vtable_item.getType] | ||
+ | push eax ; item_type | ||
+ | push LikeItem ; prefType | ||
+ | mov ecx, edi ; unit * | ||
+ | call unit_likesItem | ||
+ | test al, al | ||
+ | jz short loc_5DC67C | ||
+ | inc esi ; if so, increase skill level by 1 | ||
+ | |||
+ | ; Check if the item's material/matgloss match any Material preferences in the maker | ||
+ | loc_5DC67C: | ||
+ | mov ax, [ebp+item_craftedst.material] | ||
+ | cmp ax, 0FFFFh ; skip if item has no material | ||
+ | jz short loc_5DC6A0 | ||
+ | mov cx, [ebp+item_craftedst.matgloss] | ||
+ | push 1 ; activatePrefs | ||
+ | push ecx ; matgloss | ||
+ | push eax ; material | ||
+ | push -1 ; item_subtype | ||
+ | push -1 ; item_type | ||
+ | push LikeMaterial ; prefType | ||
+ | mov ecx, edi ; unit * | ||
+ | call unit_likesItem | ||
+ | test al, al | ||
+ | jz short loc_5DC6A0 | ||
+ | inc esi ; if so, increase skill level by 1 | ||
+ | |||
+ | ; We roll a d5 and compare the result with the creator's skill level. | ||
+ | ; (Technically, we compare d5 - 1 against skill_level - 1.) | ||
+ | loc_5DC6A0: | ||
+ | push 5 ; max | ||
+ | mov [ebp+item_craftedst.quality], 0 | ||
+ | call trandom ; generate number from 0-4 | ||
+ | add esp, 4 | ||
+ | cmp eax, esi | ||
+ | jge short loc_5DC6B8 | ||
+ | ; If the random number was less than | ||
+ | ; the skill level, increment quality | ||
+ | inc [ebp+item_craftedst.quality] | ||
+ | |||
+ | ; Now we roll a d10 and compare. It's important to note that the roll | ||
+ | ; of the d10 is independent, not conditional, of the roll of the d5. | ||
+ | |||
+ | loc_5DC6B8: | ||
+ | push 10 ; max | ||
+ | call trandom | ||
+ | add esp, 4 | ||
+ | cmp eax, esi | ||
+ | jge short loc_5DC6CA | ||
+ | ; If d10 < skill, bump quality | ||
+ | inc [ebp+item_craftedst.quality] | ||
+ | |||
+ | loc_5DC6CA: ; Same thing for a d15 | ||
+ | push 15 ; max | ||
+ | call trandom | ||
+ | add esp, 4 | ||
+ | cmp eax, esi | ||
+ | jge short loc_5DC6DC | ||
+ | ; If d15 < skill, bump quality | ||
+ | inc [ebp+item_craftedst.quality] | ||
+ | |||
+ | loc_5DC6DC: ; Same thing for a d20 | ||
+ | push 20 ; max | ||
+ | call trandom | ||
+ | add esp, 4 | ||
+ | cmp eax, esi | ||
+ | jge short loc_5DC6EE | ||
+ | ; If d20 < skill, bump quality | ||
+ | inc [ebp+item_craftedst.quality] | ||
+ | |||
+ | loc_5DC6EE: ; Now we roll a d25 | ||
+ | push 25 ; max | ||
+ | call trandom | ||
+ | add esp, 4 | ||
+ | cmp eax, esi ; Compare against skill, | ||
+ | jge short loc_5DC70E | ||
+ | push 3 ; max | ||
+ | call trandom ; AND roll a d3 | ||
+ | add esp, 4 | ||
+ | test eax, eax | ||
+ | ; The d3 result must be 1. | ||
+ | ; (Technically, d3-1 is tested against 0.) | ||
+ | jnz short loc_5DC70E | ||
+ | ; If d25 < skill AND d3 = 1, bump | ||
+ | inc [ebp+item_craftedst.quality] | ||
+ | |||
+ | loc_5DC70E: | ||
+ | cmp [ebp+item_craftedst.quality], 5 | ||
+ | jnz loc_5DC7EC | ||
+ | ... | ||
+ | mov dword ptr [esp+2Ch+__$EHRec$.state], eax | ||
+ | lea eax, [esp+2Ch+message] | ||
+ | push eax ; str | ||
+ | push edi ; name | ||
+ | call formatLanguageName | ||
+ | mov edi, offset aHasCreatedAMas ; " has created a masterpiece!" | ||
+ | ... | ||
+ | </nowiki> | ||
+ | }} | ||
==Effects of Quality== | ==Effects of Quality== | ||
Line 126: | Line 267: | ||
===Food=== | ===Food=== | ||
− | Higher quality [[prepared meals]] give | + | Higher quality [[prepared meals]] give dwarves who consume them more [[thought|happiness]]. |
===Furniture=== | ===Furniture=== |
Latest revision as of 17:12, 13 December 2023
This article is about an older version of DF. |
Also see Item designations.
All items in the game have a base value, which is multiplied by what material the item is made of and by the item's quality. Decorations (such as bone, gems, and studding) further increase the value.
Item quality can have an effect on an item's properties, especially armor and weapons.
Rooms also have a "quality grade" which determines their value in the eyes of those owning/using the room, which is the sum of the objects placed within their designated area plus the materials that surround it plus improvements (such as engraving) to those materials. See room for a more complete discussion of these values, and How do I increase the value of a room for a complete list of options.
Quality grades[edit]
All crafted items (furniture, armor, bolts, etc.) – but not intermediate materials (bars, blocks, etc. except cloth, which does have quality levels) – are bracketed by characters that show the quality of their craftsdwarfship. Dyeing also has a quality level, as does decorating (with gems, leathers, cloth, etc). Prepared foods have quality levels, but simple foods and drinks do not.
Designation | Description | Value Modifier |
Damage / To-Hit / Armor Modifier |
---|---|---|---|
Item Name | — | ×1 | ×1.0 |
-Item Name- | Well-crafted | ×2 | ×1.2 |
+Item Name+ | Finely-crafted | ×3 | ×1.4 |
*Item Name* | Superior quality | ×4 | ×1.6 |
≡Item Name≡ | Exceptional | ×5 | ×1.8 |
☼Item Name☼ | Masterful | ×12 | ×2.0 |
Unique name | Artifact | ×120 | ×2.0 |
Masterpiece[edit]
A masterpiece is more than the highest normal quality and value - it is an artistic expression that is of great importance to the dwarf who created it.
When a masterful quality item is created, the game will announce, "<dwarf> has created a masterpiece!" The loss, destruction or theft of such a masterpiece will cause the dwarf that created it a very unhappy thought. Trading a masterpiece item to merchants is always safe. Masterpiece meals can be eaten safely, although allowing the food to rot will provoke the same response as theft or destruction. Using masterpiece bolts will not cause a tantrum, even if the bolts break - however, losing a bolt, even one left on the battlefield, will. So if a kobold or wild animal steals a used masterpiece bolt which was lying around, or misses its target and falls into the chasm or is melted by "the impertinent magma", this also counts as defacement, and the maker's mood will decrease drastically.
Since legendary dwarves are most likely to be the ones creating masterpieces, keeping these creations safe should be high priority; tantruming legendary dwarves can be very difficult to subdue (as was discovered the hard way in Boatmurdered).
Artifacts[edit]
Artifact items have a unique name instead of bracketing symbols and are worth 120x base value. Unlike masterpiece items, losing an artifact will not result in unhappiness unless the current owner is obsessed with it - in this case, losing the artifact will cause said dwarf to go insane. According to inspections of the memory values, it seems that artifacts have the same quality value as masterpiece items. It is unclear if this is true for weapons/armor or not - opinions differ as to whether artifact weapons and armor have a 2.0 multiplier or something higher; nothing has been found in the game code to support such, but observation suggests otherwise.
Skill and quality levels[edit]
Tradesdwarves of higher skill levels will tend to produce items of higher quality. Looking at the table below, we see that "Dabbling" dwarves never (without an applicable preference) produce anything above a basic "no quality" item, Proficient dwarves (the highest possible skill level at embark) always produce at least some quality and usually +Finely Crafted items+, while legendary dwarves usually (65% of the time) produce ≡Exceptional items≡, and the best legendary dwarves produce nothing less than ≡Exceptional≡ and produce ☼Masterful items☼ approximately 27% of the time.
Preferences for particular materials and/or objects make a considerable difference in the odds of producing better quality items - specifically, matching item preferences and matching material preferences each provide a +1 skill level boost, possibly beyond Legendary+5.
Lvl | Skill of dwarf | No quality | -Well-crafted- | +Finely-crafted+ | *Superior quality* | ≡Exceptional≡ | ☼Masterful☼ | Average Value Multiplier |
Jump in Average Value |
---|---|---|---|---|---|---|---|---|---|
0 | Dabbling | 100.0% | 1.000 | ||||||
1 | Novice | 63.0% | 31.4% | 5.2% | 0.38% | 0.01% | 0.000089% | 1.430 | 0.430 |
2 | Adequate | 36.4% | 44.1% | 16.7% | 2.6% | 0.16% | 0.0028% | 1.860 | 0.430 |
3 | Competent | 18.3% | 43.8% | 29.4% | 7.7% | 0.79% | 0.022% | 2.291 | 0.431 |
4 | Skilled | 6.7% | 35.6% | 39.4% | 15.8% | 2.4% | 0.091% | 2.725 | 0.434 |
5 | Proficient* | 23.3% | 44.4% | 26.4% | 5.6% | 0.28% | 3.167 | 0.441 | |
6 | Talented | 15.5% | 41.5% | 33.3% | 9.2% | 0.58% | 3.415 | 0.248 | |
7 | Adept | 9.4% | 36.3% | 39.2% | 14.0% | 1.1% | 3.674 | 0.259 | |
8 | Expert | 5.0% | 29.7% | 43.5% | 20.0% | 1.8% | 3.949 | 0.275 | |
9 | Professional | 1.9% | 22.2% | 45.8% | 27.2% | 2.9% | 4.245 | 0.296 | |
10 | Accomplished | 14.4% | 45.6% | 35.6% | 4.4% | 4.567 | 0.322 | ||
11 | Great | 10.2% | 42.4% | 41.4% | 5.9% | 4.785 | 0.218 | ||
12 | Master | 6.7% | 38.2% | 47.4% | 7.7% | 5.021 | 0.236 | ||
13 | High Master | 3.9% | 33.0% | 53.3% | 9.8% | 5.276 | 0.255 | ||
14 | Grand Master | 1.6% | 26.9% | 59.2% | 12.2% | 5.552 | 0.276 | ||
15 | Legendary | 20.0% | 65.0% | 15.0% | 5.850 | 0.298 | |||
16 | Legendary+1 | 15.7% | 67.2% | 17.1% | 6.037 | 0.187 | |||
17 | Legendary+2 | 11.6% | 69.1% | 19.3% | 6.233 | 0.195 | |||
18 | Legendary+3 | 7.6% | 70.8% | 21.6% | 6.436 | 0.203 | |||
19 | Legendary+4 | 3.7% | 72.2% | 24.1% | 6.647 | 0.211 | |||
20 | Legendary+5 | 73.3% | 26.7% | 6.867 | 0.219 | ||||
21 | Legendary+6** | 72.0% | 28.0% | 6.96 | 0.093 | ||||
22 | Legendary+7** | 70.7% | 29.3% | 7.053 | 0.093 | ||||
23 | Legendary+8*** | 69.3% | 30.7% | 7.146 | 0.093 | ||||
24 | Legendary+9*** | 68.0% | 32.0% | 7.24 | 0.093 | ||||
25 | Legendary+10*** | 66.7% | 33.3% | 7.333 | 0.093 |
- (* Proficient is the highest level a dwarf can have at embark.)
- (** Legendary+6 and Legendary+7 can only be reached by making items that coincide with the dwarf's preferences)
- (** Legendary+8 thru Legendary+10 are only relevant for certain non-crafting-related skills, such as Farming, Fishing, and Plant Gathering)
- (The above table is based on the formula discovered by 0x517A5D)
The math behind the curtain[edit]
The in-game calculations to determine final quality of a product work like this: first, a skill level is computed, directly related to the dabbling through legendary+5 indicators and preferences of the particular crafter. "No skill" or dabbling is 0, proficient is 5, legendary is 15, etc. Skill levels are capped at 20, then item/material preference bonuses are added (so Legendary +5 will produce Masterpieces more often in their preferences).
Item quality is set to 0.
Then dice are rolled. Each roll is independent; all rolls are made even if a previous roll fails.
- If d5 < skill level, quality of final product is bumped.
- If d10 < skill level, quality is bumped.
- If d15 < skill level, quality is bumped.
- If d20 < skill level, quality is bumped.
- If d25 < skill level and d3 == 1, quality is bumped.
This gives the 6 quality levels (0 to 5).
According to inspections of the memory values, it seems that artifacts have a quality of 5.
- Full code breakdown here:
Here is Quietust's disassembly and analysis of version 0.23.130.23a: ; First, check what skill is being used push 1 ; ignore_building mov ecx, ebx ; job * call job_getSkill ; Next, get the level of that skill, if there is one (if not, it will use 0 instead) mov edi, [esp+2Ch+maker] push eax ; skill mov ecx, edi ; unit * call unit_getSkillLevel ; Cap the skill level to a maximum of 20 mov esi, eax cmp esi, 20 mov [ebp+item_craftedst.skill_level], si jle short loc_5DC657 mov esi, 20 ; Check if the item's type/subtype match any Item preferences in the maker loc_5DC657: mov eax, [ebp+itemst.vftable] push 1 ; activatePrefs push -1 ; matgloss push -1 ; material mov ecx, ebp call [eax+vtable_item.getSubtype] mov edx, [ebp+itemst.vftable] push eax ; item_subtype mov ecx, ebp call [edx+vtable_item.getType] push eax ; item_type push LikeItem ; prefType mov ecx, edi ; unit * call unit_likesItem test al, al jz short loc_5DC67C inc esi ; if so, increase skill level by 1 ; Check if the item's material/matgloss match any Material preferences in the maker loc_5DC67C: mov ax, [ebp+item_craftedst.material] cmp ax, 0FFFFh ; skip if item has no material jz short loc_5DC6A0 mov cx, [ebp+item_craftedst.matgloss] push 1 ; activatePrefs push ecx ; matgloss push eax ; material push -1 ; item_subtype push -1 ; item_type push LikeMaterial ; prefType mov ecx, edi ; unit * call unit_likesItem test al, al jz short loc_5DC6A0 inc esi ; if so, increase skill level by 1 ; We roll a d5 and compare the result with the creator's skill level. ; (Technically, we compare d5 - 1 against skill_level - 1.) loc_5DC6A0: push 5 ; max mov [ebp+item_craftedst.quality], 0 call trandom ; generate number from 0-4 add esp, 4 cmp eax, esi jge short loc_5DC6B8 ; If the random number was less than ; the skill level, increment quality inc [ebp+item_craftedst.quality] ; Now we roll a d10 and compare. It's important to note that the roll ; of the d10 is independent, not conditional, of the roll of the d5. loc_5DC6B8: push 10 ; max call trandom add esp, 4 cmp eax, esi jge short loc_5DC6CA ; If d10 < skill, bump quality inc [ebp+item_craftedst.quality] loc_5DC6CA: ; Same thing for a d15 push 15 ; max call trandom add esp, 4 cmp eax, esi jge short loc_5DC6DC ; If d15 < skill, bump quality inc [ebp+item_craftedst.quality] loc_5DC6DC: ; Same thing for a d20 push 20 ; max call trandom add esp, 4 cmp eax, esi jge short loc_5DC6EE ; If d20 < skill, bump quality inc [ebp+item_craftedst.quality] loc_5DC6EE: ; Now we roll a d25 push 25 ; max call trandom add esp, 4 cmp eax, esi ; Compare against skill, jge short loc_5DC70E push 3 ; max call trandom ; AND roll a d3 add esp, 4 test eax, eax ; The d3 result must be 1. ; (Technically, d3-1 is tested against 0.) jnz short loc_5DC70E ; If d25 < skill AND d3 = 1, bump inc [ebp+item_craftedst.quality] loc_5DC70E: cmp [ebp+item_craftedst.quality], 5 jnz loc_5DC7EC ... mov dword ptr [esp+2Ch+__$EHRec$.state], eax lea eax, [esp+2Ch+message] push eax ; str push edi ; name call formatLanguageName mov edi, offset aHasCreatedAMas ; " has created a masterpiece!" ... |
Effects of Quality[edit]
Most obviously, quality influences the monetary worth of an object, for purposes of trading and determining price (the latter once economy starts). Destruction of a masterwork will also cause relevant unhappiness. However, for some items, quality may also influence other things.
Note that this is not a complete list.
Food[edit]
Higher quality prepared meals give dwarves who consume them more happiness.
Furniture[edit]
Because room quality is based on total value of the furniture in a room, high-quality furniture will result in high quality rooms, which provide more satisfaction for the occupants.
Weapons[edit]
To quote Toady:
The quality of any weapon, including crossbows used as launchers, affects the skill of the shooter. I think this even leads to obscene things like master crossbows + master bolts causing recruits to shoot like legends. In general, if the quality Q is from 0 to 5, the skill is modified according to
Skillnew = Skilloriginal × (1.0 + 0.2 × Q) + Q
This is pretty extreme and will probably be reduced for all weapons.
See this chart for the exact levels:
Note: This chart is out of date/wrong due to the facts that the integer that represents a specific skill level is not known, how the formula rounds is not known, and the fact that higher legendaries exist is known.
Result for | Well-crafted | Finely-crafted | Superior quality | Exceptional | Masterful |
---|---|---|---|---|---|
Dabbling | Novice | No-label | Competent | Skilled | Proficient |
Novice | No label | Competent | Skilled | Proficient | Adept |
No label | Competent | Skilled | Talented | Adept | Professional |
Competent | Skilled | Talented | Adept | Professional | Great |
Skilled | Proficient | Adept | Professional | Great | High Master |
Proficient | Adept | Professional | Great | High Master | Legendary |
Talented | Expert | Accomplished | Master | Grand Master | Legendary |
Adept | Professional | Great | Grand Master | Legendary | Legendary |
Expert | Accomplished | High Master | Legendary | Legendary | Legendary |
Professional | Great | Grand Master | Legendary | Legendary | Legendary |
Accomplished | High Master | Legendary | Legendary | Legendary | Legendary |
Great | Grand Master | Legendary | Legendary | Legendary | Legendary |
Master+ | Legendary | Legendary | Legendary | Legendary | Legendary |
If this is true, then it would be possible to:
- Train a couple dozen skilled miners
- Give them exceptional picks
- Draft them and give them decent armor
- Kill a goblin siege with a couple dozen legendary speardwarves (picks = 70% damage spears) as long as there are no enemy champions to destroy your armour/shield/wrestling inept speardwarves