I played my first game against the Earthbreaker colossal warjack. This awesome re-purposed mining vehicle fires subterranean missiles that tunnel under key pieces and blast apart the earth itself (knocking targets down on a hit).

Ghordson Earthbreaker by Hai-pe-neki

My warcaster was Kommander Sorscha. This powerful magic user appears wreathed in snowstorms, making her hard to hit (high DEF). Models that are knocked down become easy to hit. This would be bad for Sorscha.

Early in the game the Earthbreaker shot a model standing next to Sorscha and killed her with ease. Oh silly me I thought. Lessons learned hopefully. Yet how likely was this assassination? Let’s use **WMTools** to find out.

require(WMTools)

Functions in **WMTools** expect warjacks to be represented as a list. A list is a one dimensional object where each element is another object, such as a numeric vector or another list.

> x <- list("a" = 1, "b" = c(1, 2, 3), "c" = list("c2" = c(3, 4))) > x $a [1] 1 $b [1] 1 2 3 $c $c$c2 [1] 3 4

So we can represent the Earthbreaker as a list of lists that describe the giant stompy robot’s stats. The numbers have been redacted with zeros to protect Privateer Press’ intellectual property. To reproduce the analysis below, simply replace these zeros with the correct numbers.

> earthbreaker <- list(stats = c(SPD = 0, MAT = 0, RAT = 0, DEF = 0, ARM = 0, BASE = 120), + range = list('torpedo' = list(stats = c(RNG = 0, ROF = 0, AOE = 0, POW = 0), + special = c("left", "driller", "ammo type:quake")), + 'torpedo' = list(stats = c(RNG = 0, ROF = 0, AOE = 0, POW = 0), + special = c("right", "driller", "ammo type:quake")), + 'repeating cannon' = list(stats = c(RNG = 0, ROF = 0, AOE = NA, POW = 0), + special = c("left", "rapid fire")), + 'repeating cannon' = list(stats = c(RNG = 0, ROF = 0, AOE = NA, POW = 0), + special = c("right", "rapid file"))), + melee = list('fist' = list(stats = c(RNG = 2, PAS = 0), + special = c("left", "open")), + 'fist' = list(stats = c(RNG = 2, PAS = 0), + special = c("right", "open"))), + special = character(0))

Although there is a mathematically calculable probability distribution for these attacks, a much simpler approach is simulation. So first off, I roll lots of dice. Then I add any other effects that were in play to the warjack and the target. In this instance, I need to account for Thor, a dwarf engineer, causing all hit rolls to be boosted. Sorscha was affected by Fog of War and Wind Rush, so had an intimidating DEF. In addition, she was overboosting her armour with 3 focus.

> NN <- 1e4 > # roll some dice > dce <- matrix(sample(1:6, size = 50 * NN, replace = TRUE), nrow = NN) > dmg <- numeric(NN) > eb <- earthbreaker > # Thor tunes up to hit > for (sp in seq_along(eb$range)) { + eb$range[[sp]]$special <- c(eb$range[[sp]]$special, "free boost hit") + } > # shoot Sorscha NN times :-( > for (i in seq_along(dmg)) { + dmg[i] <- activation(warjack = eb, + target = list(stats = c(DEF = 16 + 2 + 2, ARM = 14 + 3, BASE = 30)), + strategy = "assault", boost_hit = FALSE, boost_damage = TRUE, + foc = 3, kd = FALSE, dist = 14, + dice = dce[i, ]) + } > # summarize damage > quantile(dmg) 0% 25% 50% 75% 100% 0 15 22 27 48 > 100 - which(quantile(dmg, probs = seq_len(1000)/1000) >= 17)[1] / 10 28.1% 71.9 > plot(density(dmg))

Getting Sorscha knocked down is key. Sorscha is somewhat difficult to hit, but happens 16% of the time with boosted attack rolls. So by firing multiple torpedoes, the Earthbreaker is going to cause sufficient damage to kill her 72% of the time. My opponent actually fired the initial torpedo at a nearby Nyss, which was only DEF 17, but this did not significantly effect the probability of assassination. Ordering Thor to tune up damage roll instead of hit roll also did not have a significant effect, probability of assassination (71%). Losing Thor is somewhat irritating for the Mercenary player, dropping the chance of assassination to 39%.

So clearly standing anywhere on the board is a bad idea when the Earthbreaker is on the rampage.