Blocking might be the single most important action in Blood Bowl. But let’s explain a bit to the unfamiliar reader what this is all about.
Blood Bowl, as you would learn on Wikipedia, is a game loosely related with american football. Two competing teams try to bring a ball to the other’s team touchdown zone. The game is composed of two half-times of 8 turns each (I’ll not go into time-over). What makes the game memorable, and sometimes quite frustrating is the concept of turnover. Almost every time you fail an action, you’ll get a turnover, meaning your turn will end and your opponent will play. Thus, if you are unlucky your first action could lead to a turnover, and you will not do anything during your round.
This leads many people to believe this is mostly a game of luck. While it is true that luck is part of the game, it is no substitute for careful planning and statistical thinking.
A player can perform a limited set of actions each turn. One of these is blocking, and it is all about trying to put an opponent down, hopefully maiming him in the process. It can only happen if the player has not moved yet during this turn and is in contact with an opponent. Once declared, blocking must be resolved in the following way :
- Both players strengths are evaluated by taking their base strength and applying modifiers based on nearby teammates and various skills.
- The resulting strengths are compared to determine the quantity of block dices and the player choosing the outcome.
- Some players could be brought down after this. For all concerned players, armor rolls are made, then wound rolls if the armor fails. Again, many skills are involved in these situations.
My prototype can now compute the probability of all block outcomes, from the block dice result to the injury roll. It turned out to be rather inelegant, but not as horrible as C code I previously wrote, and much more concise. I however doubt it is readable. It works by building a tree of all possible outcomes and their respective probability, and then collapsing the tree and computing the resulting probabilities.
For example, here is the tree of a troll blocking a human lineman, and the resulting probabilities. You can see it gets quite complicated, as the troll is stupid (this is the first division, there is a 50% probability that the troll just does nothing) and has mighty blow. Mighty blow works by reducing the armor of the opponent by one if your roll was just missed, and increasing your injury roll by one if you did not use the skill for the armor roll. As no players have block, you also have all possible outcomes of either players being down and/or injured.
I squashed quite a few bugs in the calculation process, and I am sure some more are there. But this is way too tedious to verify the correctness of the results, so please let me know if there is a glaring error. Next time I will try to resolve such questions as “mighty blow or claw”, armed with statistics.