INTRODUCTION
The effectiveness of bolts made out of various materials is a common topic of discussion among the DF population [1] (http://www.bay12forums.com/smf/index.php?topic=115441.msg3558572#msg3558572) [2] (http://www.bay12forums.com/smf/index.php?topic=115683.msg3571409#msg3571409). There are a some sources which already address the effects of forging weapons and armor out of the different materials [3] (http://dwarffortresswiki.org/index.php/DF2012:Weapon#Material), as well as mention the effectiveness of various types of bolts [4] (http://dwarffortresswiki.org/index.php/Bolt). However, up till now no definitive comparison study was performed to obtain and organize a large amount of empirical data. The aim of this study is to rectify this gap by:
- Designing an objective (insofar as that is possible) experimental setup
- Obtaining a large amount of experimental results
- Analyzing the obtained data using suitable criteria and basic statistical analysis
METHODOLOGY
The core of the experiment was based on the setup used in this Author's previous study [5] (http://www.bay12forums.com/smf/index.php?topic=115683.msg3570590#msg3570590). However, the number of single experimental cells was expanded from a 10 by 10 matrix (100 cells) to a 50 by 20 matrix (1000 cells). Increasing the amount of experimental data by an order of magnitude will improve the accuracy of the obtained results.
Each cell consists of two arena dwarfs separated by a fortification tile. One arena dwarf is the assailant (team A) whilst the other is the defender (team D). Arena dwarfs are a modified version of common dwarfs, differing from their brethren in two aspects:
- Arena dwarfs exhibit no size variations
- Arena dwarfs exhibit 100 times slower skill growth
Arena dwarf modifications code
Average size enforcement:
[BODY_APPEARANCE_MODIFIER:HEIGHT:100:100:100:100:100:100:100]
[APP_MOD_IMPORTANCE:500]
[BODY_APPEARANCE_MODIFIER:BROADNESS:100:100:100:100:100:100:100]
[APP_MOD_IMPORTANCE:500]
Stunted skill rate:
[SKILL_RATES:1:8:8:16]
This naturally eliminates dwarf size and skill gain as factors affecting the results of the study. The parameters of both team A and team D are shown in the table below.
| | Team A | | Team D |
Weapon: | | Cedar crossbow | | None |
Ammo: | | 100 [varies] bolts | | None |
Armor: | | None | | Varies |
Skills: | | Archer: Proficient | Marksdwarf: Proficient | | None | |
Two parameters were varied during the course of the study: the material of the bolts fired by Team A and the material of the armor donned by Team D. All major materials were tested for both these items. The complete list is given below
Bolts: Candy, Steel, Iron, Bronze, Copper, Silver, Fake bone, Wood (birch).
Armor: Candy, Steel, Iron, Bronze, Copper, Leather, None
Note: Bone bolts could not be generated in the Arena using standard setting, so a fake bone inorganic material based on the bone tissue template was created as a substitute. It is uncertain how closely fake bone bolts resemble in-game ones. The code for fake bone is provided below.
[INORGANIC:FAKE_BONE]
[USE_MATERIAL_TEMPLATE:METAL_TEMPLATE]
[STATE_NAME_ADJ:ALL_SOLID:fake bone]
[STATE_NAME_ADJ:LIQUID:molten fake bone]
[STATE_NAME_ADJ:GAS:boiling kafe bone]
[DISPLAY_COLOR:7:0:1]
[BUILD_COLOR:7:0:1]
[MATERIAL_VALUE:1]
[SPEC_HEAT:1000]
[ITEMS_WEAPON][ITEMS_WEAPON_RANGED][ITEMS_AMMO][ITEMS_DIGGER][ITEMS_ARMOR][ITEMS_ANVIL]
[ITEMS_HARD]
[ITEMS_METAL]
[ITEMS_BARRED]
[ITEMS_SCALED]
[SOLID_DENSITY:500]
[IMPACT_YIELD:200000]
[IMPACT_FRACTURE:200000]
[IMPACT_STRAIN_AT_YIELD:100]
[COMPRESSIVE_YIELD:200000] cortical bone
[COMPRESSIVE_FRACTURE:200000]
[COMPRESSIVE_STRAIN_AT_YIELD:100]
[TENSILE_YIELD:115000]
[TENSILE_FRACTURE:130000]
[TENSILE_STRAIN_AT_YIELD:100]
[TORSION_YIELD:115000]
[TORSION_FRACTURE:130000]
[TORSION_STRAIN_AT_YIELD:100]
[SHEAR_YIELD:115000] used 'bone (limb)' from wikipedia tensile strength
[SHEAR_FRACTURE:130000]
[SHEAR_STRAIN_AT_YIELD:100]
[BENDING_YIELD:115000]
[BENDING_FRACTURE:130000]
[BENDING_STRAIN_AT_YIELD:100]
[MAX_EDGE:1000]
[STATE_COLOR:ALL_SOLID:WHITE]
Note 2: Team D dwarfs armored in metal were equipped with breastplate, chain mail shirt, greaves, helm, a pair of gauntlets and pair of high boots, all made from the metal being tested. Team D dwarfs armored in leather were equipped with armor, leggings, helm, a pair of gloves and pair of high boots, all made from cow leather. Unarmored Team D arena dwarfs were left naked (no clothes as well).
Criteria
There is no generally accepted, clear criterion for judging a weapons/armors effectiveness in the DF community. The Author took the liberty of defining his own criteria, defined below:
Average of bolts fired - this criterion is based on the average number of bolts fired in order to kill a dwarf. This is a fairly unambiguous criterion ans can be easily obtained by dividing the number of bolts fired over the course of a single experiment by the number of dwarfs participating (under the tacit assumption that all dwarfs were killed). Example: if 12123 bolts were fired in a standard-sized experiment, killing all 1000 Team D dwarfs, than the Average of bolts fired is 12.12 (rounded to the second decimal)
The average of bolts fired, while a simple and convenient general criterion, does not fully express the effectiveness of the crossbow used in a combat situation. The modus operandi of dwarven tacticians is to utilize the crossbows cover fire in order to incapacitate the enemy, and then move in with a melee unit in order to deliver an elegant coup de grace to those left unconscious and/or writhing in pain. Thus, in many cases the Marksdwarfs will not have the chance to empty their quivers and a criterion based on such an assumption is effectively useless. To remedy this, two other criteria were formed:
Lethality-N - probability that a dwarf is killed after the Nth volley. This experiment is more ambiguous. in fact, for it to be properly executed it would be required all Team A members should be given no more than N-bolts. However, due to the massive amount of time and effort required to set up even a single 1000-sample experiment, it was decided that the results from the 100 bolt tests would be used, introducing slight inaccuracy. Head shots have a more prominent effect on this criterion (because they are instantaneous) than Spine shots and Throat/Heart shots (because they are time-delayed). Example: if after 3 volleys fired in a standard-sized experiment, 100 of the 1000 dwarfs are
killed, then the 3-Lethality of Team A's weapon against team D's Armor is 10%.
Suppression-N - probability that a dwarf is incapacitated (either killed or left unconscious) after the Nth volley. One more, this is a fairly ambiguous criterion - partly because it inherits the ambiguity of lethality-N, and partly because the term "incapacitation" can be differently defined. For example, a dwarf who loses his weapon can also be called incapacitated, since his offensive power is greatly reduced. A retching and vomiting dwarf is also said to have reduced combat capability. However, it was decided that only death and unconsciousness would be included as they are the most powerful indicators of the ability of crossbow fire to suppress an attacking force. Example: if after 3 volleys fired in a standard-sized experiment, 100 dwarfs are dead and 500 dwarfs are unconscious out of the initial 1000, then the 3-Suppression of Team A's weapon against team D's Armor is 60%.
The results were gathered by running amateurish scripts of the Author's design on the gamelog files. Certain inaccuracies might have emerged due to poor programming design. If such inaccuracies are found, they will be edited and rectified at a later date. Data pertaining to other interesting criteria (wound types) were gathered, but they will not be considered in the study proper. Interesting additional data will be added as an addendum.
RESULTS
When discussing particular experiments, the phrase "Material A vs Material B" will imply "Bolts vs Armor" e.g.: "Steel vs Bronze" refers to the "Steel Bolts vs Bronze Armor" experiment.
The figure below presents the Average of Bolts Fired for various bolts and armors:
Average of Bolts Fired (per dwarf killed)
(http://img443.imageshack.us/img443/5623/averagebolts.png)
Note: Lack of a bar means that all participants of the experiment survived, resulting in an very unhelpful average of 100. These bars were removed from the figure to better see the remaining results
A number of interesting facts can be drawn from these results:
- The majority of the average number of bolts fired form two levels: When used against armor made out of a material "worse" than the bolt itself, the average number is around 12-14. When used against armor made out of a material equal to or "better" than the bolt itself, the average number of bolts is around 16-19.
- Candy bolts have a fairly stable effectiveness against all types of armor (an average of around 14), except for candy armor itself, against which they are completely useless
- Wood and bone is better against candy armor than candy bolts
- Wood has no effect on steel, iron, bronze or copper armor
- Candy armor fairs worse against silver bolts, but only by a small margin
- Fake bone bolts are generally worse than all metal bolts, but still deal lethal damage (eventually) against all armor types, unlike wood
Next, Supression-1 is presented (lethality-1 had too few samples to obtain obtain results)
Probability that a dwarf is incapacitated after the first shot
(http://img837.imageshack.us/img837/8263/suppression1.png)
Once more, observations are listed below:
- Bolts of all metals except for candy exhibit high suppressive ability (in the range of 30-35%) against all armor types. What is more, this value does not vary for leather-armored and unarmored arena dwarfs.
- The suppressive ability of candy bolts is significantly lower than other metals (in the 25% range)
- Wood and bone bolts have a suppressive ability of around 20-25% of unarmored and leather-armored targets
- Bone bolts provide significantly less suppression against steel-armored and candy-armored targets
- Wooden bolts offer little to no suppression against any metal armor (with the exception of candy, which is in the 2% range)
- Silver bolts have the highest suppressive abilities, reaching 35-38%. Note: They are also the heaviest
Finally, Lethality-3 and Suppression-3 are presented (3 is the assumed number of shots a Marksdwarf can launch before an enemy reaches him/her)
Probability that a dwarf is killed after the third shot
(http://img846.imageshack.us/img846/3923/lethality3.png)
Probability that a dwarf is incapacitated after the third shot
(http://img694.imageshack.us/img694/3265/suppression3.png)
Observations:
- Lethality is difficult to estimate due to large variations of in values obscuring any patterns. Suppression also includes the number of unconscious dwarfs, giving a larger sample base. In general, lethality-3 for most bolts reached 10%
- The suppressive ability of most bolts ranges around 65% by the third volley. Variation is small among metal bolts and no type of bolt is clearly superior (silver and steel seem to be a few percent ahead of the rest)
- Bone bolts exhibit an expected drop off of suppressive ability against steel and candy armor
- Wooden bolts remain useless against metal armor. However, there suppressive ability against unarmored and leather-armored opponents are almost as good as that of metal bolts.
CONCLUSIONS
- Wooden bolts should generally be used only against unarmored or leather armored targets. Metal armor renders them useless, except for candy armor, against which they are merely bad.
- Bone bolts have the potential to kill any armored unit, however they become increasingly ineffective against "better" armors. Steel armor would be the cut off. However, against iron armor and lower they rival metal bolts in suppressive ability.
- Metal bolts (except for candy) are universally good against all types of armored and unarmored opponents. Although there are small scale differences between their performance (heavier bolts like those made of silver seem to have higher suppressive ability), these are not enough to strongly recommend one type over the other.
- Candy bolts are not amazingly better against armored opponents than other metal bolts. In fact, they can be described as "average" in most respects. They are also completely ineffective against candy armor.
This addendum was compiled from additional data gained during the course of the study, but not directly related to its subject. Since I think they are pretty interesting on their own, I thought I'd share them as well, in a separate, more casual post.
Values are normalized as "percentage of total hits" unless stated otherwise.
NON-WOUND EVENTS
This covers all bolt-dwarf interactions which did not result in the latter being wounded.
Deflections
Deflections occured exclusively for Candy vs Candy, Bone vs Candy, Bone vs Steel and Wood vs Any Metal. No other deflection occurred ANYWHERE. I hypothesize that deflection requires two conditions to be satisfied:
- The armor having a higher value of [SHEAR YIELD] than the bolt. Some information on shear yield is helpfully provided by Urist da Vinci here (http://www.bay12forums.com/smf/index.php?topic=115683.msg3572388#msg3572388)
- The bolt being very light OR the material of the bolt being far less dense than the material of the armor
It is certain for now that only light bolts (wood, bone, candy) appear to deflect at all. An interesting question is whether a heavy metal (e.g. iron) bolt could be made to deflect of armor without modifying the bolts weight, only, say, the armors density, or some other parameter.
Glance Offs
A bolt was reported to "glance off" a body part exactly 54 times, and each time it was off of an eyelid or eyeball. I do wonder how that works, exactly.
Misses
There were exactly 84 misses during the whole experiment, and how they happened is anybodies guess. Theoretically, the dwarfs have no maneuverability, so they can't jump away from attacks. Alas, no setup is perfect.
WOUND TYPES
This covers a part of the wound type analysis. For each direct hit (not a deflection, glance off or miss) a single, most critical wound caused by this hit was chosen. Since the process was automated, there might be some inaccuracies present in the data. The script qualified wound types in the following order of superiority:
Brain tear > Heart tear > Throat tear > Up/Mid Spine Tear > Up/Mid Spine Bruise > Low Spine Tear > Low Spine Bruise > Severe > Shatter > Fracture > Jam > Tear > Chip > Bruise
Absolute priority was given to lethal injuries (from Brain Tear to Up/Mid Spine bruise), then Lower spine injuries, and then the rest. In a majority of cases Edge and Blunt injuries rarely occur together, and the cases they do are accounted for already (e.g. A head shot causes muscle tearing, skull shattering and brain tearing, but only brain tearing is registered). Some interesting results are given:
Bruises/Tears and Chips/Jams
For each bolt type (except candy bolts) their existed a clear transition between the dominance of bruising wounds and tearing wounds. This of course is due to the armor type changing from equal to or "better" than the bolt to "worse" than the bolt. The point of transition is marked by the sudden appearance of jams, which appear to be a form of chipping damage.
Tears and bruises
(http://img593.imageshack.us/img593/77/bruisesandtears.png)
Chips and jams
(http://img411.imageshack.us/img411/6641/chipsandjams.png)
Misc
- Around 60% of shots to the head cause brain tears (i.e. instant death)
- Around 80-90% of the cases of body parts being severed concern fingers, the rest noses. There were single incidents of severing lower legs and guts (?)
Hit zones
Finally, I compiled and calculated the percentages of a particular body part being hit. Reminder: this data is true for Proficient Archers and Marksdwarfs shooting from two tiles away through a fortification at enemies who can;t dodge:
Hit zones
(http://desmond.imageshack.us/Himg849/scaled.php?server=849&filename=thevitruviandwarf.png&res=landing)
The Vitruvian dwarf.
(Urist da Vinci I am not)
Results based on 1333889 bolts fired during the course of the experiment
Acknowledgments
I would like to thank the 56000 dwarfs which lent their crossbows to the cause of science.
I would like to double thank the 50960 dwarfs who sacrificed their lives for that very same cause.
I'd like to congratulate the surviving 5040 dwarfs and invite them to my future fortresses, since they appear to be professional survivors.
What you have done here is a thing of beauty and should be consulted for a long time. :) Were you a dwarf, you'd have earned a royal bedroom with some gem encrusted candy furniture and such at least.
I'd like that <wistfully>
WOW..
This is a very impressive test. It reinforces my belief that silver is good. I'm a little surprised that bronze performs better then iron in several cases.
Silver is good. But only slightly better than copper, bronze, iron or steel. So its most economic to go with the cheapest/most abundant resource on the map.
As to bronze, it appears to have shear yield HIGHER than iron:
| Iron | Bronze | Copper |
Solid density | 7850 | 8250 | 8930 |
Shear yield | 155000 | 172000 | 70000 |
(copper added for comparison)
So apparently Bronze is, according to the key parameters solid density and shear yield, "better" than iron.
While we are on the topic, I discovered an interesting anomaly in the average of fired bolts parameter (I'm shortening that to AofB). The reason the AofB plot forms two distinctive levels can be explained through type of death: the one which occur from bolt damage are:
- Head shot (caused 99% by brain tears: "dwarf was shot and killed")
- Suffocation (Tearing/bruising of the Upper/Middle Spine: "dwarf suffocated")
- Bleeding to death (Tearing of the throat/heart: "dwarf bled out")
So bolts of material equal to or "worse" to than the armor they are assaulting cannot directly tear organs or throat (They do sometimes tear muscle, skin, fat, though this mainly happens when they hit extremities, like hands or feet. Oh, and spinal nervous tissue is often teared, for some reason, even if the bolt only bruises the spine itself). Thus only head shots and spinal injuries contribute towards death rate. When the material of the bolt is "better" than the armor, than heart tearing and throat tearing (both inducing bleed out over time) is added to the death toll, significantly increasing the probability of the bolt killing the dwarf.
Here's the interesting part: Take a look at a slice of the AofB part describing how well different bolts do against iron armor:
(http://img35.imageshack.us/img35/5074/ironarmorslice.png)
There is a slight depression in the iron vs iron value as compared to the surrounding metals, right? If You remember the Chips and Jams plot, the combination of bolt and metal of the same type gave rise to "jams", a form of injury where the bolt... pushes the bone it hits/breaks into another bone or organ. Like the heart.
So jams (or should I have been calling them jammings?), these strange injuries which only occur in a narrow sweet spot of conditions, can contribute to the death toll due to bleed out due to bones being jammed into the heart occasionally. It follows that metal armors are slightly less effective against bolts made of the same metal. Still, the difference isn't all that great as to change Your dwarfs equipment.
b) I looked at [BODY_DETAIL_PLAN:HUMANOID_RELSIZES] in b_detail_plan_default.txt.
Each body part has a relative size. If you divide the body part's size by the sum of sizes for all external body parts, you get percentages that are very similar to the Vitruvian dwarf (1-5% error for most main body parts, so I get 18.12% for the upper body etc.). This doesn't hold for heads, hands, and feet, but I probably made a calculation mistake when including the fingers, toes, nose, etc.
A quirk of my data extracting program: Although hits to the fingers and toes were labelled as hand and foot hits, respectively, hits to facial feature were not. Hence, the "Other" category. e.g. A nose, ear, eye, eyelid, tongue etc. hit is defined as "Other". Only pure head shots (both fatal brain-tearing ones and those which merely shatter the skull, of tear a muscle) were defined as hits to the "Head" region.
Yes, arena testing reveals that slade armor is required to "deflect" iron bolts. Less heavy/dense armors don't seem to deflect the blunt damage. Implications unknown at this time.
If nothing else it confirms that relative density of bolt and armor material influence deflection chance. Modders can tweak the size parameter of ammunition to decrease bolt weight and increase deflection in search of more "realistic" projectile behavior.
One advantage that wooden bolts have over other bolts is the fact that if one sets fire to them and shoots someone, they will cause the affected area to melt, causing heavy bleeding beyond the obvious organ damage and torn skin. I have only managed to do this though by being a magma man and picking up bolts, thereby setting them on fire and shooting them at a naked elf very quickly. They do not, however, cause the corpse to ignite, nor the clothing that the corpse was wearing.
At least, that's what my research showed originally. I've just tried that again and it seems that burning bolts cannot be fired. Well, if the bolt was on fire, that was what would happen. I just tried by throwing the burning bolts but again, I was unsuccessful. I think it has to stick in the wound for it to cause the area around it to melt.
I do not have any data on fire bolt damage... however, the probability of a bolt lodging seems to depend on Bolt/Armor material:
Percentage of bolts lodged
(http://imageshack.us/a/img442/1330/lodged.png)
It is apparent that there are three 'levels' of lodging probability:
- under 50% lodging - occurs for most cases when bolt material is "better" than armor material
- under 20% lodging - occurs for most cases when bolt material is equal to or "worse" than armor material, as well as in the case of wood, bone and copper bolts used against no armor or leather armor
- 0-2% lodging - occurs when wood, bone or copper bolts are used against metal armor
Lodging does not seem to solely depend on the shear yield parameter, since fake bone has a shear yield of 115'000 compared to silver's 100'000, but bolts made of these materials lodged differently. Perhaps weight has an effect at low (around 100'000) shear yields? Or possibly it is governed by a completely different parameter altogether. Surprisingly, copper lodges just as bad as wood and fake bone, despite being a metal. Its shear yield is lower than bone and silver (70'000), which might work towards this effect.
To return to the point, even firing wooden bolts against unarmored targets grants You a 20% chance of lodging at most (and almost no chance against armored opponents). Thus, if lodging is a requirement for a wooden fire bolt to cause fire-based damage, then their usefulness is seriously limited.
Is there a chance for a dwarf to dodge dropped objects?
I repeated Urist da Vinci's dwarf-eagle setup with ten of each, and gave the eagles around 30 separate bolts, as suggested by rhesusmacabre. The dwarves were all Grand Master Dodgers, and I didn't give them any armor (in case it somehow impedes speed/dodging - I haven't tested this yet).
All dwarves died, not one dodged. This would imply dropping items are indeed undodgeable. I suspect dodging is a... combat-specific action, and doesn't occur when the dwarf is not being targeted by an enemy.
...
Why does the bolt material density not matter, but the density of a falling item does? My theory is that the bolts are launched from the crossbow at a constant impulse or a constant energy, so that the density is used twice and cancels out of the equation, leaving only bolt size. Not sure how to test this.
EDIT: removed unreproduceable science. wouldn't be good to be creating myths right now.
I remembered the term "constant impulse" from Your earlier post concerning pre-minecart knockback research, where You found that crossbow knockback did not depend on bolt density. I hope I'm not doubling up on research already done, but I decided to see if this is the case in 34.11.
I improvised an experimental setup where I could estimate the distance a dwarf is propelled without skidding effects. I used the whole arena to make a cliff with isolated lanes:
(http://img571.imageshack.us/img571/1881/knockbacktop.png)
(http://img28.imageshack.us/img28/6392/knockbackbottom.png)
I modded crossbows to SHOOT_FORCE = 100'000 and SHOOT_MAXVEL = 100'000, and I modded light silver and heavy silver to SOLID_DENSITY 2000 and 30'000, respectively. Referring to figure 1, The top 3 dwarves used light silver bolts, the middle 3 dwarves used regular silver bolts, and the bottom three dwarves used heavy silver bolts. All dwarves were Grand Master Marksdwarves/Archers.
The results are presented in Figure 3.
(http://img801.imageshack.us/img801/3507/knockbackbottompost.png)
The spots marked with red circles are the spots the dwarves were at the moment the battle report informed that they were "skidding" for the first time, which I assume is their first contact with the ground.
Light silver bolts propelled dwarves the least, dropping them close the foundation of the pillar.
Regular silver bolts propelled dwarves the furthest.
Heavy silver bolts propelled dwarves... a medium distance.
Members of a given bolt weight category fell in the exact same distance, and from what I could tell, stopped skidding in the exact same spot. I later repeated the experiment with only regular silver, and veeery caaaarefully studied two of the trajectories tick by tick, and they were identical, even for the skidding part (even the moments skids were reported were identical). So results should be easily reproduced, with little to no variation between individual runs.
I have not yet formulated satisfying conclusions from this, but bolt density/weight clearly effects crossbow knockback in 34.11.
Finally, here are my results from varying [SHOOT_FORCE] on crossbows. I'm very sorry this took so much longer - I was totally confused by the results, and thought that I must have done something wrong (and I've also been too busy to figure out what was going on). After seeing results from Urist da Vinci and Zivilin, I think I now understand.
I strongly believe that there are at least two types of deflections which can occur. The type investigated by Urist/Zivilin I would equate roughly to an inelastic collision which destroys the projectile. If the [IMPACT_YIELD] of the projectile is less than 3.3970 times the [SOLID_DENSITY] of the armor (using vanilla values for all other parameters), then it deflects (yes, I tested it to 4 decimal places - I was sick and bored...). I confirmed that deflection of copper bolts with modified [IMPACT_YIELD] off steel armor occurs for [IMPACT_YIELD] greater than 26666
(http://i.imgur.com/GwLVf.png)
I believe this type of deflection occurs if the stiffness of the armor (I don't yet know which DF parameters control this) is not high enough to cause an elastic collision (which is what I assumed all deflections would be). Rather, if the bolt material is fragile/squishy enough, the bolt is destroyed/deformed, absorbing all the energy of the collision. In an inelastic collision, some small piece of the armor will be pushed in some distance. Assuming the armor's stiffness is low enough that it can't provide significant resistance, then the pressure required to push the armor will be proportional to its density. If the [IMPACT_YIELD] of the bolt is not high enough to withstand this pressure, it is destroyed. It's a little odd that this is an all-or-nothing thing, but I guess to first order it makes sense.
My results also seem to show that if the momentum (or maybe energy? - it should be momentum based on real-world physics, but who knows...) of an incoming bolt is low enough, then it can deflect off of armor. For these tests, I used rows of shooters 2 tiles away from rows of targets, with nothing blocking the shooters from targeting any dwarves in the target row (not ideal, but I didn't think of this at the time). The targets wore helms, breastplates, greaves, 2 gauntlets and 2 low boots of the appropriate material. I wanted to test deflection off rigid armor only, so I did not include chain mail. If anything looks "out of place", please let me know - I ran a lot of tests (this is actually only a fraction), so it's possible I might have mixed up some of the data.
ammo | armor | hits | kills | hits/kill | hits/fall | hits/KO | %through | %deflected | %serious | %bruised |
adamantine | adamantine | 76889.00 | 606.00 | 80.14+/-2.56 | 15.69+/-0.49 | 16.04+/-0.49 | 0.00 | 1.00 | 0.00 | 0.00 |
bismuth_bronze | adamantine | 77109.00 | 556.00 | 76.03+/-2.38 | 15.04+/-0.49 | 15.61+/-0.49 | 0.00 | 1.00 | 0.00 | 0.00 |
bronze | adamantine | 77038.00 | 598.00 | 80.81+/-2.57 | 14.05+/-0.46 | 14.63+/-0.47 | 0.00 | 1.00 | 0.00 | 0.00 |
copper | adamantine | 77088.00 | 602.00 | 78.29+/-2.52 | 15.04+/-0.52 | 15.32+/-0.51 | 0.00 | 1.00 | 0.00 | 0.00 |
iron | adamantine | 76998.00 | 603.00 | 78.28+/-2.33 | 14.08+/-0.47 | 14.67+/-0.49 | 0.00 | 1.00 | 0.00 | 0.00 |
silver | adamantine | 76636.00 | 631.00 | 82.03+/-2.61 | 15.49+/-0.53 | 15.73+/-0.52 | 0.00 | 1.00 | 0.00 | 0.00 |
steel | adamantine | 77132.00 | 588.00 | 76.53+/-2.35 | 15.27+/-0.47 | 15.45+/-0.46 | 0.00 | 1.00 | 0.00 | 0.00 |
adamantine | bismuth_bronze | 15066.00 | 864.00 | 19.36+/-0.55 | 1.89+/-0.04 | 4.22+/-0.17 | 1.00 | 0.00 | 1.00 | 0.00 |
bismuth_bronze | bismuth_bronze | 12799.00 | 864.00 | 16.44+/-0.49 | 1.79+/-0.04 | 2.77+/-0.08 | 1.00 | 0.00 | 1.00 | 0.00 |
bronze | bismuth_bronze | 12895.00 | 864.00 | 16.67+/-0.50 | 1.76+/-0.03 | 2.80+/-0.09 | 1.00 | 0.00 | 1.00 | 0.00 |
copper | bismuth_bronze | 13219.00 | 864.00 | 17.02+/-0.50 | 1.69+/-0.03 | 2.91+/-0.10 | 1.00 | 0.00 | 1.00 | 0.00 |
iron | bismuth_bronze | 13480.00 | 864.00 | 17.34+/-0.52 | 1.72+/-0.03 | 3.00+/-0.10 | 1.00 | 0.00 | 1.00 | 0.00 |
silver | bismuth_bronze | 12976.00 | 864.00 | 16.77+/-0.51 | 1.74+/-0.04 | 2.60+/-0.08 | 1.00 | 0.00 | 1.00 | 0.00 |
steel | bismuth_bronze | 12413.00 | 864.00 | 15.96+/-0.45 | 1.76+/-0.04 | 2.88+/-0.10 | 1.00 | 0.00 | 1.00 | 0.00 |
adamantine | bronze | 15285.00 | 864.00 | 19.68+/-0.60 | 1.87+/-0.04 | 3.82+/-0.15 | 1.00 | 0.00 | 1.00 | 0.00 |
bismuth_bronze | bronze | 12804.00 | 864.00 | 16.52+/-0.48 | 1.81+/-0.04 | 3.02+/-0.12 | 1.00 | 0.00 | 1.00 | 0.00 |
bronze | bronze | 12823.00 | 864.00 | 16.58+/-0.51 | 1.65+/-0.03 | 2.77+/-0.10 | 1.00 | 0.00 | 1.00 | 0.00 |
copper | bronze | 12521.00 | 864.00 | 16.16+/-0.48 | 1.79+/-0.04 | 2.96+/-0.10 | 1.00 | 0.00 | 1.00 | 0.00 |
iron | bronze | 13011.00 | 864.00 | 16.85+/-0.52 | 1.76+/-0.03 | 2.89+/-0.09 | 1.00 | 0.00 | 1.00 | 0.00 |
silver | bronze | 12844.00 | 864.00 | 16.52+/-0.50 | 1.71+/-0.03 | 2.74+/-0.08 | 1.00 | 0.00 | 1.00 | 0.00 |
steel | bronze | 13227.00 | 864.00 | 16.98+/-0.52 | 1.70+/-0.03 | 2.91+/-0.10 | 1.00 | 0.00 | 1.00 | 0.00 |
adamantine | copper | 14535.00 | 864.00 | 18.77+/-0.55 | 1.81+/-0.04 | 4.22+/-0.18 | 1.00 | 0.00 | 1.00 | 0.00 |
bismuth_bronze | copper | 13030.00 | 864.00 | 16.92+/-0.52 | 1.79+/-0.04 | 2.89+/-0.10 | 1.00 | 0.00 | 1.00 | 0.00 |
bronze | copper | 13554.00 | 864.00 | 17.43+/-0.52 | 1.76+/-0.03 | 3.12+/-0.15 | 1.00 | 0.00 | 1.00 | 0.00 |
copper | copper | 12970.00 | 864.00 | 16.65+/-0.48 | 1.72+/-0.03 | 2.87+/-0.08 | 1.00 | 0.00 | 1.00 | 0.00 |
iron | copper | 13276.00 | 864.00 | 17.14+/-0.51 | 1.73+/-0.04 | 2.85+/-0.09 | 1.00 | 0.00 | 1.00 | 0.00 |
silver | copper | 12270.00 | 864.00 | 15.75+/-0.49 | 1.73+/-0.03 | 2.80+/-0.08 | 1.00 | 0.00 | 1.00 | 0.00 |
steel | copper | 12942.00 | 864.00 | 16.60+/-0.48 | 1.72+/-0.03 | 2.94+/-0.10 | 1.00 | 0.00 | 1.00 | 0.00 |
adamantine | iron | 14891.00 | 864.00 | 19.20+/-0.54 | 1.82+/-0.04 | 4.03+/-0.17 | 1.00 | 0.00 | 1.00 | 0.00 |
bismuth_bronze | iron | 19012.00 | 864.00 | 24.52+/-0.58 | 8.85+/-0.29 | 10.01+/-0.35 | 0.69 | 0.31 | 0.69 | 0.00 |
bronze | iron | 18832.00 | 864.00 | 24.25+/-0.61 | 8.74+/-0.27 | 10.12+/-0.36 | 0.68 | 0.32 | 0.68 | 0.00 |
copper | iron | 19140.00 | 864.00 | 24.69+/-0.61 | 9.11+/-0.30 | 10.53+/-0.36 | 0.68 | 0.32 | 0.68 | 0.00 |
iron | iron | 25574.00 | 864.00 | 33.03+/-0.85 | 16.40+/-0.60 | 17.12+/-0.67 | 0.48 | 0.52 | 0.48 | 0.00 |
silver | iron | 12580.00 | 864.00 | 16.23+/-0.50 | 1.81+/-0.04 | 2.70+/-0.08 | 0.99 | 0.01 | 0.99 | 0.00 |
steel | iron | 13161.00 | 864.00 | 16.88+/-0.50 | 1.70+/-0.03 | 3.03+/-0.11 | 1.00 | 0.00 | 1.00 | 0.00 |
adamantine | silver | 14768.00 | 864.00 | 19.06+/-0.57 | 1.80+/-0.04 | 4.42+/-0.18 | 1.00 | 0.00 | 1.00 | 0.00 |
bismuth_bronze | silver | 13490.00 | 864.00 | 17.38+/-0.54 | 1.70+/-0.03 | 3.05+/-0.12 | 1.00 | 0.00 | 1.00 | 0.00 |
bronze | silver | 12312.00 | 864.00 | 15.88+/-0.48 | 1.75+/-0.04 | 2.94+/-0.09 | 1.00 | 0.00 | 1.00 | 0.00 |
copper | silver | 12730.00 | 864.00 | 16.42+/-0.53 | 1.69+/-0.03 | 2.78+/-0.11 | 1.00 | 0.00 | 1.00 | 0.00 |
iron | silver | 13046.00 | 864.00 | 16.78+/-0.49 | 1.73+/-0.03 | 2.95+/-0.10 | 1.00 | 0.00 | 1.00 | 0.00 |
silver | silver | 12654.00 | 864.00 | 16.28+/-0.50 | 1.66+/-0.03 | 2.66+/-0.08 | 1.00 | 0.00 | 1.00 | 0.00 |
steel | silver | 12644.00 | 864.00 | 16.32+/-0.50 | 1.84+/-0.04 | 3.17+/-0.10 | 1.00 | 0.00 | 1.00 | 0.00 |
adamantine | steel | 14525.00 | 864.00 | 18.74+/-0.58 | 1.82+/-0.04 | 4.15+/-0.18 | 1.00 | 0.00 | 1.00 | 0.00 |
bismuth_bronze | steel | 76608.00 | 579.00 | 74.98+/-2.34 | 14.42+/-0.44 | 14.82+/-0.43 | 0.54 | 0.46 | 0.00 | 0.54 |
bronze | steel | 76638.00 | 563.00 | 77.02+/-2.53 | 14.96+/-0.52 | 15.39+/-0.50 | 0.54 | 0.46 | 0.00 | 0.54 |
copper | steel | 27226.00 | 864.00 | 35.29+/-0.91 | 16.93+/-0.59 | 17.20+/-0.60 | 0.47 | 0.53 | 0.28 | 0.19 |
iron | steel | 76577.00 | 597.00 | 78.29+/-2.48 | 14.33+/-0.49 | 14.73+/-0.48 | 0.54 | 0.46 | 0.00 | 0.54 |
silver | steel | 25050.00 | 864.00 | 32.43+/-0.90 | 15.90+/-0.58 | 16.82+/-0.72 | 0.47 | 0.53 | 0.46 | 0.01 |
steel | steel | 76613.00 | 556.00 | 77.17+/-2.37 | 14.98+/-0.48 | 15.43+/-0.50 | 0.55 | 0.45 | 0.00 | 0.55 |
adamantine | naked | 0.00 | 864.00 | 18.75+/-0.55 | 1.79+/-0.04 | 4.31+/-0.17 | 0.00 | 0.00 | 0.00 | 0.00 |
bismuth_bronze | naked | 0.00 | 864.00 | 17.38+/-0.53 | 1.72+/-0.03 | 2.86+/-0.09 | 0.00 | 0.00 | 0.00 | 0.00 |
bronze | naked | 0.00 | 864.00 | 17.07+/-0.50 | 1.75+/-0.04 | 2.94+/-0.09 | 0.00 | 0.00 | 0.00 | 0.00 |
copper | naked | 0.00 | 864.00 | 16.89+/-0.51 | 1.71+/-0.03 | 2.80+/-0.10 | 0.00 | 0.00 | 0.00 | 0.00 |
iron | naked | 0.00 | 864.00 | 16.85+/-0.50 | 1.84+/-0.04 | 2.93+/-0.10 | 0.00 | 0.00 | 0.00 | 0.00 |
silver | naked | 0.00 | 864.00 | 16.19+/-0.49 | 1.68+/-0.03 | 2.56+/-0.07 | 0.00 | 0.00 | 0.00 | 0.00 |
steel | naked | 0.00 | 864.00 | 17.15+/-0.54 | 1.74+/-0.03 | 2.98+/-0.12 | 0.00 | 0.00 | 0.00 | 0.00 |
ammo | armor | hits | kills | hits/kill | hits/fall | hits/KO | %through | %deflected | %serious | %bruised |
adamantine | adamantine | 76979.00 | 565.00 | 79.06+/-2.55 | 15.80+/-0.50 | 15.94+/-0.49 | 0.00 | 1.00 | 0.00 | 0.00 |
bismuth_bronze | adamantine | 76880.00 | 594.00 | 81.06+/-2.59 | 15.00+/-0.48 | 15.05+/-0.46 | 0.00 | 1.00 | 0.00 | 0.00 |
bronze | adamantine | 76762.00 | 646.00 | 82.13+/-2.65 | 14.39+/-0.49 | 14.60+/-0.47 | 0.00 | 1.00 | 0.00 | 0.00 |
copper | adamantine | 77197.00 | 616.00 | 82.51+/-2.65 | 14.96+/-0.49 | 15.51+/-0.50 | 0.00 | 1.00 | 0.00 | 0.00 |
iron | adamantine | 77107.00 | 592.00 | 77.56+/-2.37 | 15.13+/-0.50 | 15.17+/-0.48 | 0.00 | 1.00 | 0.00 | 0.00 |
silver | adamantine | 76626.00 | 598.00 | 81.77+/-2.58 | 15.18+/-0.53 | 15.35+/-0.52 | 0.00 | 1.00 | 0.00 | 0.00 |
steel | adamantine | 77054.00 | 581.00 | 79.47+/-2.42 | 15.27+/-0.50 | 15.31+/-0.48 | 0.00 | 1.00 | 0.00 | 0.00 |
adamantine | bismuth_bronze | 14826.00 | 864.00 | 19.07+/-0.56 | 1.91+/-0.04 | 4.26+/-0.18 | 1.00 | 0.00 | 1.00 | 0.00 |
bismuth_bronze | bismuth_bronze | 13163.00 | 864.00 | 16.95+/-0.49 | 1.71+/-0.03 | 2.97+/-0.10 | 1.00 | 0.00 | 1.00 | 0.00 |
bronze | bismuth_bronze | 12938.00 | 864.00 | 16.72+/-0.49 | 1.73+/-0.03 | 2.85+/-0.09 | 1.00 | 0.00 | 1.00 | 0.00 |
copper | bismuth_bronze | 12060.00 | 864.00 | 15.53+/-0.46 | 1.74+/-0.04 | 3.10+/-0.12 | 1.00 | 0.00 | 1.00 | 0.00 |
iron | bismuth_bronze | 13343.00 | 864.00 | 17.19+/-0.50 | 1.74+/-0.03 | 2.80+/-0.09 | 1.00 | 0.00 | 1.00 | 0.00 |
silver | bismuth_bronze | 12633.00 | 864.00 | 16.27+/-0.50 | 1.72+/-0.04 | 2.87+/-0.10 | 1.00 | 0.00 | 1.00 | 0.00 |
steel | bismuth_bronze | 12736.00 | 864.00 | 16.41+/-0.52 | 1.75+/-0.03 | 3.05+/-0.11 | 1.00 | 0.00 | 1.00 | 0.00 |
adamantine | bronze | 14713.00 | 864.00 | 19.09+/-0.56 | 1.87+/-0.04 | 4.10+/-0.18 | 1.00 | 0.00 | 1.00 | 0.00 |
bismuth_bronze | bronze | 12242.00 | 864.00 | 15.81+/-0.49 | 1.77+/-0.04 | 2.81+/-0.09 | 1.00 | 0.00 | 1.00 | 0.00 |
bronze | bronze | 12462.00 | 864.00 | 16.07+/-0.47 | 1.75+/-0.04 | 2.93+/-0.10 | 1.00 | 0.00 | 1.00 | 0.00 |
copper | bronze | 12663.00 | 864.00 | 16.28+/-0.50 | 1.80+/-0.04 | 2.74+/-0.08 | 1.00 | 0.00 | 1.00 | 0.00 |
iron | bronze | 12528.00 | 864.00 | 16.27+/-0.51 | 1.75+/-0.04 | 2.96+/-0.10 | 1.00 | 0.00 | 1.00 | 0.00 |
silver | bronze | 12752.00 | 864.00 | 16.45+/-0.49 | 1.74+/-0.04 | 2.66+/-0.08 | 1.00 | 0.00 | 1.00 | 0.00 |
steel | bronze | 12737.00 | 864.00 | 16.45+/-0.49 | 1.73+/-0.03 | 2.98+/-0.09 | 1.00 | 0.00 | 1.00 | 0.00 |
adamantine | copper | 14762.00 | 864.00 | 19.02+/-0.54 | 1.84+/-0.04 | 3.84+/-0.15 | 1.00 | 0.00 | 1.00 | 0.00 |
bismuth_bronze | copper | 13190.00 | 864.00 | 17.04+/-0.49 | 1.74+/-0.04 | 2.98+/-0.11 | 1.00 | 0.00 | 1.00 | 0.00 |
bronze | copper | 12889.00 | 864.00 | 16.68+/-0.48 | 1.70+/-0.03 | 2.78+/-0.09 | 1.00 | 0.00 | 1.00 | 0.00 |
copper | copper | 12711.00 | 864.00 | 16.30+/-0.48 | 1.76+/-0.03 | 2.83+/-0.09 | 1.00 | 0.00 | 1.00 | 0.00 |
iron | copper | 13225.00 | 864.00 | 17.15+/-0.51 | 1.76+/-0.04 | 2.89+/-0.09 | 1.00 | 0.00 | 1.00 | 0.00 |
silver | copper | 12046.00 | 864.00 | 15.60+/-0.47 | 1.71+/-0.03 | 2.70+/-0.08 | 1.00 | 0.00 | 1.00 | 0.00 |
steel | copper | 13284.00 | 864.00 | 17.20+/-0.53 | 1.72+/-0.03 | 2.91+/-0.11 | 1.00 | 0.00 | 1.00 | 0.00 |
adamantine | iron | 14370.00 | 864.00 | 18.56+/-0.52 | 1.87+/-0.04 | 3.98+/-0.16 | 1.00 | 0.00 | 1.00 | 0.00 |
bismuth_bronze | iron | 18185.00 | 864.00 | 23.50+/-0.57 | 8.91+/-0.28 | 10.07+/-0.32 | 0.66 | 0.34 | 0.66 | 0.00 |
bronze | iron | 18333.00 | 864.00 | 23.72+/-0.57 | 8.56+/-0.29 | 9.91+/-0.35 | 0.68 | 0.32 | 0.68 | 0.00 |
copper | iron | 18133.00 | 864.00 | 23.44+/-0.56 | 8.75+/-0.31 | 10.07+/-0.38 | 0.67 | 0.33 | 0.67 | 0.00 |
iron | iron | 25580.00 | 864.00 | 33.03+/-0.89 | 16.64+/-0.66 | 17.22+/-0.70 | 0.48 | 0.52 | 0.48 | 0.00 |
silver | iron | 12750.00 | 864.00 | 16.55+/-0.50 | 1.81+/-0.04 | 2.75+/-0.09 | 0.99 | 0.01 | 0.99 | 0.00 |
steel | iron | 12598.00 | 864.00 | 16.19+/-0.49 | 1.72+/-0.03 | 3.03+/-0.10 | 1.00 | 0.00 | 1.00 | 0.00 |
adamantine | silver | 14533.00 | 864.00 | 18.69+/-0.54 | 1.81+/-0.03 | 4.11+/-0.17 | 1.00 | 0.00 | 1.00 | 0.00 |
bismuth_bronze | silver | 12685.00 | 864.00 | 16.28+/-0.49 | 1.79+/-0.04 | 2.99+/-0.09 | 1.00 | 0.00 | 1.00 | 0.00 |
bronze | silver | 12466.00 | 864.00 | 16.04+/-0.51 | 1.74+/-0.04 | 2.73+/-0.08 | 1.00 | 0.00 | 1.00 | 0.00 |
copper | silver | 12679.00 | 864.00 | 16.36+/-0.50 | 1.73+/-0.03 | 2.88+/-0.09 | 1.00 | 0.00 | 1.00 | 0.00 |
iron | silver | 12770.00 | 864.00 | 16.42+/-0.51 | 1.73+/-0.03 | 2.93+/-0.10 | 1.00 | 0.00 | 1.00 | 0.00 |
silver | silver | 12501.00 | 864.00 | 16.08+/-0.49 | 1.73+/-0.03 | 2.61+/-0.07 | 1.00 | 0.00 | 1.00 | 0.00 |
steel | silver | 13142.00 | 864.00 | 17.03+/-0.52 | 1.76+/-0.04 | 2.96+/-0.09 | 1.00 | 0.00 | 1.00 | 0.00 |
adamantine | steel | 13994.00 | 864.00 | 18.08+/-0.52 | 1.79+/-0.04 | 4.05+/-0.17 | 1.00 | 0.00 | 1.00 | 0.00 |
bismuth_bronze | steel | 76522.00 | 589.00 | 77.35+/-2.65 | 15.07+/-0.52 | 15.27+/-0.52 | 0.54 | 0.46 | 0.00 | 0.54 |
bronze | steel | 76330.00 | 587.00 | 79.14+/-2.73 | 14.47+/-0.48 | 14.52+/-0.46 | 0.55 | 0.45 | 0.00 | 0.55 |
copper | steel | 26616.00 | 864.00 | 34.54+/-0.91 | 15.91+/-0.63 | 16.50+/-0.63 | 0.48 | 0.52 | 0.31 | 0.17 |
iron | steel | 76635.00 | 594.00 | 78.67+/-2.50 | 15.86+/-0.55 | 16.27+/-0.53 | 0.55 | 0.45 | 0.00 | 0.55 |
silver | steel | 23210.00 | 864.00 | 30.06+/-0.78 | 15.31+/-0.55 | 15.72+/-0.59 | 0.47 | 0.53 | 0.46 | 0.01 |
steel | steel | 76710.00 | 549.00 | 75.28+/-2.41 | 14.63+/-0.47 | 14.77+/-0.46 | 0.55 | 0.45 | 0.00 | 0.55 |
adamantine | naked | 0.00 | 864.00 | 18.39+/-0.52 | 1.88+/-0.04 | 3.93+/-0.16 | 0.00 | 0.00 | 0.00 | 0.00 |
bismuth_bronze | naked | 0.00 | 864.00 | 17.21+/-0.49 | 1.78+/-0.04 | 3.01+/-0.11 | 0.00 | 0.00 | 0.00 | 0.00 |
bronze | naked | 0.00 | 864.00 | 17.43+/-0.50 | 1.74+/-0.03 | 2.89+/-0.10 | 0.00 | 0.00 | 0.00 | 0.00 |
copper | naked | 0.00 | 864.00 | 16.39+/-0.49 | 1.76+/-0.03 | 2.87+/-0.09 | 0.00 | 0.00 | 0.00 | 0.00 |
iron | naked | 0.00 | 864.00 | 16.82+/-0.52 | 1.65+/-0.03 | 2.69+/-0.08 | 0.00 | 0.00 | 0.00 | 0.00 |
silver | naked | 0.00 | 864.00 | 16.06+/-0.50 | 1.71+/-0.03 | 2.78+/-0.08 | 0.00 | 0.00 | 0.00 | 0.00 |
steel | naked | 0.00 | 864.00 | 16.36+/-0.47 | 1.76+/-0.04 | 2.99+/-0.10 | 0.00 | 0.00 | 0.00 | 0.00 |
Edit: added in Shoot Force 35 without chain mail.
ammo | armor | hits | kills | hits/kill | hits/fall | hits/KO | %through | %deflected | %serious | %bruised |
adamantine | adamantine | 76979.00 | 585.00 | 80.13+/-2.45 | 14.88+/-0.46 | 15.12+/-0.46 | 0.00 | 1.00 | 0.00 | 0.00 |
bronze | adamantine | 77038.00 | 540.00 | 78.08+/-2.56 | 15.79+/-0.52 | 15.89+/-0.50 | 0.00 | 1.00 | 0.00 | 0.00 |
copper | adamantine | 77112.00 | 561.00 | 80.04+/-2.64 | 14.62+/-0.48 | 14.97+/-0.49 | 0.00 | 1.00 | 0.00 | 0.00 |
iron | adamantine | 77037.00 | 561.00 | 78.30+/-2.40 | 15.09+/-0.51 | 15.53+/-0.50 | 0.00 | 1.00 | 0.00 | 0.00 |
silver | adamantine | 25774.00 | 864.00 | 33.23+/-0.84 | 17.23+/-0.66 | 17.68+/-0.65 | 0.44 | 0.56 | 0.44 | 0.00 |
steel | adamantine | 77207.00 | 558.00 | 76.94+/-2.46 | 15.14+/-0.47 | 15.62+/-0.48 | 0.00 | 1.00 | 0.00 | 0.00 |
bone | adamantine | 27454.00 | 864.00 | 34.82+/-0.85 | 17.87+/-0.65 | 18.37+/-0.70 | 0.48 | 0.52 | 0.48 | 0.00 |
tower_cap | adamantine | 27474.00 | 864.00 | 34.84+/-0.83 | 17.31+/-0.60 | 18.08+/-0.63 | 0.48 | 0.52 | 0.48 | 0.00 |
adamantine | bronze | 14392.00 | 864.00 | 18.53+/-0.56 | 1.79+/-0.04 | 4.42+/-0.21 | 1.00 | 0.00 | 1.00 | 0.00 |
bronze | bronze | 12813.00 | 864.00 | 16.47+/-0.47 | 1.73+/-0.03 | 2.89+/-0.09 | 1.00 | 0.00 | 1.00 | 0.00 |
copper | bronze | 12407.00 | 864.00 | 15.97+/-0.48 | 1.70+/-0.03 | 2.84+/-0.09 | 1.00 | 0.00 | 1.00 | 0.00 |
iron | bronze | 12597.00 | 864.00 | 16.25+/-0.50 | 1.73+/-0.04 | 3.11+/-0.11 | 1.00 | 0.00 | 1.00 | 0.00 |
silver | bronze | 12686.00 | 864.00 | 16.38+/-0.48 | 1.73+/-0.03 | 2.69+/-0.08 | 1.00 | 0.00 | 1.00 | 0.00 |
steel | bronze | 13008.00 | 864.00 | 16.80+/-0.49 | 1.76+/-0.03 | 2.85+/-0.09 | 1.00 | 0.00 | 1.00 | 0.00 |
bone | bronze | 15213.00 | 864.00 | 19.29+/-0.54 | 1.78+/-0.04 | 4.07+/-0.17 | 1.00 | 0.00 | 1.00 | 0.00 |
tower_cap | bronze | 78529.00 | 600.00 | 80.01+/-2.46 | 16.11+/-0.50 | 16.73+/-0.53 | 0.02 | 0.98 | 0.02 | 0.00 |
adamantine | copper | 15033.00 | 864.00 | 19.35+/-0.55 | 1.79+/-0.04 | 4.23+/-0.20 | 1.00 | 0.00 | 1.00 | 0.00 |
bronze | copper | 12311.00 | 864.00 | 15.90+/-0.49 | 1.77+/-0.04 | 2.79+/-0.08 | 1.00 | 0.00 | 1.00 | 0.00 |
copper | copper | 12426.00 | 864.00 | 16.00+/-0.48 | 1.76+/-0.04 | 2.82+/-0.08 | 1.00 | 0.00 | 1.00 | 0.00 |
iron | copper | 13136.00 | 864.00 | 16.92+/-0.50 | 1.78+/-0.04 | 2.94+/-0.09 | 1.00 | 0.00 | 1.00 | 0.00 |
silver | copper | 12002.00 | 864.00 | 15.54+/-0.46 | 1.71+/-0.03 | 2.58+/-0.07 | 1.00 | 0.00 | 1.00 | 0.00 |
steel | copper | 12385.00 | 864.00 | 16.05+/-0.49 | 1.74+/-0.04 | 2.91+/-0.11 | 1.00 | 0.00 | 1.00 | 0.00 |
bone | copper | 14451.00 | 864.00 | 18.23+/-0.54 | 1.82+/-0.04 | 4.19+/-0.17 | 1.00 | 0.00 | 1.00 | 0.00 |
tower_cap | copper | 78571.00 | 591.00 | 76.69+/-2.30 | 16.06+/-0.51 | 16.19+/-0.49 | 0.02 | 0.98 | 0.02 | 0.00 |
adamantine | iron | 14475.00 | 864.00 | 18.63+/-0.54 | 1.81+/-0.04 | 4.02+/-0.16 | 1.00 | 0.00 | 1.00 | 0.00 |
bronze | iron | 13224.00 | 864.00 | 17.03+/-0.49 | 1.77+/-0.04 | 2.88+/-0.08 | 1.00 | 0.00 | 1.00 | 0.00 |
copper | iron | 12811.00 | 864.00 | 16.50+/-0.48 | 1.76+/-0.03 | 2.79+/-0.09 | 1.00 | 0.00 | 1.00 | 0.00 |
iron | iron | 12797.00 | 864.00 | 16.50+/-0.52 | 1.78+/-0.04 | 3.01+/-0.10 | 1.00 | 0.00 | 1.00 | 0.00 |
silver | iron | 12826.00 | 864.00 | 16.54+/-0.50 | 1.74+/-0.04 | 2.62+/-0.07 | 1.00 | 0.00 | 1.00 | 0.00 |
steel | iron | 12766.00 | 864.00 | 16.48+/-0.48 | 1.73+/-0.04 | 3.00+/-0.11 | 1.00 | 0.00 | 1.00 | 0.00 |
bone | iron | 14471.00 | 864.00 | 18.28+/-0.54 | 1.87+/-0.04 | 4.10+/-0.16 | 1.00 | 0.00 | 1.00 | 0.00 |
tower_cap | iron | 78629.00 | 574.00 | 79.24+/-2.44 | 15.96+/-0.48 | 16.16+/-0.46 | 0.02 | 0.98 | 0.02 | 0.00 |
adamantine | silver | 14377.00 | 864.00 | 18.64+/-0.53 | 1.91+/-0.04 | 4.16+/-0.18 | 1.00 | 0.00 | 1.00 | 0.00 |
bronze | silver | 12877.00 | 864.00 | 16.66+/-0.49 | 1.74+/-0.04 | 2.99+/-0.10 | 1.00 | 0.00 | 1.00 | 0.00 |
copper | silver | 12726.00 | 864.00 | 16.46+/-0.50 | 1.76+/-0.03 | 2.77+/-0.08 | 1.00 | 0.00 | 1.00 | 0.00 |
iron | silver | 12644.00 | 864.00 | 16.34+/-0.48 | 1.74+/-0.04 | 2.72+/-0.08 | 1.00 | 0.00 | 1.00 | 0.00 |
silver | silver | 12327.00 | 864.00 | 16.00+/-0.49 | 1.71+/-0.03 | 2.63+/-0.08 | 1.00 | 0.00 | 1.00 | 0.00 |
steel | silver | 13259.00 | 864.00 | 17.12+/-0.50 | 1.78+/-0.04 | 3.15+/-0.11 | 1.00 | 0.00 | 1.00 | 0.00 |
bone | silver | 14357.00 | 864.00 | 18.13+/-0.54 | 1.88+/-0.04 | 4.27+/-0.18 | 1.00 | 0.00 | 1.00 | 0.00 |
tower_cap | silver | 78416.00 | 580.00 | 78.72+/-2.50 | 14.76+/-0.51 | 15.34+/-0.51 | 0.02 | 0.98 | 0.02 | 0.00 |
adamantine | steel | 14917.00 | 864.00 | 19.19+/-0.55 | 1.85+/-0.04 | 4.51+/-0.21 | 1.00 | 0.00 | 1.00 | 0.00 |
bronze | steel | 25103.00 | 864.00 | 32.48+/-0.80 | 15.96+/-0.57 | 16.30+/-0.57 | 0.49 | 0.51 | 0.48 | 0.01 |
copper | steel | 25055.00 | 864.00 | 32.42+/-0.89 | 16.13+/-0.66 | 17.20+/-0.74 | 0.46 | 0.54 | 0.46 | 0.01 |
iron | steel | 25281.00 | 864.00 | 32.85+/-0.81 | 15.98+/-0.55 | 16.28+/-0.58 | 0.50 | 0.50 | 0.49 | 0.01 |
silver | steel | 24061.00 | 864.00 | 31.09+/-0.75 | 15.90+/-0.58 | 16.02+/-0.55 | 0.48 | 0.52 | 0.48 | 0.00 |
steel | steel | 25938.00 | 864.00 | 33.52+/-0.86 | 17.54+/-0.66 | 17.45+/-0.64 | 0.47 | 0.53 | 0.47 | 0.01 |
bone | steel | 20657.00 | 864.00 | 26.25+/-0.62 | 10.58+/-0.36 | 12.38+/-0.39 | 0.93 | 0.07 | 0.64 | 0.28 |
tower_cap | steel | 78352.00 | 612.00 | 80.18+/-2.43 | 15.44+/-0.52 | 15.68+/-0.51 | 0.02 | 0.98 | 0.02 | 0.00 |
The [SHOOT_FORCE:35] data is actually somewhat interesting, as it seems to be right at the point where wood starts penetrating metal, and silver penetrates candy.
See two posts down for data with chain mail and discussion...
Furthermore, I've noticed that I get a few percent differences in deflections when re-running the same data set. Each set contains over 10,000 hits, so if all hits are equivalent and independent, the error should be less than 1 percent. If instead deflections depend on target stance or distance, then the deflections would be correlated depending on how quickly the dorf fall over etc, and the variance between data sets would be significantly larger.
I have some advice on the topic of obtaining objective data. I redid many of my experiments a few times in an attempt to identify parameters which can add unnecessary interference to the data. Using my limited modding abilities, I implemented all of my observations into a creature template, which I called the arena dwarf:
[CREATURE:ARENA_DWARF]
[DESCRIPTION:A short, sturdy creature destined to die horribly.]
[NAME:arena dwarf:arena dwarves:arena dwarven]
[CASTE_NAME:arena dwarf:arena dwarves:arena dwarven]
[CREATURE_TILE:1][COLOR:7:0:0]
[CREATURE_SOLDIER_TILE:2]
Many of the following tags are actually caste-level tags (in this case, male and female), but because there are no differences between the castes for these tags in a dwarf, you can add them earlier. Any caste-level tag that occurs before castes are explicitly declared is saved up and placed on any caste that is declared later, unless the caste is explicitly derived from another caste.
[INTELLIGENT]
[TRANCES]
[BENIGN]
[NOPAIN]
[NOEXERT]
[CANOPENDOORS]
[PREFSTRING:beards]
[BODY:HUMANOID:2EYES:2EARS:NOSE:2LUNGS:HEART:GUTS:ORGANS:HUMANOID_JOINTS:THROAT:NECK:SPINE:BRAIN:SKULL:5FINGERS:5TOES:MOUTH:TONGUE:FACIAL_FEATURES:TEETH:RIBCAGE]
Next we use body detail plans (which have their own raw file) to streamline the addition of some of the common materials, tissues and their relationships with each other.
[BODY_DETAIL_PLAN:STANDARD_MATERIALS]
[BODY_DETAIL_PLAN:STANDARD_TISSUES]
[BODY_DETAIL_PLAN:VERTEBRATE_TISSUE_LAYERS:SKIN:FAT:MUSCLE:BONE:CARTILAGE]
[BODY_DETAIL_PLAN:HEAD_HAIR_TISSUE_LAYERS]
Eyebrows and eyelashes are manually added here.
[USE_TISSUE_TEMPLATE:EYEBROW:EYEBROW_TEMPLATE]
[TISSUE_LAYER:BY_CATEGORY:HEAD:EYEBROW:ABOVE:BY_CATEGORY:EYE]
[USE_TISSUE_TEMPLATE:EYELASH:EYELASH_TEMPLATE]
[TISSUE_LAYER:BY_CATEGORY:EYELID:EYELASH:FRONT]
And nails.
[USE_MATERIAL_TEMPLATE:NAIL:NAIL_TEMPLATE]
[USE_TISSUE_TEMPLATE:NAIL:NAIL_TEMPLATE]
[TISSUE_LAYER:BY_CATEGORY:FINGER:NAIL:FRONT]
[TISSUE_LAYER:BY_CATEGORY:TOE:NAIL:FRONT]
Set up some major arteries that couldn't be handled in the raw templates. The selection commands can be used to grab tissue layers to adjust their properties after they have been created.
[SELECT_TISSUE_LAYER:HEART:BY_CATEGORY:HEART]
[PLUS_TISSUE_LAYER:SKIN:BY_CATEGORY:THROAT]
[TL_MAJOR_ARTERIES]
Then back to some more body detail plans.
[BODY_DETAIL_PLAN:FACIAL_HAIR_TISSUES]
[BODY_DETAIL_PLAN:STANDARD_HEAD_POSITIONS]
[BODY_DETAIL_PLAN:HUMANOID_HEAD_POSITIONS]
[BODY_DETAIL_PLAN:HUMANOID_RIBCAGE_POSITIONS]
[BODY_DETAIL_PLAN:HUMANOID_RELSIZES]
[RELSIZE:BY_CATEGORY:LIVER:300] Of course! Standard relative size for humanoids is 200.
Tendons and ligaments are currently very abstract, but adding these flags will let wounds occur that damage them. The number afterward is the healing rate. Lower is faster.
[USE_MATERIAL_TEMPLATE:SINEW:SINEW_TEMPLATE]
[TENDONS:LOCAL_CREATURE_MAT:SINEW:200]
[LIGAMENTS:LOCAL_CREATURE_MAT:SINEW:200]
This makes the creature susceptible to severed nerves when muscles are torn in limb, grasp and stance parts.
[HAS_NERVES]
This controls the bleeding behavior.
[USE_MATERIAL_TEMPLATE:BLOOD:BLOOD_TEMPLATE]
[BLOOD:LOCAL_CREATURE_MAT:BLOOD:LIQUID]
These classes are used by syndromes (such as poison) as well as some restricted entity positions. You can name them whatever you want.
[CREATURE_CLASS:GENERAL_POISON]
Some tags to control the overall infection behavior.
[GETS_WOUND_INFECTIONS]
[GETS_INFECTIONS_FROM_ROT]
[USE_MATERIAL_TEMPLATE:PUS:PUS_TEMPLATE]
[PUS:LOCAL_CREATURE_MAT:PUS:LIQUID]
Attributes for dwarves are still described in terms of the median value below, but the actual game effects are altered according to the raw numbers. The numbers are different percentile values. 1000 is the human median for all attributes, so dwarven strength, for instance, has a higher median of 1250, although they suffer from their smaller size.
[PHYS_ATT_RANGE:STRENGTH:450:950:1150:1250:1350:1550:2250] +
[PHYS_ATT_RANGE:AGILITY:150:600:800:900:1000:1100:1500] -
[PHYS_ATT_RANGE:TOUGHNESS:450:950:1150:1250:1350:1550:2250] +
[MENT_ATT_RANGE:ANALYTICAL_ABILITY:450:950:1150:1250:1350:1550:2250] +
[MENT_ATT_RANGE:FOCUS:700:1200:1400:1500:1600:1800:2500] ++
[MENT_ATT_RANGE:CREATIVITY:450:950:1150:1250:1350:1550:2250] +
[MENT_ATT_RANGE:PATIENCE:450:950:1150:1250:1350:1550:2250] +
[MENT_ATT_RANGE:MEMORY:450:950:1150:1250:1350:1550:2250] +
[MENT_ATT_RANGE:SPATIAL_SENSE:700:1200:1400:1500:1600:1800:2500] ++
These tags establish the growth phases of the creature's life. The format is (BODY_SIZE|<year>|<day>|<average size>).
[BODY_SIZE:0:0:3000]
[BODY_SIZE:1:168:15000]
[BODY_SIZE:12:0:60000]
These body modifiers give individual dwarves different characteristics. In the case of HEIGHT, BROADNESS and LENGTH, the modifier is also a percentage change to the BODY_SIZE of the individual creature. The seven numbers afterward give a distribution of ranges. Each interval has an equal chance of occurring.
[BODY_APPEARANCE_MODIFIER:HEIGHT:100:100:100:100:100:100:100]
[APP_MOD_IMPORTANCE:500]
[BODY_APPEARANCE_MODIFIER:BROADNESS:100:100:100:100:100:100:100]
[APP_MOD_IMPORTANCE:500]
In order to set properties for body parts, first you select them. In this case, we select all body parts of category EYE, then we add a few modifiers to them.
[SET_BP_GROUP:BY_CATEGORY:EYE]
[BP_APPEARANCE_MODIFIER:CLOSE_SET:0:70:90:100:110:130:200]
[APP_MOD_NOUN:eyes:PLURAL]
[BP_APPEARANCE_MODIFIER:DEEP_SET:0:70:90:100:110:130:200]
[APP_MOD_NOUN:eyes:PLURAL]
[BP_APPEARANCE_MODIFIER:ROUND_VS_NARROW:0:70:90:100:110:130:200]
[APP_MOD_NOUN:eyes:PLURAL]
[BP_APPEARANCE_MODIFIER:LARGE_IRIS:25:70:90:100:110:130:200]
[APP_MOD_NOUN:eyes:PLURAL]
[APP_MOD_DESC_RANGE:30:60:90:110:150:190]
[SET_BP_GROUP:BY_CATEGORY:LIP]
[BP_APPEARANCE_MODIFIER:THICKNESS:50:70:90:100:110:130:200]
[APP_MOD_NOUN:lips:PLURAL]
[APP_MOD_DESC_RANGE:55:70:90:110:150:190]
[SET_BP_GROUP:BY_CATEGORY:NOSE]
[BP_APPEARANCE_MODIFIER:BROADNESS:25:70:90:100:110:130:200]
[APP_MOD_DESC_RANGE:30:60:90:110:150:190]
[BP_APPEARANCE_MODIFIER:LENGTH:25:70:90:100:110:130:200]
[APP_MOD_DESC_RANGE:30:60:90:110:150:190]
[BP_APPEARANCE_MODIFIER:UPTURNED:0:70:90:100:110:130:200]
[BP_APPEARANCE_MODIFIER:CONVEX:0:70:90:100:110:130:200]
[APP_MOD_NOUN:nose bridge:SINGULAR]
[SET_BP_GROUP:BY_CATEGORY:EAR]
[BP_APPEARANCE_MODIFIER:SPLAYED_OUT:0:70:90:100:110:130:200]
[APP_MOD_NOUN:ears:PLURAL]
[BP_APPEARANCE_MODIFIER:HANGING_LOBES:0:70:90:100:110:130:200]
[APP_MOD_NOUN:ears:PLURAL]
[BP_APPEARANCE_MODIFIER:BROADNESS:90:95:98:100:102:105:110]
[APP_MOD_IMPORTANCE:700]
[APP_MOD_NOUN:ears:PLURAL]
[APP_MOD_DESC_RANGE:91:94:98:102:106:109]
[BP_APPEARANCE_MODIFIER:HEIGHT:90:95:98:100:102:105:110]
[APP_MOD_IMPORTANCE:700]
[APP_MOD_NOUN:ears:PLURAL]
[APP_MOD_DESC_RANGE:91:94:98:102:106:109]
[SET_BP_GROUP:BY_CATEGORY:TOOTH]
[BP_APPEARANCE_MODIFIER:GAPS:0:70:90:100:110:130:200]
[APP_MOD_NOUN:teeth:PLURAL]
[BP_APPEARANCE_MODIFIER:LENGTH:100:100:100:100:100:100:100] for vampires
[APP_MOD_IMPORTANCE:1000]
[APP_MOD_NOUN:teeth:PLURAL]
[APP_MOD_DESC_RANGE:30:60:90:110:150:190]
[SET_BP_GROUP:BY_CATEGORY:SKULL]
[BP_APPEARANCE_MODIFIER:HIGH_CHEEKBONES:0:70:90:100:110:130:200]
[BP_APPEARANCE_MODIFIER:BROAD_CHIN:0:70:90:100:110:130:200]
[BP_APPEARANCE_MODIFIER:JUTTING_CHIN:0:70:90:100:110:130:200]
[BP_APPEARANCE_MODIFIER:SQUARE_CHIN:0:70:90:100:110:130:200]
[SET_BP_GROUP:BY_CATEGORY:THROAT]
[BP_APPEARANCE_MODIFIER:DEEP_VOICE:0:70:90:100:110:130:200]
[BP_APPEARANCE_MODIFIER:RASPY_VOICE:0:70:90:100:110:130:200]
[SET_BP_GROUP:BY_CATEGORY:HEAD]
[BP_APPEARANCE_MODIFIER:BROADNESS:90:95:98:100:102:105:110]
[APP_MOD_IMPORTANCE:700]
[APP_MOD_DESC_RANGE:91:94:98:102:106:109]
[BP_APPEARANCE_MODIFIER:HEIGHT:90:95:98:100:102:105:110]
[APP_MOD_IMPORTANCE:700]
[APP_MOD_DESC_RANGE:91:94:98:102:106:109]
These are as before.
[MAXAGE:150:170]
Attack definitions are formatted as follows:
Here, GENERAL_BABY_NAME is at the creature level, and BABYNAME is at the caste level. These names could be gender-specific but aren't right now.
[BABY:1]
[GENERAL_BABY_NAME:dwarven baby:dwarven babies]
[BABYNAME:dwarven baby:dwarven babies]
[CHILD:12]
[GENERAL_CHILD_NAME:dwarven child:dwarven children]
[CHILDNAME:dwarven child:dwarven children]
[EQUIPS]
[CAVE_ADAPT]
[DIURNAL]
This is the new format for making specific unit names for a creature. Any unit token can be used. If you want to add a caste-specific profession name, use CASTE_PROFESSION_NAME instead, once the caste has been declared.
[PROFESSION_NAME:CRAFTSMAN:craftsdwarf:craftsdwarves]
[PROFESSION_NAME:FISHERMAN:fisherdwarf:fisherdwarves]
[PROFESSION_NAME:HAMMERMAN:hammerdwarf:hammerdwarves]
[PROFESSION_NAME:SPEARMAN:speardwarf:speardwarves]
[PROFESSION_NAME:CROSSBOWMAN:marksdwarf:marksdwarves]
[PROFESSION_NAME:AXEMAN:axedwarf:axedwarves]
[PROFESSION_NAME:SWORDSMAN:swordsdwarf:swordsdwarves]
[PROFESSION_NAME:MACEMAN:macedwarf:macedwarves]
[PROFESSION_NAME:PIKEMAN:pikedwarf:pikedwarves]
[PROFESSION_NAME:BOWMAN:bowdwarf:bowdwarves]
[PROFESSION_NAME:MASTER_CROSSBOWMAN:Elite Marksdwarf:Elite Marksdwarves]
[PROFESSION_NAME:MASTER_BOWMAN:Elite Bowdwarf:Elite Bowdwarves]
[SPEECH:dwarf.txt]
[HOMEOTHERM:10067]
[ALCOHOL_DEPENDENT]
[SWIMS_LEARNED][SWIM_SPEED:2500]
[PERSONALITY:IMMODERATION:0:55:100]
[PERSONALITY:VULNERABILITY:0:45:100]
[PERSONALITY:STRAIGHTFORWARDNESS:0:55:100]
[MANNERISM_FINGERS:finger:fingers]
[MANNERISM_NOSE:nose]
[MANNERISM_EAR:ear]
[MANNERISM_HEAD:head]
[MANNERISM_EYES:eyes]
[MANNERISM_MOUTH:mouth]
[MANNERISM_HAIR:hair]
[MANNERISM_KNUCKLES:knuckles]
[MANNERISM_LIPS:lips]
[MANNERISM_CHEEK:cheek]
[MANNERISM_NAILS:nails]
[MANNERISM_FEET:feet]
[MANNERISM_ARMS:arms]
[MANNERISM_HANDS:hands]
[MANNERISM_TONGUE:tongue]
[MANNERISM_LEG:leg]
[MANNERISM_LAUGH]
[MANNERISM_SMILE]
[MANNERISM_WALK]
[MANNERISM_SIT]
[MANNERISM_BREATH]
[MANNERISM_POSTURE]
[MANNERISM_STRETCH]
[MANNERISM_EYELIDS]
[SPOUSE_CONVERSION_TARGET]
Now we'll declare the specific castes.
[CASTE:FEMALE]
The gender tag lets it know how breeding works.
[FEMALE]
[MULTIPLE_LITTER_RARE]
To add beards, put square brackets around the following:
BODY_DETAIL_PLAN:FACIAL_HAIR_TISSUE_LAYERS
[CASTE:MALE]
[MALE]
[BODY_DETAIL_PLAN:FACIAL_HAIR_TISSUE_LAYERS]
This command lets you select all of the castes again.
[SELECT_CASTE:ALL]
[SKILL_RATES:1:8:8:16]
Now we'll select all of the hair tissue layers we can find so that we can add colorations to them. Even if the castes have different tissue layers, it'll find the layers and establish modifiers for each of the castes properly.
[SET_TL_GROUP:BY_CATEGORY:HEAD:HAIR]
[PLUS_TL_GROUP:BY_CATEGORY:HEAD:CHEEK_WHISKERS]
[PLUS_TL_GROUP:BY_CATEGORY:HEAD:CHIN_WHISKERS]
[PLUS_TL_GROUP:BY_CATEGORY:HEAD:MOUSTACHE]
[PLUS_TL_GROUP:BY_CATEGORY:HEAD:SIDEBURNS]
[PLUS_TL_GROUP:BY_CATEGORY:HEAD:EYEBROW]
[PLUS_TL_GROUP:BY_CATEGORY:HEAD:EYELASH]
A color modifier takes a list of color patterns (every color is associated to a monotone color pattern of its color, so you can also use color tokens) and frequencies.
[TL_COLOR_MODIFIER:AMBER:1:AUBURN:1:BLACK:1:BROWN:1:BUFF:1:BURNT_SIENNA:1:BURNT_UMBER:1:CHARCOAL:1:CHESTNUT:1:CHOCOLATE:1:CINNAMON:1:COPPER:1:DARK_BROWN:1:DARK_CHESTNUT:1:DARK_TAN:1:ECRU:1:FLAX:1:GOLD:1:GOLDEN_YELLOW:1:GOLDENROD:1:LIGHT_BROWN:1:MAHOGANY:1:OCHRE:1:PALE_BROWN:1:PALE_CHESTNUT:1:PUMPKIN:1:RAW_UMBER:1:RUSSET:1:SAFFRON:1:SEPIA:1:TAN:1:TAUPE_DARK:1:TAUPE_GRAY:1:TAUPE_MEDIUM:1:TAUPE_PALE:1:TAUPE_SANDY:1]
[TLCM_NOUN:hair:SINGULAR]
[TL_COLOR_MODIFIER:GRAY:1]
This gives the start and finish time in <year>|<days> for the color change to occur
[TLCM_NOUN:hair:SINGULAR]
[TLCM_TIMING:ROOT:80:0:130:0]
[TL_COLOR_MODIFIER:WHITE:1]
[TLCM_NOUN:hair:SINGULAR]
[TLCM_TIMING:ROOT:130:0:150:0]
Now we'll select the eyebrows and eyelashes and give them variable lengths.
[SET_TL_GROUP:BY_CATEGORY:HEAD:EYEBROW]
[TISSUE_LAYER_APPEARANCE_MODIFIER:LENGTH:50:80:90:100:110:120:150]
[APP_MOD_NOUN:eyebrows:PLURAL]
[APP_MOD_DESC_RANGE:55:70:90:110:130:145]
[TISSUE_LAYER_APPEARANCE_MODIFIER:DENSE:50:80:90:100:110:120:150]
[APP_MOD_NOUN:eyebrows:PLURAL]
[APP_MOD_DESC_RANGE:55:70:90:110:130:145]
[TISSUE_LAYER_APPEARANCE_MODIFIER:HIGH_POSITION:0:70:90:100:110:130:200]
[APP_MOD_NOUN:eyebrows:PLURAL]
[SET_TL_GROUP:BY_CATEGORY:HEAD:EYELASH]
[TISSUE_LAYER_APPEARANCE_MODIFIER:LENGTH:50:80:90:100:110:120:150]
[APP_MOD_NOUN:eyelashes:PLURAL]
[APP_MOD_DESC_RANGE:55:70:90:110:130:145]
All of the other hair is selected and started at length zero. It's fine to group them all together like this -- the creature can still accomodate different lengths once hair cutting/styling goes in. I used one modifier here because the growth rates and starting length are all the same.
[SET_TL_GROUP:BY_CATEGORY:HEAD:HAIR]
[PLUS_TL_GROUP:BY_CATEGORY:HEAD:CHEEK_WHISKERS]
[PLUS_TL_GROUP:BY_CATEGORY:HEAD:CHIN_WHISKERS]
[PLUS_TL_GROUP:BY_CATEGORY:HEAD:MOUSTACHE]
[PLUS_TL_GROUP:BY_CATEGORY:HEAD:SIDEBURNS]
[TISSUE_LAYER_APPEARANCE_MODIFIER:LENGTH:0:0:0:0:0:0:0]
[APP_MOD_NOUN:hair:SINGULAR]
Here we set the growth rate. This will change the modifier (LENGTH) by 1 each day up to a maximum of 1000 from the start of the dwarf's life (early beards!) for as long as the dwarf is alive. The format is (APP_MOD_RATE|<rate>|<scale>|<min>|<max>|<start year>|<start day>|<end year>|<end day>) where the final two tokens can be replaced by NO_END if the growth is to continue indefinitely.
[APP_MOD_RATE:1:DAILY:0:1000:0:0:NO_END]
[APP_MOD_DESC_RANGE:10:25:75:125:200:300]
[TISSUE_LAYER_APPEARANCE_MODIFIER:CURLY:0:70:90:100:110:130:200]
[APP_MOD_NOUN:hair:SINGULAR]
[TISSUE_LAYER_APPEARANCE_MODIFIER:GREASY:0:70:90:100:110:130:200]
[APP_MOD_NOUN:hair:SINGULAR]
[TISSUE_LAYER_APPEARANCE_MODIFIER:DENSE:50:80:90:100:110:120:150]
[APP_MOD_NOUN:hair:SINGULAR]
[APP_MOD_DESC_RANGE:55:70:90:110:130:145]
[SET_TL_GROUP:BY_CATEGORY:HEAD:HAIR]
[TISSUE_STYLE_UNIT:HAIR:STANDARD_HAIR_SHAPINGS]
[TSU_NOUN:hair:SINGULAR]
[SET_TL_GROUP:BY_CATEGORY:HEAD:CHEEK_WHISKERS]
[PLUS_TL_GROUP:BY_CATEGORY:HEAD:CHIN_WHISKERS]
[TISSUE_STYLE_UNIT:BEARD:STANDARD_BEARD_SHAPINGS]
[TSU_NOUN:beard:SINGULAR]
[SET_TL_GROUP:BY_CATEGORY:HEAD:MOUSTACHE]
[TISSUE_STYLE_UNIT:MOUSTACHE:STANDARD_MOUSTACHE_SHAPINGS]
[TSU_NOUN:moustache:SINGULAR]
[SET_TL_GROUP:BY_CATEGORY:HEAD:SIDEBURNS]
[TISSUE_STYLE_UNIT:SIDEBURNS:STANDARD_SIDEBURNS_SHAPINGS]
[TSU_NOUN:sideburns:PLURAL]
Here we handle nail length.
*** need a new style to keep these short and need to make the entity def say to keep them short
SET_TL_GROUP:BY_CATEGORY:FINGER:NAIL]
PLUS_TL_GROUP:BY_CATEGORY:TOE:NAIL]
TISSUE_LAYER_APPEARANCE_MODIFIER:LENGTH:100:100:100:100:100:100:100]
APP_MOD_RATE:1:DAILY:0:1000:0:0:NO_END]
APP_MOD_NOUN:nails:PLURAL]
Here all of the skin is selected and various colors are listed.
[SET_TL_GROUP:BY_CATEGORY:ALL:SKIN]
[TL_COLOR_MODIFIER:BROWN:1:BURNT_UMBER:1:CINNAMON:1:COPPER:1:DARK_BROWN:1:DARK_PEACH:1:DARK_TAN:1:ECRU:1:PALE_BROWN:1:PALE_CHESTNUT:1:PALE_PINK:1:PEACH:1:PINK:1:RAW_UMBER:1:SEPIA:1:TAN:1:TAUPE_PALE:1:TAUPE_SANDY:1]
[TLCM_NOUN:skin:SINGULAR]
[TISSUE_LAYER_APPEARANCE_MODIFIER:WRINKLY:0:0:0:0:0:0:0]
[APP_MOD_RATE:1:YEARLY:0:100:60:0:NO_END]
[APP_MOD_NOUN:skin:SINGULAR]
[APP_MOD_DESC_RANGE:0:0:0:1:25:50]
Now we do the eyes, using the somewhat clunky eye color patterns.
[SET_TL_GROUP:BY_CATEGORY:EYE:EYE]
[TL_COLOR_MODIFIER:IRIS_EYE_AMETHYST:1:IRIS_EYE_AQUAMARINE:1:IRIS_EYE_BRASS:1:IRIS_EYE_BRONZE:1:IRIS_EYE_COBALT:1:IRIS_EYE_COPPER:1:IRIS_EYE_EMERALD:1:IRIS_EYE_GOLD:1:IRIS_EYE_HELIOTROPE:1:IRIS_EYE_JADE:1:IRIS_EYE_OCHRE:1:IRIS_EYE_RAW_UMBER:1:IRIS_EYE_RUST:1:IRIS_EYE_SILVER:1:IRIS_EYE_SLATE_GRAY:1:IRIS_EYE_TURQUOISE:1]
[TLCM_NOUN:eyes:PLURAL]
Most of it is based on the standard dwarf code. The notable exceptions are as follows:
- [NOPAIN] and [NOEXERT] tags added - I verified in melee tests that being unconscious not only causes enemies to automatically target the head, but also causes hits to be... lets say "heavier". After a hammerdwarf experiment, parsed the gamelog to show only headshots and skimmed through the results. I noticed that the first 10% of the parsed gamelog contained many counts of the hammers bruising the fat of the head. However, the following 90% contained none at all, only skull shatterings and brain jams. I assume that in the beginning of the test, many head shots were performed against conscious individuals, which have some sort of ability to mitigate damage even when a hit lands (perhaps the fighter skill?). Since hammers are pretty strong as a suppression weapon (quickly causing pain and loss of consciousness), for almost the whole duration of the test the subjects were unconscious, and no... skill roll for damage mitigation could be performed. Note 1: This was only confirmed in the case of melee hammerdwarves. Note 2: If You are testing suppression (how quickly an enemy is knocked unconscious) these tags should obviously be removed
- All attack definitions removed - again, this is more melee oriented. Thanks to this arena dwarves cannot punch, kick, scratch or bite. Unfortunately this does not eliminate wrestling or pushing
- Skill gain reduced - I think this is an absolutely critical modification - performed by adding [SKILL_RATES:1:8:8:16], it reduces skill gain rates to 1% of the original value. So if You start out the test with Competent Marskdwarves, You'll end it with Competent Marksdwarves, instead of, say, Proficient ones
- Average size enforced - to be honest, I am not certain whether this changes actual dwarf size or only their descriptions, but I modded the size descriptors so that all arena dwarves are always average size
Also, I remember You once mentioned that Your macros sometimes get messed up during operation, with no apparent reason. I also had this problem, and I recently identified the reason - any mouse movement (not clicking - just movement itself). Now I unplug the mouse when running macros and I haven't had a mishap since.
There are two things which prevent me from immediately adding these armors:
1) They are not available in the arena without modding. I'm not sure I know the proper way to add them, and I don't want to mess it up.
2) It already takes me all night to run the set I use currently.
I would like to try such things eventually though. If you know the proper way to add them, I'd be very interested.
The only thing which is not available in arena mode without modding is bone items - wood armor and candy clothes are readily avialable. You can use the fake bone template I introduced in the first post of this thread. Adding it to the inorganic_metal.txt file should allow bone weapons/armors (admittedly, I'm not certain how close fake bone is to real bone, but I am using the parameters for bone from the material_template_default.txt file, so I assume it is pretty close)
We must go deeper!
local l = df.global.world.proj_list
l=l.next
while l do
printall(l.item)
print("-")
l = l.next
end
...
snip!
...
So what happens when you compare the velocities calculated from this algorithm to the deflection data?
Thanks a lot for this great work Urist! I confirmed that for iron bolts, unk22 is equal to [SHOOT_FORCE] for several values between 40 and 100 (the range I was testing). I also confirmed that unk22 is 1000 for candy bolts even at [SHOOT_FORCE:1]. Furthermore, this explains a result that I found a while back - if you reduce the bolt size so that the mass is more realistic (say 100 g per bolt) then there is no longer any dependence damage on [SHOOT_FORCE]. I didn't report this at the time as I thought maybe I had broken DF by doing this or something, but now it is clear that DF was rounding all bolt masses down to zero in this case, so that they always were fired with [MAX_VELOCITY].
I would also say that this provides pretty clear evidence that crossbows fire bolts with constant momentum, as you thought, and not with constant energy. Looks like I owe you a dwarven ale... ;). Understanding how the game treats bolts at this very low level will be immensely helpful in working out the full details of how deflections work.
On that note, here is a plot of deflection vs [SHOOT_FORCE] for iron bolts fired at arena dwarves (no pain->no unconciousness) wearing steel helm, breastplate, greaves, low boots, and gauntlets:
(http://i.imgur.com/jfxl8.png)
It jumps from 100% at force=47 to 22% at force=48, and then tails off rather smoothly from there. I am going to try running for some different armor/ammo combinations today, but my scripts keep stalling lately for some reason, so not sure if it will work.
Guys.
Stop it.
I need something to do my thesis on sometime in the next decade and you're going too fast. I'll have to study and graph something real at the rate you're going.
Do not fret, by v0.51 most of this will probably be obsolete data ^_^ The field of dwarven ballistics (and other fields) will be in need of fresh blood for years to come.
On that note, here is a plot of deflection vs [SHOOT_FORCE] for iron bolts fired at arena dwarves (no pain->no unconciousness) wearing steel helm, breastplate, greaves, low boots, and gauntlets:
(http://i.imgur.com/jfxl8.png)
It jumps from 100% at force=47 to 22% at force=48, and then tails off rather smoothly from there. I am going to try running for some different armor/ammo combinations today, but my scripts keep stalling lately for some reason, so not sure if it will work.
So 47/48 is the velocity deflection threshold for Iron vs Steel. We can assume that there is another discrete binary deflection mechanism which can be uncovered here, similar to the IMPACT_YIELD threshold. And an even more interesting non-binary relationship for velocities above the threshold. A study of this will probably explain how wood vs candy deflections work.
I also went back to the bolt knockback studies (http://www.bay12forums.com/smf/index.php?topic=116151.msg3671055#msg3671055) in this thread and I think they can now be reliably explained by Urist da Vinci's findings. Even though the velocity of an fired projectile is calculated using the floored weight value of the bolt, knockback calculations are done in floating-point. So it is possible to obtain a relative value of velocity of all the dwarves. I call it relative, because at the moment I have nothing to relate it to. So if a dwarf was propelled at the speed of 1829.65 (silver), then at this level of study I cannot really say what that means exactly. It is known, however, that the dwarf was propelled 11 tiles horizontally before completing a vertical free fall of 8 tiles. It is also known that the free fall time for dwarves shot with other bolts will be the same, since the vertical velocity is not affected by horizontal propulsion. It can thus be safely assumed that the speed at which a dwarf is propelled will be proportional to the distance he is propelled before hitting the ground.
Based on the furthest distance a dwarf was propelled (11 tiles, achieved by silver bolts) I estimated the distance multiplier to be 0.006012 - that is, tiles_propelled(silver)/dwarf_speed(silver) = 11/1829.65 = 0.006012. Hopefully, multiplying this by the calculated dwarf speed will give the number of tiles a dwarf will be propelled before completing an 8-tile free-fall for different bolts used.
(http://imageshack.us/a/img835/8618/knockbackcalc.png)
And the estimates proved to match up with the experimental data. This explains the previously confusing event of silver bolts propelling dwarves the furthest, despite not being the heaviest type of bolt used. They simply were the heaviest bolts lighter than 2 urists (the velocity cap was set to the same value as SHOOT_FORCE - 100000 - so 0 urist and 1 urist bolts had the same velocity). Since the velocity of all bolts lighter than 2 urists was the same, the heaviest one of that group had the most momentum.
An implication of this algorithm to a default-force, superhigh-maxvel crossbow is that a bolt which weighs 1.01 urists will be shot at velocity 1000, whereas a bolt which weighs 0.99 urists will be shot at "divide by zero" speed. This is absurd since the crossbow hasn't propelled the projectile with more force. Decreasing the bolt's weight by a negligible amount has made it orders of magnitude more dangerous. This problem wouldn't exist if Toady was using a floating point calculation for the bolt weight and shoot force.
Interesting knockback implication - by increasing the velocity cap to, say, 2'000'000 (or higher) and leaving shoot force as is, crossbows with lightweight bolts (wood and candy) should become very fun knockback guns.
[Edited for fallacious formulas]
Here are some results using uniarmor instead of standard plate armor. There appear to be no changes for deflections of metal bolt vs. steel armor.
| | 5.00 | 10.00 | 15.00 | 20.00 | 25.00 | 30.00 | 35.00 | 40.00 | 45.00 | 46.00 | 47.00 | 48.00 | 49.00 | 50.00 | 55.00 | 60.00 | 65.00 | 70.00 | 75.00 | 80.00 | 90.00 | 100.00 |
bronze | steel | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 0.20 | 0.19 | 0.19 | 0.18 | 0.19 | 0.18 | 0.16 | 0.03 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 |
copper | steel | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 0.19 | 0.19 | 0.18 | 0.18 | 0.18 | 0.18 | 0.16 | 0.04 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 |
iron | steel | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 0.20 | 0.18 | 0.19 | 0.19 | 0.18 | 0.09 | 0.03 | 0.00 | 0.00 | 0.00 | 0.00 |
silver | steel | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 0.18 | 0.18 | 0.18 | 0.15 | 0.13 | 0.08 | 0.09 | 0.01 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 |
steel | steel | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 0.20 | 0.19 | 0.20 | 0.18 | 0.19 | 0.08 | 0.03 | 0.01 | 0.00 | 0.00 | 0.00 |
Based on these results, it is clear that velocity-dependent deflection depends on momentum:
(http://i.imgur.com/T9Jqk.png)
For this set of bolts, all masses round to 1, so the velocity is equal to the [SHOOT_FORCE] (I have also verified this for all these materials). Therefore, momentum will be proportional to density times force. When I plot deflection vs. momentum (force*density), the data for all five bolt types falls onto the same curve. This shows that this type of deflection is proportional to momentum, and not energy (as then it would depend on force^2 * density). This would be consistent with modeling an elastic collision, but then again it doesn't appear that Toady worries about making DF physics agree with the real world at this level.
Edit:
The fact that I am able to get the same result for deflection of different bolt materials plotted vs. momentum indicates that this mechanism is independent of bolt material properties other than density. This of course means that it is independent of [IMPACT_YIELD], and is therefore different from the [IMPACT_YIELD] deflection Urist describes in the previous post. I suppose I cannot rule out all dependence on other bolt material parameters, as some parameters might be fairly similar for all metals, but I did specifically rule out [IMPACT_YIELD] as I get no change in this behavior from doubling it (not to mention that the impact yield of steel is almost 5 times that of silver).
Also, it does not look like variations in layer thickness are responsible for the sudden drop from 1.00 to 0.20. Since there was no change at all from minor modifications in the layer thickness (going from normal armor to uniarmor), I suspect that the layer thickness is rounded in this case as well. Furthermore, in the full table of results for different materials, there are some deflection ratios between 0.2 and 1.0, such as copper bolts vs. iron. Taken together, this suggests that there is not actually a binary transition for this deflection mechanism, but rather a fast change that we can't always see with integer changes in force. If I squint at the curve, it appears that there may be an exponential decay from 1.0 to ~0.2 that begins at about momentum 370,000, and then a second (slower) decay from 0.2 to zero that starts at about momentum 440,000.
Edit #2:
My next step is to test how armor material parameters impact the two transitions. To test this I am measuring deflection of iron off steel for [SHOOT_FORCE] 47, 48, 60 and 65 after doubling the indicated material parameter multiplying the indicated material parameter by 10 (I realized multiplying by ten is much easier when doing string matching, as you just have to add a zero). I will add results here as I get them.
Edit #3:
So, it seems my script to automatically go through all the material parameters wasn't working, and ended up saying that all bolts deflect all the time. It appears that I somehow messed up the part of the script that changes force when I added in the material parameters. I think I might take a break for a while and work on this another day. Very sorry if anyone looked at my preliminary results and was confused.
Here are the force vs. deflection curves for steel bolts against bronze armor with impact parameters copied from steel ([IMPACT_YIELD:1505000], [IMPACT_FRACTURE:2520000], and [IMPACT_STRAIN_AT_YIELD:940]), the indicated SHEAR value set equal to steel, and all other parameters equal to bronze.
(http://i.imgur.com/MYmDP.png)
As you can see, the curves are nearly identical, except that with SHEAR_FRACTURE increased equal to steel the deflection drops to 0.2 at force 46, and with SHEAR_YIELD it doesn't drop until force 48.
...
Here's some more numbers for force dependence after multiplying IMPACT_YIELD, IMPACT_FRACTURE and IMPACT_STRAIN_AT_YIELD by 10:
...
I examined these numbers and it appears that, for iron bolts and steel armor, the deflection threshold kinetic energy is linearly related to IMPACT_YIELD and IMPACT_STRAIN_AT_YIELD.
Unfortunately, I don't think the relationship is this simple. It appears to be true that, for IMPACT_YIELD>IMPACT_FRACTURE, deflection threshold kinetic energy is linearly proportional to IMPACT_YIELD. Here are some results for the force where deflection equals approximately 60% (the middle of the transition between 1.0 and 0.2) as a function of IMPACT_YIELD:
(http://i.imgur.com/qIPwO.png)
I have also plotted the square of the force (proportional to the kinetic energy) as a function of IMPACT_YIELD-IMPACT_FRACTURE:
(http://i.imgur.com/OXw4i.png)
As you can see, it is linear for IMPACT_YIELD>IMPACT_FRACTURE, but not for smaller IMPACT_YIELD.
update: I added more points to the above curves. Note the discontinuity at IMPACT_YIELD=IMPACT_FRACTURE=2520000 - I believe this is real. Here is also a zoom-in of the kinetic energy plot above near the transition:
(http://i.imgur.com/H4RwU.png)
Here are some of the raw deflection vs. force curves that I used to determine the transition.
(http://i.imgur.com/WYUBG.png)
The number next to the curve in the legend is IMPACT_YIELD. The data for low IMPACT_YIELD is not in here - I only copied down the force for the transition from 1.0 to 0.2 and not the force/deflection curve. I have all the raw gamelogs, so I will try to add in this data later.
Edit - here is another set with IMPACT_YIELD <= IMPACT_FRACTURE. Note that the curve for IMPACT_YIELD=IMPACT_FRACTURE=2520000 is quite different from the others.
I have also posted most of my data on DFFD (http://dffd.wimbli.com/file.php?id=7089) (I updated this more data). I created this using Gnumeric (linux spreadsheet editor) and converted to excel, so the graphs will probably be all messed up, but the data should be fine.
One other comment about the data - as |IMPACT_YIELD-IMPACT_FRACTURE| gets larger, the size of the plateau at 0.2 also gets larger. This is also true for at least some values where IMPACT_YIELD<IMPACT_FRACTURE. Notice that IMPACT_YIELD:3010000 (just above the IMPACT_FRACTURE:2520000) the plateau seems to have almost disappeared, but it is quite prevalent for vanilla IMPACT params (see earlier posts), which have IMPACT_YIELD:1505000.
Looking at those bronze results, it looks like you increased each parameter x10.
I actually only multiplied by 2 each time. Very sorry I forgot to mention that. It took me so many tries to get the run to work I forgot that I had made that change by the time I posted the data.
Today I am going to do some detailed runs for IMPACT_YIELD<IMPACT_FRACTURE.
Edit:
I looked at Urist's results more carefully, and it appears he only considered IMPACT_YIELD>IMPACT_FRACTURE, so his results are consistent with my finding that in this range the kinetic energy required to penetrate armor scales linearly with IMPACT_YIELD.
In addition to running IMPACT_YIELD<IMPACT_FRACTURE, I also am running IMPACT_YIELD=IMPACT_FRACTURE today, and before I left I peeked at the first few results and I can say that it is weird. At Force=45, there are ~90% deflections, which is very strange given that at very small impact yield there are 100% deflections at Force=45. Candy has IMPACT_YIELD=IMPACT_FRACTURE=5000000, so we should expect the behavior of candy to be weird as well. I definitely plan to explore force/deflection curves at different values of IMPACT_YIELD=IMPACT_FRACTURE.
I am hoping that in the next few days (or maybe this weekend) I can write code to do a simplex search to automatically map out force/deflection curves. Right now I just tell the computer to evaluate deflection at a set of force values, but frequently the result is not at all what I expected, and therefore the forces I evaluate at are not ideal for mapping a good curve. I need the computer to instead search for the forces which give certain values of deflection (x=1.0, 0.8, 0.6, 0.4, 0.2, 0.1 and 0.0), and then search until it finds a pair of adjacent forces such that the higher force has deflection less than or equal to x, and the lower force has deflection greater than or equal to x (for example, for iron vs. vanilla steel, the pair of forces (47,48) satisfy this for x between 1.0 and 0.2). Since this is a one dimensional search, the simplex method (http://en.wikipedia.org/wiki/Simplex_algorithm) should do a good job. Given how complicated the dependence on impact parameters appears to be, I think it would be most efficient for me to focus my efforts on writing this search code over the next few days, and not worry about running more data sets until I have it finished.
Urist - do you (or anyone else who's motivated) have any interest in my collection of perl scripts? They are written to work under linux, but I think the only change needed to make them work under windoze would be to call a different program to send keystrokes to DF. For example, I think this (http://technet.microsoft.com/en-us/library/ee156592.aspx) might work, but I'm not sure if it's compatible with perl. I definitely plan to post my scripts to DFFD eventually (and I did post some (http://dffd.wimbli.com/file.php?id=6895) a while back), but I end up changing them pretty much daily as I find that I need to do a more and more complex search to map out the parameter space. So unless someone is really interested and into computer programming, I will wait until I have something that is more stable and also hopefully commented at least decently well before putting it up there.
Pirate Bob, could you please plot some 100% deflection threshold data where you start out with yield=fracture, and then increase the fracture strength in steps up to about 5x yield? Then alter the strain at yield, and run the test again with the same values. You could use Bronze as the material, and try it with normal, double, and zero strain. The graph of this data should give us a good idea of how the ductile-brittle transition is handled, and when strain starts to matter.
I am working on these plots. I uncovered a bug with my simplex code when I implemented for projectile testing, but I am 99% sure that is squashed now. I am running overnight with steel armor starting with fracture=yield and increasing fracture, for several values of stain at yield. I chose steel to start as I am slightly worried that bronze's behavior might be unusual, at least for deflection of iron. I can run bronze next (i.e. tomorrow), unless there is something else more interesting to work on.
Edit: Here are some preliminary results - the run is taking longer than I expected, so it will not be finished until this afternoon. I am running with double IMPACT_STRAIN_AT_YIELD now and will post results later today.
This was run using steel armor ([IMPACT_YIELD:1505000]), with IMPACT_FRACTURE = 1505000, 1512000, 2016000, 2520000, 5040000, 10080000, and 15120000. I have run two sets so far, with IMPACT_STRAIN_AT_YIELD equal to 940 and 470. I also added in a point at IMPACT_FRACTURE=3780000 for 470, which I will include in future runs. This plots shows the minimum force(=velocity) where armor was penetrated for iron bolts against steel uniarmor, with all parameters not mentioned at vanilla values.
(http://i.imgur.com/t8IIw.png)
(updated)
It's hard to say for sure, but it appears that the cutoff force increases linearly with IMPACT_FRACTURE until a point determined by the inverse of IMPACT_STRAIN_AT_YIELD, and then remains constant. It is also possible that the true behavior is something like an exponential decay to a constant value - it's hard to say for sure without more data. Fitting the strain at yield 470 curve to a line for fracture<3000000 gives force cutoff = 3.53967E-5 * IMPACT_FRACTURE - 28.5878.
Edit #2: I updated the plot above to include data with strain=1880, and also plotted the curve for 10% deflection (which does not depend on strain). In this case, all values of IMPACT_FRACTURE drop to 20% deflection at force/velocity approximately 25. I have also included plots of the full force/deflection curves for each value of IMPACT_FRACTURE and IMPACT_STRAIN_AT_YIELD. There is a separate plot for each IMPACT_STRAIN_AT_YIELD, and each curve within the plot has the labeled value of IMPACT_FRACTURE.
(http://i.imgur.com/29Jnv.png)
(http://i.imgur.com/e7R7p.png)
(http://i.imgur.com/e1Jz6.png)
I also plotted the force for 10% deflection as a function of IMPACT_FRACTURE for each value of IMPACT_STRAIN_AT_YIELD. This force doesn't hardly depend on IMPACT_STRAIN_AT_YIELD and it is linear with IMPACT_FRACTURE.
(http://i.imgur.com/09wdB.png)
Finally, I also updated my spreadsheet on DFFD (http://dffd.wimbli.com/file.php?id=7089) to add a sheet with the raw data for all of these plots.
It appears that, if IMPACT_FRACTURE is below some cutoff determined by IMPACT_STRAIN_AT_YIELD (and possibly other parameters such as IMPACT_YIELD) that deflection exhibits a smooth, sigmoidal drop from 1 to zero, with the middle of the drop given by SHOOT_FORCE = 3.65E-5 * IMPACT_FRACTURE - 27.13 (note - I believe the reason this slope is slightly different than the slope for the 100% deflection cutoff is because the sigmoidal transition also gets wider as IMPACT_FRACTURE increases). If IMPACT_FRACTURE goes over the threshold, then deflection drops to ~19% at some fixed force which depends on IMPACT_STRAIN_AT_YIELD, but not IMPACT_FRACTURE. Deflection will always follow the same sigmoidal curve from 19% to zero, regardless of the cutoff.
My next steps will be to check this at lower values of IMPACT_STRAIN_AT_YIELD (higher cutoff) and to see how IMPACT_YIELD figures into this behavior. I also would like to see how bronze behaves, as Urist Da Vinci suggested using bronze for these tests and he may have had a good reason. I definitely feel like we're getting somewhere...
Here is an update of the force where deflection drops from 100% to ~20% at large [IMPACT_FRACTURE] as a function of [IMPACT_STRAIN_AT_YIELD].
(http://i.imgur.com/ITqVs.png)
The new point is at [IMPACT_STRAIN_AT_YIELD]=3760, force=18, and goes below the minimum cutoff expected based on momentum=IMPACT_YIELD/50000. With this point, it is also clear that the curve does deviate significantly from cutoff momentum=50000/[IMPACT_STRAIN_AT_YIELD], especially at large [IMPACT_STRAIN_AT_YIELD], but the deviation is small enough that I can't really characterize it well.
My results from doubling the Contact Area for bolts from 2 to 4 show no changes at all:
(http://i.imgur.com/YuV0D.png)
(http://i.imgur.com/M1oMa.png)
The plots of the forces for 10% and 100% deflection as a function of [IMPACT_FRACTURE] are identical to those with contact area 2, and I could see no significant deviations in the raw data either. I think Urist Da Vinci said he saw some difference from changing Contact Area, but I'm not sure what and I'm too tired to look it up now.
...
Pirate Bob, could you please retest the following plot after making the edit?
...
Could you also edit your script to output the percent of hits that include the word "tearing", and the percent of hits that include the word "bruising". A bruising-tearing transition should become apparent when those results are plotted along with deflection like above.
I can definitely do that today/tonight. Hopefully this will make things much simpler. I should have checked that the uniarmor worked as advertized, but I don't totally understand how coverage works. I think I will also run a test where I reduce all armor thickness to 1. If we understand how armor thickness is used correctly, this should make no difference compared to 20 (as both 1 and 20 * CONTACT_AREA=2 will round up to 100).
I already have my script find the percentages that result in bruising and tearing, but I am just not recording the result right now, so recording it should be no problem at all. I'm not sure exactly what you had in mind, so I think I will record %chips, fractures, bruising, and tearing all seperately, as well as the % which ONLY have bruising (which I was calling non-serious hits before). If there's anything else you would like me to record, let me know and I can try to add it. I also keep all the raw gamelog.txt files from all of my runs, so we can always go back and re-analyze them (or even look at them by eye) if you think of something later. I'd post them to DFFD, but I think I'm up to several GB of logs now. If there are ever specific logs you would like to see, please let me know.
Edit:
I did a quick run and verified that you are correct - with uniform armor thickness there is only one cutoff:
(http://i.imgur.com/GVe9l.png)
I am now setting up to do a full run and output %tear, %bruises etc.
Before seeing my latest research, take a look at these 2008 Toady quotes:
http://www.bay12forums.com/smf/index.php?topic=30026.msg996723#msg996723
http://www.bay12forums.com/smf/index.php?topic=21498.msg371081#msg371081
http://www.bay12forums.com/smf/index.php?topic=21498.msg369028#msg369028
http://www.bay12forums.com/smf/index.php?topic=21498.msg368028#msg368028
In particular:
So we'll also have armor acting like a pseudo tissue layer for purposes of transmitting bludgeoning damage and so forth? Additionally, if we're talking about a steel-skinned creature (Giant Magma Ants?) instead of a steel-armoured creature, is the force transfer handled differently?
Yeah, that's basically how it works. The armor is all checked in order from outer to inner, then it gets at the tissue layers, altering the character of the attack as it goes. There's a little left to do there, so it's not completely clear to me which way it'll go as far as how much force is transferred (or if it matters if it's skin or armor -- it doesn't currently, though yeah, there is a difference in real life). It has to be enough that skin doesn't stop bones from being broken, but not so much that armor is useless against impacts, depending on the mats and nature of the armor/clothing.
So what I did is give dwarves steel skin:
[TISSUE_TEMPLATE:SKIN_TEMPLATE]
[TISSUE_NAME:skin:NP]
[SCARS]
TISSUE_MATERIAL:LOCAL_CREATURE_MAT:SKIN removed brackets
[TISSUE_MATERIAL:INORGANIC:STEEL]
[RELATIVE_THICKNESS:1]
Lower is faster.
HEALING_RATE:100 removed brackets don't want dents to vanish
[VASCULAR:1]
[PAIN_RECEPTORS:5]
[CONNECTS]
[TISSUE_SHAPE:LAYER]
and then I shot iron bolts at them at various velocities. This appears to provide the same level of protection as the updated steel uniarmor set. The advantage here is that I can use dfhack to get the wound data (strains and the percent fractured/penetrated) whenever the steel skin is damaged.
One result is that the strain never exceeds the strain at the time the tissue is fractured:
strain at fracture = IMPACT_STRAIN_AT_YIELD * IMPACT_FRACTURE / IMPACT_YIELD
i.e. 940 * 2520000 / 1505000 = 1573 (sometimes 1574)
Another result is that we can compare the combat text for steel skin and steel armor at various iron bolt velocities (these are NOT threshold velocities):
v steel skin dwarf steel armor on normal dwarf
1 glance away deflected
25 bruised deflected
30 bruised/dented deflected
35 dented deflected
40 dented deflected
45 dented/fractured deflected
50 dented/fractured, bruise muscle bruise muscle through the armor
55 fractured 20-60%, bruise muscle bruise muscle through the armor
70 fractured 100%, tearing muscle tearing the muscle through the armor
See the plot below of strains in the steel skin at various velocities. The horizontal axis is the sample size, scaled to a sample size of 100. We see that bruising occurred 25% of the time at velocity 30, and denting the other 75% of the time, regardless of the body part hit. We see that fractures (only about a 5% fracture) occurred 23% of the time at velocity 45, and that is also regardless of the body part struck.
(http://i.imgur.com/ozdTd.png)
I'm not sure what to make of the stepped strains yet. It isn't related to contact or body part size, because both small and large parts were at all steps.
Interpretation:
- Damage to tissue and to armor is tracked the same way, but armor doesn't report if it is dented/partially fractured.
- Armor effectively insta-heals after each hit, whereas tissue keeps and accumulates damage.
- If the bolt can cut the armor, then the bolt cuts into the tissue underneath.
- If the bolt can't cut the armor, but can fracture it 100%, then the bolt cuts into the tissue underneath.
- If the bolt can't cut or fracture the armor, then a strain-related mechanism (which can occur during denting or partial fracture) may allow blunt damage to pass to tissue underneath.
- For a given velocity, bolts impact with a range of possible strains which appear to follow a pattern. The strains are just the bullet hole in the wall, we need to learn about the bullet (the strain is an effect, not a cause).
So what I did is give dwarves steel skin:
...
strain at fracture = IMPACT_STRAIN_AT_YIELD * IMPACT_FRACTURE / IMPACT_YIELD
i.e. 940 * 2520000 / 1505000 = 1573 (sometimes 1574)
This is amazing! Knowing the strains will definitely help with understanding what's going on.
Is it really correct that the strain at fracture does not depend on the contact area or the layer thickness? If so, then how are these things playing into armor protection, as they clearly do matter for armor? Do layer thickness and contact area enter into determining the strain?
On my side, because I've been busy, I was careless setting up my run, and accidentally left SHOOT_MAXVEL set to 48, so I don't have results for adamantine, but all other armors were fully penetrated by copper bolts before velocity 48, so it wasn't that bad. It appears for contact area=2 and uniform layer thickness of 20 there is no regime where bruising occurs at all for iron, copper, and bronze armor against copper bolts, but for steel only bruising occurs for all forces up to 48.
(http://i.imgur.com/bLHZ8.png)
I will have to run again with steel and adamantine to see what happens at higher forces for these. I will also run at larger contact area to see how that changes things.
Also, I'm not sure I understand your strain equation. If I use this, I get
armor | strain | force |
steel | 1574 | 42 |
iron | 638 | 25 |
bronze | 766 | 17 |
copper | 550 | 20 |
The "force" is the middle of the drop in my plot of deflection vs. shoot force, and strain is from strain at fracture = IMPACT_STRAIN_AT_YIELD * IMPACT_FRACTURE / IMPACT_YIELD. So looking at the strain, bronze should be better than iron, but based on deflection it appears to be worse than even copper. This is for deflection of copper bolts, not for iron bolts vs bronze (which we expect to be weird due to the shear yield/fracture mismatch). Maybe I messed something up because I'm tired, and maybe there's more screwiness in my data that I realize, or maybe I just don't understand your equation...
So what I did is give dwarves steel skin:
...
strain at fracture = IMPACT_STRAIN_AT_YIELD * IMPACT_FRACTURE / IMPACT_YIELD
i.e. 940 * 2520000 / 1505000 = 1573 (sometimes 1574)
This is amazing! Knowing the strains will definitely help with understanding what's going on.
Is it really correct that the strain at fracture does not depend on the contact area or the layer thickness? If so, then how are these things playing into armor protection, as they clearly do matter for armor? Do layer thickness and contact area enter into determining the strain?
...
Also, I'm not sure I understand your strain equation. If I use this, I get
armor | strain | force |
steel | 1574 | 42 |
iron | 638 | 25 |
bronze | 766 | 17 |
copper | 550 | 20 |
The "force" is the middle of the drop in my plot of deflection vs. shoot force, and strain is from strain at fracture = IMPACT_STRAIN_AT_YIELD * IMPACT_FRACTURE / IMPACT_YIELD. So looking at the strain, bronze should be better than iron, but based on deflection it appears to be worse than even copper. This is for deflection of copper bolts, not for iron bolts vs bronze (which we expect to be weird due to the shear yield/fracture mismatch). Maybe I messed something up because I'm tired, and maybe there's more screwiness in my data that I realize, or maybe I just don't understand your equation...
The strain is initially capped at the point where the material fractured, but it appears to creep upwards if the wound is repeatedly hit. The forces or energies or momentums that cause the strains are affected by contact size and layer thickness, but because of the round-to-100 thing then you don't notice the changes on dwarf-scale creatures. The skin thickness (but not armor thickness) is proportional to the cube root of the body part size, so the thickest skin on a dwarf is only 2-3x thicker than the thinnest skin.
Test results for copper bolts vs bronze skin at velocity 16 indicate that the damage falls into two categories:
a) The skin (armor in your case) is partially fractured 40%, 60%, or 80%. The strain in the armor is 766. No damage of any kind to underlying tissue. Some parts have fracture 41% or strain 767, but they were struck twice, so multiple hits each add 1 or more on top of the previous wound.
b) The skin (armor in your case) is completely fractured (100%), and the underlying soft tender bits are all cut up.
...
It appears for contact area=2 and uniform layer thickness of 20 there is no regime where bruising occurs at all for iron, copper, and bronze armor against copper bolts, but for steel only bruising occurs for all forces up to 48.
...
Yes, so bronze is worse than copper because it isn't being judged on strain. Only steel is good enough to meet the strain-or-whatever-induced-bruising criteria. If bronze didn't fracture so easily, you might see bruising because of the larger strain than iron.
So for steel, having IMPACT_STRAIN_AT_YIELD 1880 results in bruising immediately after yield (yield=metal skin denting). Having ISAY 940 (the default) means that bruising occurs just prior to the default IMPACT_FRACTURE (2520000). Having ISAY 470 means that no bruising occurs at the default IMPACT_FRACTURE (similar to bronze or adamantine), so you need to have a higher IMPACT_FRACTURE relative to IMPACT_YIELD before the bruising starts.
(http://i.imgur.com/t8IIw.png)
So how high does bronze's IMPACT_FRACTURE need to be raised before bruising appears, when copper bolts are shot at it? Then we can come up with an algorithm to predict that criteria.
I have run for several values of IMPACT_FRACTURE for both copper bolts vs. bronze armor and copper bolts vs iron armor, with all other params vanilla (including contact area=2). Here are plots of the forces required for 50% deflection as a function of IMPACT_FRACTURE:
(http://i.imgur.com/Ifgod.png)
(http://i.imgur.com/HFV8Z.png)
As you can see, deflection levels off abruptly at Force=69 for Bronze and Force=118 for iron. I think this is because deflection abruptly drops to zero at this force:
(http://i.imgur.com/ZrK7l.png)
This is for bronze. Notice that for IMPACT_FRACTURE x 3, the deflection starts to go down smoothly, and then drops sharply to zero, while bruising continues to go down smoothly. The cutoff in deflection may be the cutoff proportional to 1/IMPACT_STRAIN_AT_YIELD, but I am too tired to figure this out right now. Bruising does not experience any sharp cutoff in the region I explored, and appears to follow the curve that deflection would have followed were it not subject to this cutoff.
Edit: Using the equation momentum = 50,000 / IMPACT_STRAIN_AT_YIELD give momenta of 156.7 (force=117.01) for iron (IMPACT_STRAIN_AT_YIELD=319), and 91.4 (force=68.2) for bronze (IMPACT_STRAIN_AT_YIELD=547). This exactly agrees with the cutoffs I observe, so I think it is clear this is the same cutoff I observed before, and that 50,000 / IMPACT_STRAIN_AT_YIELD describes it accurately. I will eventually have to test if it deviations from this equation for large IMPACT_STRAIN_AT_YIELD (corresponding to small forces/momenta). Based on this equation, steel (IMPACT_STRAIN_AT_YIELD=940) should have this cutoff at mometum=51.2, or force=39.7 for copper bolts. Given that this is low, it explains why I see bruising for steel, and not for any other armor. I will have to check if the deflection drop actually does occur at 40 for copper vs. steel.
I am still not sure exactly what's going of for the relationship between deflection force/momentum and IMPACT_FRACTURE. As you can see, it's very linear, but both the offset and slope are not round numbers. Converting from force to momentum (muliply by copper bolt mass=1.3395) does not make the numbers and nicer. Using the old (nonuniform) "uniarmor", I found that IMPACT_YIELD plays at least some role in the offset, but not the slope, and IMPACT_STRAIN_AT_YIELD affects neither. Maybe it would be easier to study this behavior looking directly at the stains using DFHack and modded skin?
I will try some more analysis of my results this evening (maybe the relationship tracks on the upper or lower edge of the transition or something) and will also post the spreadsheet of my full results to DFFD. I also need to post a large backlog of results from the past few days, although some of those may be confusing/uninteresting as they use the non-uniform armor.
I'll start off by quoting myself:
...
See the plot below of strains in the steel skin at various velocities. The horizontal axis is the sample size, scaled to a sample size of 100. We see that bruising occurred 25% of the time at velocity 30, and denting the other 75% of the time, regardless of the body part hit. We see that fractures (only about a 5% fracture) occurred 23% of the time at velocity 45, and that is also regardless of the body part struck.
(http://i.imgur.com/ozdTd.png)
I'm not sure what to make of the stepped strains yet. It isn't related to contact or body part size, because both small and large parts were at all steps.
...
See in the image how the strain goes up with velocity in steps, and there are about 6-11 steps? Turns out each of those steps is linear with velocity, by itself. However the slope of the linear plot is different for each. The leftmost point (trailing edge) is represented by:
Strain = 76.1 * Velocity - 2350
and the rightmost point (leading edge) is represented by:
Strain = 94.1 * Velocity - 2350
with both results capped between 0 and "strain at fracture". The strain grows about 1.25x faster on the leading edge than on the trailing edge, so we expect to see sharp transitions at low velocity and gradual transitions at high velocity.
Now if we look at the distribution of "percent fractured" (i.e. %penetrated or crack length, 100% implies the tissue has been completely penetrated or destroyed) at a constant velocity, for iron bolts vs steel skin, with varying steel IMPACT_STRAIN_AT_YIELD:
(http://i.imgur.com/q0NUq.png)
We see that how badly your skin (armor) has been fractured doesn't depend on IMPACT_STRAIN_AT_YIELD. It also appears that the velocity-dependant stepping also applies to fracturing, so we expect to see sharp bruising-tearing transitions at low velocities and gradual bruising-tearing transitions at high velocities.
I then tried to find the exact values of IMPACT_STRAIN_AT_YIELD below which bruising stops for iron bolts vs steel skin:
Velocity Nobruising Bruising
35 1282 1283
40 1111 1112
48 925 926
55 806 807
60 735 736
This data can be represented by:
Strain = 48539 * (Velocity ^ -1.023)
OR perhaps by:
Strain = 1/(0.00002294 * Velocity - 0.00002035)
Access to the wound data has allowed me to figure out the "translation" for the different wound descriptions on tissue:
Shattering - the tissue has been 100% penetrated across 100% of the surface area of the body part, and the tissue material has IMPACT_STRAIN_AT_YIELD less than 25000.
Tearing apart - the tissue has been 100% penetrated across 100% of the surface area of the body part, and the tissue material has IMPACT_STRAIN_AT_YIELD greater than or equal to 25000.
Tearing - the tissue has some penetration, but it isn't complete or across the entire surface, and the tissue material has IMPACT_STRAIN_AT_YIELD greater than or equal to 25000.
Chipping - the tissue has been 100% penetrated across less than 25% of the surface area of the body part, and the tissue material has IMPACT_STRAIN_AT_YIELD less than 25000.
Fracturing - the tissue has some penetration, but it isn't complete or across the entire surface, and the tissue material has IMPACT_STRAIN_AT_YIELD less than 25000.
Denting - the tissue has not been penetrated, but it has more than 0 wound strain.
Bruising - the tissue has not been penetrated, and has no wound strain, but it is vascular (has blood vessels).
I haven't read your latest two posts in detail. The strain or fracture stepping happens even if you only look at one body part, and regardless of body part size. I'll probably reply later today.
...
This data appears to roughly fit momentum = 50,000/STRAIN_AT_YIELD. This strongly suggests that armor "bruising" is the same transition I find for the sharp cutoff in deflection at momentum = 50,000/STRAIN_AT_YIELD.
Edit: Is it correct that this transition goes from zero to 100% bruising, with no intermediate regime?
...
1. Note that it isn't the armor being bruised (in my cases the steel skin was being dented or fractured), but the fat/muscle beneath the armor.
2. Yes, either all bolt shots cause bruising beneath the armor (which if it hits the skull/brain leads to death) or all bolt shots don't cause any bruising.
...
What would happen if you made the target a more uniform creature than a dwarf, like maybe a sponge? Something with just one body part that could be hit. Would this remove/reduce the variation?
I have to try this myself sometime. I assume you are using the same lua script used to read out bolt velocities to get this information? Unfortunately this seems to crash my linux version of DF, so while I can see the report, I can only look at one shot per instance of DF before the game crashes.
...
3. Tested a giant sponge. It only has one body part and one material, yet I get stepped outputs for dent strains or penetration percentages.
4. Which version of DFHack are you using? I have dfhack-0.34.11-r2 and I got crashes as well when using dfhack-0.34.11-r1.
unk_10 is strain
unk_70 is % penetrated
unit=dfhack.gui.getSelectedUnit()
if unit==nil then
print ("No unit under cursor! Aborting with extreme prejudice.")
return
end
for k,v in pairs(unit.body.wounds) do
print("BDWD")
print(k)
print(v)
for kk,vv in pairs(v) do
print("UNIT_WOUND")
print(kk)
print(vv)
if kk=="parts" then
for kkk,vvv in pairs(vv) do
print("PARTS")
print(kkk)
print(vvv)
for kkkk,vvvv in pairs(vvv) do
print(kkkk)
print(vvvv)
if kkkk=="unk_14" then
print("VECTOR")
for kkkkk,vvvvv in pairs(vvvv) do
print(kkkkk)
print(vvvvv)
end
end
if kkkk=="unk_24" then
print("VECTOR")
for kkkkk,vvvvv in pairs(vvvv) do
print(kkkkk)
print(vvvvv)
end
end
if kkkk=="unk_34" then
print("VECTOR")
for kkkkk,vvvvv in pairs(vvvv) do
print(kkkkk)
print(vvvvv)
end
end
end
end
end
end
end
...
(http://i.imgur.com/ZrK7l.png)
This is for bronze. Notice that for IMPACT_FRACTURE x 3, the deflection starts to go down smoothly, and then drops sharply to zero, while bruising continues to go down smoothly. The cutoff in deflection may be the cutoff proportional to 1/IMPACT_STRAIN_AT_YIELD, but I am too tired to figure this out right now. Bruising does not experience any sharp cutoff in the region I explored, and appears to follow the curve that deflection would have followed were it not subject to this cutoff.
...
5. The pink and blue lines represent when the bronze armor has completely fractured, and the tissue underneath gets to be cut up by the bolt. Because "percent penetrated (a.k.a percent fractured)" comes in a variety of magnitudes for a given velocity (at several discrete steps), you get a smooth transition to tearing damage.
The yellow line represents the sharp transition to bruising damage. Remember that armor deflection is the absence of bruising, tearing, or chipping in the fat/muscle/organs/bones/etc. The armor (like a metal skin) is still being dented or fractured (it just doesn't output that combat text).
So default bronze armor fractures before bruising can happen, whereas default steel armor has bruising happen before the armor can fracture.
For other people who are following the thread: the way it is currently, if armor damage was tracked and armor could break, a single wood arrow from an elf could destroy a piece of adamantine armor by creating a gaping hole or shattering the entire armor. A wood arrow currently (in vanilla DF) can fracture adamantine armor and tear the flesh underneath, but the armor always acts as if undamaged:
The flying {mangrove arrow} strikes Dwarf 2 in the lower body, tearing the muscle and bruising the left kidney through the small adamantine breastplate!
This appears (I don't know why adamantine is different, perhaps my tests there need to be peer reviewed) to work at predicting the velocity required to completely fracture armor (or metal skin) of standard (low) thickness:
(http://i.imgur.com/6ORtF.png)
This function doesn't show contact area or thickness yet. I think Pirate Bob found earlier that the round-to-100 rule applies to the contact area and thickness scaling for this function. I used a fudge factor of 2 to make the results work in the case where contact area was larger.
"Completely fracture" means the velocity at which you see the smooth sigmoidal transition in deflection and appearance of tearing damage.
While this equation is definitely a start, it is does not fully describe the results from my last post for copper bolts vs. iron and bronze at varying IMPACT_FRACTURE. I found that for iron armor, momentum=IMPACT_FRACTURE/22436-12.453 and for bronze, momentum=IMPACT_FRACTURE/22294-15.426 (multiply the fits for forces by copper bolt mass=1.3395). While the coefficients of IMPACT_FRACTURE are close to 22500, the difference is significant. Also, the offsets are really not close to those predicted by IMPACT_YIELD/45000.
1) How do you define the location of the transition? I define it as the force/momentum where non-bruise wounds occur 50% of the time. Maybe you (and/or Toady) are actually defining it based on some other threshold?
2) Shouldn't your equation strain at fracture = IMPACT_STRAIN_AT_YIELD * IMPACT_FRACTURE / IMPACT_YIELD describe this same transition? (Edit - it appears that is actually something different, and the equivalent thing would be the momentum/strain needed for 100% fracture? Can you confirm this?) If so, then we should expect the momentum at fracture also be a function of IMPACT_STRAIN_AT_YIELD * IMPACT_FRACTURE / IMPACT_YIELD. It's possible that some factors (like 1/IMPACT_FRACTURE, for example) might cancel out, but it's also quite possible that the final equation becomes very complicated (which I think is likely given that simple linear fitting doesn't seem to quite work). Also, how sure are you of the accuracy of strain at fracture = IMPACT_STRAIN_AT_YIELD * IMPACT_FRACTURE / IMPACT_YIELD? Should I try to confirm this over a wide range of impact parameters?
3) Have you done anything more towards figuring out what determines the strain on the material? Assuming (2) is true, this would be extremely informative for figuring out armor protection. I could do this myself now that you got me to use the right version of DFHack, but it seems likely you've already been working on this. If I was going to do it, I would imagine setting SHOOT_FORCE such that the strain was about half of its maximum value, and then seeing how the strain changes when different parameters are varied. This has a huge advantage over deflection testing, as you get an exact numerical output of how the strain changed from a single hit(Edit - the result is not really "exact", as there is variation in the strain you get at a given bolt momentum - not clear if there is actually a great advantage over looking at deflection). In other words, if (2) is true and you don't plan to do this, let me know and I will try.
I really, really need to put up my full data for all materials at contact area 2 and 10. I'm sorry I didn't do this earlier, as it would have helped you a lot when working on the relationship between momentum for injury and impact parameters. There's just a lot of it and I'm not 100% sure the best way to represent it. I'll try for a spreadsheet of the raw data on DFFD if nothing else. If you could tell me what % serious wounds you are looking at for your equation that would be helpful, as then I could make a table of that. I am also running more simulations varying IMPACT_FRACTURE with IMPACT_YIELD set to zero right now, which hopefully should shed some light on the relationship between momentum required to cause injury and the impact parameters.
Edit:
I looked at the data for IMPACT_YIELD=0, and this data perfectly fits to momentum=IMPACT_FRACTURE/22500 for iron, bronze, and adamantine over the whole range from 1 to 6 times the vanilla IMPACT_FRACTURE. The fit is perfect in all cases to within the error of the measurements. This means that the offset and the corrections to the slope must be some function of IMPACT_YIELD, possibly multiplied with other factors (like IMPACT_STRAIN_AT_YIELD).
(http://i.imgur.com/FqtHR.png)
I have posted the complete results for this and varying IMPACT_FRACTURE at vanilla values of IMPACT_YIELD for iron an bronze on DFFD (http://dffd.wimbli.com/file.php?id=7128). And it is late, so I need to go to bed. Sorry, I will really try to post my older data soon :-[.
...
1. I wasn't that consistent on the % deflection. I trust the iron/copper on steel results a bit more than the copper on iron/bronze ones because the material properties for copper, iron, and bronze all overlap somewhat:
(http://i.imgur.com/quUEV.png)
Perhaps zinc bolts would produce better bronze armor results?
2. Nope, "strain at fracture = IMPACT_STRAIN_AT_YIELD * IMPACT_FRACTURE / IMPACT_YIELD" is a very hard result and you can see it for yourself using the wounds script. The strain for cut leg bones (i.e. use an adamantine sword to stab the leg) is 113, which is roughly equal to 100 * 130000 / 115000. The strain at fracture for shattered bones is 100 since the impact yield and fracture are identical there.
Also see what I posted earlier:
...
Now if we look at the distribution of "percent fractured" (i.e. %penetrated or crack length, 100% implies the tissue has been completely penetrated or destroyed) at a constant velocity, for iron bolts vs steel skin, with varying steel IMPACT_STRAIN_AT_YIELD:
(http://i.imgur.com/q0NUq.png)
We see that how badly your skin (armor) has been fractured doesn't depend on IMPACT_STRAIN_AT_YIELD. It also appears that the velocity-dependant stepping also applies to fracturing, so we expect to see sharp bruising-tearing transitions at low velocities and gradual bruising-tearing transitions at high velocities.
...
3. Perhaps instead of plotting deflection results (which can be misleading as there are at least two reasons why a bolt is no longer deflecting), plot the %bruising and %tearing. It'll start out near zero and then either bruising or tearing will suddenly increase as you increase velocity. We don't have to see the percentages for other types of injuries, as we are just looking for certain cutoffs.
If the momentum isn't high enough to initiate fracture, the resulting strain is randomly chosen from the stepped results, but overall appears to scale linearly with momentum (each step scales at a different rate, so the spread gets wider at higher velocities!). I don't think it's worth the effort right now to research in that direction.
It seems we updated at the same time. In response to 3, I have been plotting %nonserious injury, defined as either deflection or just bruising. Plotting bruising and tearing separately is somewhat confusing, as they don't go to 100% ever. Also, my search routine is designed to find a transition from 1 to zero, and it's easier to define the output such that it will look like that than to rewrite the search routine.
I just realized I didn't add labels to the columns in the spreadsheet on DFFD - I will try to do that tomorrow. The order isn't consistent between sheets within the file, so don't bother trying to figure it out...
Edit - I have updated the spreadsheet with column headings now, so it should be slightly less incomprehensible.
I also found that the sigmoidal transition from 100% to 0% nonserious hits seems to fit well to
% nonserious = 1-1/(1+exp(-(F-F0)/(F0/50))) for F<F0 and 1-1/(1+exp(-(F-F0)/(F0/25))) for F>F0.
This is a logisitic function, with different widths above and below the cutoff force. F0 is the force for 50% nonserious wounds. Note that the widths being F0/50 and F0/25 would also scale to M0/50 and M0/25 if this were converted to a plot vs momentum, as both the widths and value for 50% would be multiplied by the same factor (1.3395 in this case).
(http://i.imgur.com/9s83G.png)
The data shown are for copper bolts vs. the indicated armor material, with IMPACT_YIELD set to zero and IMPACT_FRACTURE multiplied by the indicated factor.
The true function used might be more of a gradual shift of the transition width, more along the lines of what Urist observes with %fratured and strain. I can squint and say I even see steps in the data, but it is not accurate enough to say for sure.
Edit #2:
Today I am running with IMPACT_FRACTURE held at the vanilla value and varying IMPACT_YIELD between zero and 1 times its vanilla value. Hopefully this should help explain what YIELD does. I'm hoping it will be easier to interpret this since we have clear results for what fracture does when YIELD=0.
On another note, I think maybe a good way to describe the two types of deflection would be:
1) The projectile absorbs the force of the blow. This would be the "ricochet" deflections that occur if IMPACT_YIELD of the projectile is too low.
2) The armor absorbs the force of the blow. This is what we are working on right now. This does not appear to be entirely elastic, as I first thought (as the armor can be dented or partially fractured and still "deflect" the blow), so that's really not a good description here either.
Finally, here are my results for force scans of all armor materials using Urist's new uniform armor and contact areas 2 and 10.
(http://i.imgur.com/5Bh4a.png)
(http://i.imgur.com/DYiEr.png)
I ran for both copper and iron bolts at contact area 10, and the results are identical when plotted vs. bolt momentum. Here is a table of the momentum for 50% of hits either deflected or causing only bruises.
Armor | Copper Contact Area=2 | Copper Contact Area=10 | Iron Contact Area=10 |
Adamantine | 109.839 | 222.357 | 223.725 |
Steel | 76.3515 | 156.7215 | 155.43 |
Iron | 36.1665 | 72.333 | 71.8275 |
Bronze | 22.7715 | 45.543 | 45.9225 |
Copper | 26.79 | 56.259 | |
It appears that Urist is correct, and the momentum required for 50% serious wounds is multipled by Contact Area*LAYER_SIZE rounded to hundreds (rounding up to 100, and rounding down for numbers above 100). In this scheme, Contact Area 2 rounds to 100, and contact area 10 rounds to 200. Correspondingly, the momenta for Contact Area 10 are exactly twice those for Contact Area 2. I will eventually have to confirm this by systematically varying Contact Area.
The equation we have so far is:
momentum = IMPACT_FRACTURE * round100(CONTACT_AREA*LAYER_SIZE)/(2250000-f1(IMPACT_YIELD)) - f2(IMPACT_YIELD).
The functions f1 and f2 are not yet clear, and may depend on more than just IMPACT_YIELD.
I also have some results for varying IMPACT_YIELD at constant IMPACT_FRACTURE which I will try to post later. Hopefully they will help clarify things further.
Update: Here is the full spreadsheet of these results on DFFD (http://dffd.wimbli.com/file.php?id=7131)
I then tried to find the exact values of IMPACT_STRAIN_AT_YIELD below which bruising stops for iron bolts vs steel skin:
Velocity Nobruising Bruising
35 1282 1283
40 1111 1112
48 925 926
55 806 807
60 735 736
This data can be represented by:
Strain = 48539 * (Velocity ^ -1.023)
OR perhaps by:
Strain = 1/(0.00002294 * Velocity - 0.00002035)
This data appears to roughly fit momentum = 50,000/STRAIN_AT_YIELD. This strongly suggests that ... is the same transition I find for the sharp cutoff in deflection at momentum = 50,000/STRAIN_AT_YIELD.
Edit: Is it correct that this transition goes from zero to 100% bruising, with no intermediate regime?
Also, I haven't had time to test yet, but at least with the old non-uniform armor 50,000/strain wasn't exact (especially at low velocity/high strain) so I wouldn't worry that there's a slight difference.
I tried to find the dependance of the above "bruising of stuff through the armor (or metal skin)" on IMPACT_YIELD.
(http://i.imgur.com/IpCGJ.png)
It does at least involve momentum rather than velocity, as I can change out the iron bolt at v=48 with a lead bolt at v=33. I also noticed regions where there was 50% bruising or something rather than a 0 to 100% transition when varying IMPACT_STRAIN_AT_YIELD and IMPACT_YIELD. The smooth transitions occurred between 893 & 910, as well as between 910 & 926. I couldn't detect any intermediate values between those numbers. The smooth transitions appeared to be the usual "stepped results" thing, where the larger strains or fracture percents coincided with the bruising.
There appears to be a sharp (or narrow smooth) transition between 878 & 893.
So sometimes the bolt has enough "something" that it needs an ISAY of under 893 to deflect rather than an ISAY of under 910, given an IMPACT_YIELD ~950000 and a momentum ~56.5.
First off, I added a link to the spreadsheet with my scan over all materials to my previous post.
I finished most of my scan of IMPACT_YIELD last night. Here are the results for Iron, Steel, and Adamantine
(http://i.imgur.com/W7LkI.png)
(http://i.imgur.com/5Xwv8.png)
I also plotted a zoom in of Iron by itself. A spreadsheet of results is also posted on DFFD (http://dffd.wimbli.com/file.php?id=7132). I have results for bronze which I will add later, but I doubt they will be very interesting. In all cases, the lines represent momentum=(IMPACT_FRACTURE-IMPACT_YIELD/2)/22500. This gives an excellent fit to the data everywhere. Once again, Urist has proven to be correct, as he proposed this equation several days ago based on very sparse data...
If we zoom in on iron, there are in fact systematic differences from this equation. I think that these result from the steps that Urist sees when looking at strain or %fracture, and agree that they likely have some dependence on IMPACT_STRAIN_AT_YIELD. If you look closely at mine and Urist's previous data from varying IMPACT_STRAIN_AT_YIELD, you will see that it does seem to cause some slight changes in the results, but no clear systematic change. We therefore both concluded that it doesn't do anything. I now suspect that it may influence the exact location of the steps, without changing the average shape of the overall curve. Probably the steps are another weird rounding thing. For example, the code might multiply a quantity by IMPACT_STRAIN_AT_YIELD, round the result, and then divide it by IMPACT_STRAIN_AT_YIELD, which would result in steps that move around as you change IMPACT_STRAIN_AT_YIELD, but no clear dependence on IMPACT_STRAIN_AT_YIELD.
In any case, I have convinced myself that momentum=(IMPACT_FRACTURE-IMPACT_YIELD/2)*(CONTACT_AREA*LAYER_SIZE)/2250000 captures the behavior sufficiently well. I need to verify that (CONTACT_AREA*LAYER_SIZE) multiplies both the YIELD and FRACTURE terms equally, and that this formula continues to hold for larger CONTACT_AREA. If someone else finds evidence that IMPACT_STRAIN_AT_YIELD is important, I am certainly open to further investigation, but my results so far indicate that it mainly determines the shift from deflection by armor to harmless bruising through armor, which is of minimal importance for determining armor effectiveness.
I am planning to move on to using our results to attempt to balance projectile performance against armor. In particular, I noticed that steel with CONTACT_AREA=2 and iron with CONTACT_AREA=10 are both penetrated at about momentum=75. To me that suggests an attractive set of parameters: Increase contact area to 10, and then set velocity so that bolt momentum~75. Then iron helms and breastplates (thickness=20), as well as overlaps, will deflect bolts sometimes, and other areas of iron armor will not deflect at all. Steel helms, breastplates, and overlaps will deflect 100% of the time, while other areas will deflect only part of the time. Adamantine will always deflect 100% of the time, and other armors will do nothing. I personally would prefer a system where all armors could have some finite chance of deflecting (think a hit at a grazing angle - you can skip a rock off water if the angle is low enough), this is not possible with the current mechanics. I suppose gameplay wise there is not a significant difference between zero deflections and 1% deflections anyway.
Regardless, my goal is not to figure out the "best" set projectile parameters to give "proper" performance. I plan to explore a variety of conditions and report the results, so that modders (and perhaps even developers) can make their own decisions about what parameters to use.
Edit - I realized I may be getting a little bit ahead of myself, as we still have to see how chainmail works. I strongly suspect that it just converts edged damage to blunt damage regardless of momentum so long as SHEAR_YIELD/FRACTURE is equal to or greater than the projectile's, but I need to verify this. This is definitely what happens at vanilla values. It is possible that chainmail may also deflect projectiles at lower momenta.
Edit #2- I updated my Summary (https://docs.google.com/document/d/1lytX4_1zwGqiiKcQ2Zsw-1YvPxz4vb1v5ECretSGUvM/edit) to reflect our latest results.
1. I will setup to do a full scan of bronze tonight. If you ever want me to send you my scripts, let me know. There's a bunch of stuff though, so unless you (or someone else) wants it I'll wait to package it up once I'm done modifying things all the time.
2. Thank you so much!! That macro is perfect, and I will have no trouble modifying it to run any parameters we might want to edit.
3. It is true that mouse input is a problem - I have verified that. Unfortunately, I think it's also a problem if any other process grabs attention, or if the computer just slows down, or whatever. I have frequent issues running on my (mouseless) linux laptop with the lid closed at night. I know that automatic updates can be an issue, but not sure what else. I think long DF macros just fail sometimes if they don't execute fast enough or something (maybe too many commands get sent at once?). Maybe I need to adjust the keypress repeat rate its using by adjusting MACRO_MS in data/init/init.txt? I will try that. I will also have my perl script look for failures, and repeat a given step of its search if it fails.
Edit: Here are some preliminary results for iron vs. bronze. So far they are so identical to copper vs. bronze that I had to use open symbols so that you could see both sets of data.
(http://i.imgur.com/kMTUo.png)
I have also a spreadsheet with the full data set on DFFD (http://dffd.wimbli.com/file.php?id=7140). I will try to run more to fill out this curve (only 3 out of the 5 points I ran actually worked :(), and then maybe also look at bronze bolts vs. iron armor.
What happened to these chain mail results? I tried a few tests and found that mail can be cut through by a material with higher SHEAR_* properties, but the mail doesn't fracture under impact. Mail does appear to let blunt attacks through with only some reduction in damage.
Hmm...sorry it seems I forgot to post those. I ran the simulations, and analyzed them, but the results never ended up here...
I modified Urist's uniarmor to convert it to chain mail:
[ITEM_ARMOR:ITEM_ARMOR_UNIPLATE]
[NAME:unimail:unimail]
[ARMORLEVEL:3]
[UBSTEP:1]
[LBSTEP:2] lower body now protected once
[SHAPED]
[LAYER:ARMOR]
[COVERAGE:100]
[LAYER_SIZE:20]
[LAYER_PERMIT:50]
[MATERIAL_SIZE:9]
[HARD]
[METAL]
[STRUCTURAL_ELASTICITY_CHAIN_ALL]
[ITEM_HELM:ITEM_HELM_UNIHELM]
[NAME:unichainhelm:unichainhelms]
[ARMORLEVEL:1]
[METAL_ARMOR_LEVELS]
[SHAPED]
[LAYER:ARMOR]
[COVERAGE:100]
[LAYER_SIZE:20] alter this to change "thickness"
[LAYER_PERMIT:20]
[MATERIAL_SIZE:2]
[HARD]
[METAL]
[BARRED]
[SCALED]
[LEATHER]
[SHAPED]
[STRUCTURAL_ELASTICITY_CHAIN_ALL]
[ITEM_SHOES:ITEM_SHOES_BOOTS_UNILOW]
[NAME:unichainboot:unichainboots]
[ARMORLEVEL:1]
[METAL_ARMOR_LEVELS]
[LAYER:OVER]
[COVERAGE:100]
[LAYER_SIZE:20] alter this to change "thickness"
[LAYER_PERMIT:15]
[MATERIAL_SIZE:1]
[METAL]
[LEATHER]
[HARD]
[STRUCTURAL_ELASTICITY_CHAIN_ALL]
[ITEM_GLOVES:ITEM_GLOVES_UNIGAUNTLETS]
[NAME:unichaingauntlet:unichaingauntlets]
[ARMORLEVEL:2]
[UPSTEP:1]
[SHAPED]
[LAYER:ARMOR]
[COVERAGE:100]
[LAYER_SIZE:20] alter this to change "thickness"
[LAYER_PERMIT:15]
[MATERIAL_SIZE:2]
[SCALED]
[BARRED]
[METAL]
[HARD]
[STRUCTURAL_ELASTICITY_CHAIN_ALL]
I then measured protection from copper bolts as a function of momentum (using targets with grand master armor user and shooters with great archer/marksdwarf). Here are the results with contact area 2:
(http://i.imgur.com/NnOHl.png)
and also with Contact Area 10
(http://i.imgur.com/CHWOl.png)
As you can see, all chainmail provides 100% protection at low bolt momentum, and then drops to 30% protection (corresponding to allowing only blunt damage through) at higher force. Here is a table summarizing the momentum needed for 65% armor penetration (the middle of the first drop)
Armor | Contact Area 2 | Contact Area 10 |
Adamantine | 58.938 | 128.592 |
Steel | 29.469 | 68.3145 |
Iron | 21.432 | 64.296 |
Bronze | 21.432 | 63.585 |
Copper | 20.0925 | 64.296 |
I also found that the conversion of damage to blunt does fail at crazy high momenta (something like 20000 for iron and 60000 for steel at contact area 2).
I can't even begin to propose any kind of relationship between the data and material properties. Iron, Bronze, and Copper all appear to be the same, steel is slightly better, and then adamantine protects up to roughly double the momentum stopped by steel. Also, it appears that the cutoff more than doubles when increasing contact area to 10, so that may not follow the same rounding procedure as before either. Also, the transition from 1 to 0.3 is much slower than for plate armor transitioning from 1 to zero.
For the very interested (perhaps Urist?) I also posted the full data set on DFFD (http://dffd.wimbli.com/file.php?id=7159).
Given that the behavior is kind of strange vs contact area, I think it might be worth testing what happens if dwarves are wearing 3 layers of 15 thickness mail (which is possible in-game). I'll put it on the list...
If Urist happens to be reading this, I am working on implementing his script, but I ran into snag with making it work with my automatic testing. I need a way to wait until the macro has finished placing all the dwarves before running the quality changing script. Ideally it would be nice if there was a way to make a DFHack lua script loop until the number of dwarves reaches a given number, and then continue. Barring this, I could have it pipe the number of dwarves back to perl, and have perl to the wait loop. If neither will work, then I guess I am stuck just waiting a fixed amount of time and assuming that all dwarves will be placed. If I do this, I will definitely need my analysis of gamelog.txt to check and make sure bolts fired are the desired quality.
Edit - it appears make lua sleep is not OS portable, but is easy on linux (for me). Now I just have to count dorfs, which I think I can figure out...
Edit #2 - it's somewhat embarrassing how long it took me to figure out that "#" gives you the number of elements in a table in Lua. So it appears that #df.global.world.units.all should do the trick.
Edit #3 - it seems my mucking around with lua was kind of a waste of time, as I have no good way to start the macro and then send a command to DFHack without shifting focus away from Dwarf Fortress, which of course hangs the macro (and apparently also DFHack and dwarf fortress in a particularly nasty way if I then run the lua checking script). Oh well, I'll just wait a set time :(.
I finally got Urist's script working with my automatic testing by just having it wait 1 minute after starting the macro which places dwarves, then running the quality modification script, and then unpausing dwarf fortress. It seems to have worked without issues.
Here are the results for masterwork copper bolts against standard armor with unskilled dwarves:
(http://i.imgur.com/TP2DV.png)
There are absolutely no differences between masterwork bolts and basic bolts. I believe the wiki claims that masterwork bolts do not influence hit probability either (only crossbow quality matters?) which would mean there is no advantage to using high quality bolts (and actually a disadvantage due to unhappiness when they are lost). It is probably worth checking if bolt quality influences other things besides armor penetration eventually, but not now.
I also ran the same test with basic bolts and masterwork armor:
(http://i.imgur.com/HoLTV.png)
The armor does give a modest increase to protection levels. It appears that the force for 100% protection does not change, but the width of the drop from 100% to zero increases. I'll probably add a table of these results later, but I need to go now. Here is a spreadsheet of all results on DFFD (http://dffd.wimbli.com/submit.php?action=message&fid=7162).
Here are the results of 3 layers of LAYER_SIZE:15 chain mail worn by grand master armor users against copper bolts fired by great archer/marksdwarves:
(http://i.imgur.com/7C6Gw.png)
I did adjust LAYER_PERMIT and remove SHAPED, and made sure that dwarves really were wearing all three layers of mail. I also updated my DFFD (http://dffd.wimbli.com/file.php?id=7159) spreadsheet for chainmail to add in the new results.
There is not that much difference from a single layer of LAYER_SIZE:20 chain mail. 3 layers of adamantine offers slightly less protection, and steel slightly more. I don't have any idea why this might be, but the bottom line is that at bolt momentum above 70 all mails except adamantine offer about 30% protection (covert all edged to blunt).
I am not sure I understand all that Urist is saying about LAYER_SIZE not increasing protection as expected. I can say for sure that increasing contact area for LAYER_SIZE:20 increases the bolt momentum by round(LAYER_SIZE*CONTACT_AREA) to the nearest 100. I guess I will run with LAYER_SIZE:10 with contact area 15 and 20. Contact area 15 should give the same result at my previous run for LAYER_SIZE:20, contact area 2 while contact area 20 should give the same result as LAYER_SIZE:20, contact area 10.
I misunderstood what Urist was talking about in his last couple of posts, so I ran some more tests with LAYER_SIZE=10 plate armor and contact areas 15 and 20. I confirmed that contact area 15
(http://i.imgur.com/uCzWG.png)
(marked L10) gives exactly the same result as LAYER_SIZE=20 and contact area 2, as expected (in both cases LAYER_SIZE*contact area rounds to 100). LAYER_SIZE=10 and contact area 20 also gives the same result as LAYER_SIZE=20 contact area 10 (both round to 200).
(http://i.imgur.com/RlZZ1.png)
Kind of a waste of time, but it definitely confirms that layer size and contact area behave as we believed.
Hi, I first just want to say that this is fantastic stuff, I've just come back to DF after a two-year hiatus and I've just eaten up this whole thread. Really great.
Have you guys tried varying with Dodger skill somebody mentioned this earlier on but I've seen no follow-up)? I did a bunch of not-nearly-so-quantitative tests back in the day in the arena and found it to be the single most important variable in fighting quality and wounds. Even a naked Grandmaster Dodger, fighting against an unskilled or poorly-skilled dwarf (or a number of them), could be almost guaranteed to receive only 'tearing/brusing the skin or fat' results so long as he was conscious, un-stunned and not being attacked from behind, never mind the weapon or weapon material, and that includes bolts.
I've just now run a GM Dodger, naked, weaponless, vs. 4 unskilled marksdwarves: after a great number of misses, and some 70 bolts fired, they finally got him with a 'tearing the fat' (after a number of 'tearing the skin' results), and then on page 13 took him out with a shot from behind to the spine. Anecdotal, I know, but I've seen just this umpteen times. Surely this is relevant for your armour calculations?
While this is definitely worthy of investigation, it is slightly outside the scope of what we are working on right now, which is focusing on what happens when a bolt actually hits an armored target. I believe Zivilin tested dodging in another thread, but I'm not sure. If he didn't already do it, I will add it to the long list of things I want to look at when I finish with this...
...
I believe Zivilin tested dodging in another thread, but I'm not sure. If he didn't already do it, I will add it to the long list of things I want to look at when I finish with this...
Sort of, see here:
http://www.bay12forums.com/smf/index.php?topic=117284.0
EDIT: Let's use this existing wiki page to write up the results:
http://dwarffortresswiki.org/index.php/DF2012:Material
It makes a few guesses as to how things work, but we understand some of the mechanics better now.
For example, we know real-world properties are used, but not real-world physics.
The existing page will have to move off-topic slightly as some of the properties are of weapons or armor, not materials, but I don't see the point in fragmenting the analysis among multiple pages.
EDIT2: Here's a flowchart image for tldr folks:
(http://i.imgur.com/YtG4c.jpg)
OK, updated flowchart:
(http://i.imgur.com/5E0FR.jpg)
http://www.graphviz.org/ is nice because you don't have to mess around with drawing shapes and arrows, you just have to feed instructions to the image generator.
I've finished my testing of copper bolts vs. standard dwarf fortress armor (breastplate, helm, greaves, 2 gauntlets, and two low boots, with and without 2 chain mail shirts). The statistics aren't great, as I only ran with 72 dwarves at each force point. I more wanted to get a general shape for all curves rather than exact numbers, and I will do larger runs at a few points of interest. Furthermore, I found that, once dwarves have fallen over, there is a significantly larger chance that armor will be penetrated. I therefore only included on each dwarf before it had first fallen over, but this further reduced my sample size. I therefore expect errors of up to 10% (which is most noticeable in the values for iron armor at momentum >100, which can fluctuate between 0 and 10%. It is not clear that these differences are significant for iron armor at high momentum.)
EDIT: THIS IS ALL WITH CONACT_AREA=10. Sorry I forgot to mention that initially. Contact area=2 (standard) produces much less interesting results as all plate armor effectively has the same thickness (as contact_area * layer_size gets rounded up to 100).
Armor User 0, Armor Quality 0, no chain mail
(http://i.imgur.com/ynb6y.png)
Armor User 15 (grand master), Armor Quality 0, no chain mail
(http://i.imgur.com/5JNnQ.png)
Armor User 0, Armor Quality 0, 2 chain mail shirts
(http://i.imgur.com/jq3fM.png)
Armor User 15 (grand master), Armor Quality 0, 2 chain mail shirts
(http://i.imgur.com/Z51vo.png)
Armor User 15 (grand master), Armor Quality 5 (masterwork), 2 chain mail shirts
(http://i.imgur.com/qkdzy.png)
Here is a spreadsheet with all the raw data on DFFD (http://dffd.wimbli.com/file.php?id=7187).
Now for the (for me) exciting part. If you look at momentum between 70-75, you will see that all armors provide some level of protection, with <10% protection for bronze/copper, ~20-40% protection for iron, 80-90% protection for steel, and >90% protection for adamantine. This seems like a decently realistic result, but I am no expert on medieval armor. In any case, it should hopefully be easy enough for anyone to look over these curves and pick a bolt momentum which gives the level of armor protection they think is most appropriate.
In game, there is still the issue that bolt masses get rounded when determining bolt velocites, which results in silver bolts having significantly higher momenta than iron/steel ones for the same crossbow parameters. I think I may have a (slightly messy) fix for this as well. Create duplicates of all bolt materials, but change their density to 600 (equal to wood, but you can use whatever you like so long as they're the same). Then remove [ITEM_AMMO] from all standard materials, and give the bolt materials [ITEM_AMMO] and no other item tags. Then you also need to remove whatever tag makes the material show up as ore that can be mined (not sure about this - will add when I figure it out) and add reactions to create bolts out of each bolt material from each corresponding normal material (which I was told is possible, but haven't tried). Have to go now - will update if and when I get this to work.
Did you take into account skilled weapon uses who can swat bolts out of the air?
I had a miner who was being chased by a squad of goblin archers who deflected 100% of the arrows with his pick.
I've also had small groups of 3 legendary fighters wade into 1 or 2 groups of goblin archers (Sometimes with an elite goblin archer) and just decimate both groups with no injuries at all. Combat logs showed the shield and or weapon deflections to be absolute. Crossbows are meant to be point and click. It makes sense that an archer might have an advantage over someone of equal skill. or even slightly greater skill.
But a truly skilled warrior can survive closing and then obliterate them.
(http://i.imgur.com/4Zeah.jpg)
Skill will always overcome lack of skill. That's the point of shields, and training up your soldiers. Also why danger rooms are so popular, and so effective.
Skill can and should be overcome with numbers. You can only swat so many bolts...
See: Pincushion