Icebreaker analysis circa Cyber Exodus

Feb 06, 2013 22:20


I got interested in a new programming language (Haskell, if you are interested) just about the time that Android: Netrunner came out. Given that I knew a fair bit about the efficacy of the various types of Program - Icebreaker in the original game, I was keen to see what the new set of breakers was like against the existing crop of Ice that could be found. Combining the two interests suggested writing a function that could calculate the cost of an breaker being used on a piece of Ice, and then applying that to all the relevant breakers in the same class.

By making it a program, I could simply extend the data as new expansion packs came out, and relatively easily compare the varying costs to break Ice across all the breakers. New Ice in the expansion packs gets added to the Ice data, so that when calculating the average cost to break with new breakers, it also stays up to date against all the Ice that the breakers might contest.

The various new types of breakers in A:NR present some difficulties to performing such simplistic analysis. One of the most striking issues is how to model the Core set Shaper breakers: Pipeline, Battering Ram and Gordian Blade. Given that they keep their Strength increments for the entirety of the run, using these can be more efficient against servers that contain more than one instance of a type of Ice. While problematic for modelling an entire run against a known server, in a case-by-case analysis of individual breakers vs. individual Ice we can ignore this. Some Anarch breakers, such as Mimic, Yog.0 and Morning Star are unable to break specific pieces of Ice unaided. The program that calculates the break costs for such breakers vs higher strength Ice returns a null value. Their fixed strength, in the case-by-case analysis needs to be accounted for.

In all the following analyses, the result is an ordered list of the breakers that can be employed against the Ice which fits that class (i.e. Fracters versus Barriers, Decoders vs. Code Gates and Killers vs. Sentries). I include Crypsis in all classes of Icebreaker, but exclude Wyrm from the analysis. This is just a one-on-one analysis, Icebreaker vs. Ice, where the cost to break the Ice is calculated by the program; if the Icebreaker in question is unable to break the Ice, I set the break cost to 100, so that a null value doesn’t mess with the averaging and make something look like it breaks cheaper when it can’t break at all. As it it is just a 1:1 analysis, I set Crypsis to cost an additional credit in the calculations, as the “cost” of the action pre-factored to avoid losing the breaker after the encounter.

In each of the three subtypes of breaker, I first provide average costs for the pure breakers without any enhancement. The second set of results is a comparison of the average costs when the examined breakers are all considered to be one Strength higher (or equivalently what would happen if the Runner has an Icecarver in play). The third set of results is the same class enhanced once more, say, all with The Personal Touch applied twice. Naturally there are a suite of game effects that could achieve the same result, but this homogenised approach will do to characterise them all.

Results are “current” up to the available spoilers from Cyber Exodus and A Study in Static, presuming that Creeper (spoiled in a card fan image in this News post) is in either of those expansion packs. Chimera is included in the analysis, and is treated as a distinct piece of Ice: ChimeraA is a Sentry, ChimeraB is a Barrier, and ChimeraC is, of course, a Code Gate. Woodcutter is in the mix as well, but as it is modelled as having no subroutines, it does not significantly impact the calculations relative to the costing of the individual breakers. Both Bullfrog and Hourglass (spoiled here) are also included as there is sufficient data to add them to the analysis.

First let’s look at the Fracter breakers vs Barrier Ice:

> sortBy (compare `on` (snd)) $ zip barrierBreakers (mapAcross2 (map averagecost barrierBreakers) barrierIce)

[("Battering Ram",3.857142857142857),
("Corroder",3.857142857142857),
("Snowball",4.571428571428571),
("Aurora",5.714285714285714),
("Crypsis",6.428571428571429),
("Morning Star",29.285714285714285)]

Battering Ram, despite being a memory hog and costly to raise is probably present here at the beginning due to the number of low strength walls; and is on par with Corroder, coming first only alphabetically. Aurora is surprisingly worse than I would have thought with an average of 6.0. Crypsis is worse for walls though. Morning Star fails on several key pieces of Ice that do see play - Heimdall 1.0 and Hadrian’s Wall - but you might just choose to spend actions and use the E3 Feedback Bioroidcrusher instead of Crypsis. Hadrian’s will stomp you unless you’ve got a few Datasucker virus counters spare, though.

> sortBy (compare `on` (snd)) $ zip barrierBreakers (mapAcross2 (map averagecost barrierBreakers1) barrierIce)

[("Corroder",3.142857142857143),
("Battering Ram",3.2857142857142856),
("Snowball",3.857142857142857),
("Aurora",5.142857142857143),
("Crypsis",5.571428571428571),
("Morning Star",15.142857142857142)]

Corroder sneaks ahead on average here, and Snowball catches up with where Battering Ram and Corroder were before a +1 strength buff. Otherwise static, though everything gets a little cheaper on average.

> sortBy (compare `on` (snd)) $ zip barrierBreakers (mapAcross2 (map averagecost barrierBreakers2) barrierIce)

[("Morning Star",1.0),
("Corroder",2.5714285714285716),
("Battering Ram",2.7142857142857144),
("Snowball",3.142857142857143),
("Aurora",4.571428571428571),
("Crypsis",4.857142857142857)]

Look at me now, Ma! Morning Star steps to the fore and makes mincemeat of every wall in the game for a measly one credit! Everything else remains in the same ranking as before. Mind you for an eight credit install plus two two-credit upgrades (for a massive twelve credit investment!), the Morning Star++ is sad to see Hadrian’s Wall with a single advancement counter on it. Currently, the average rez cost of Barriers, for interest, is ≈4.86 credits, with an average strength of ≈3.86.

Now let’s consider the Decoders vs Code Gate Ice:

> sortBy (compare `on` (snd)) $ zip codegateBreakers (mapAcross2 (map averagecost codegateBreakers) codegateIce)

[("ZU.13 Key Master",4.666666666666667),
("Peacock",5.0),
("Gordian Blade",5.777777777777778),
("Crypsis",6.555555555555555),
("Yog.0",66.66666666666667)]

Right out f the blocks, ZU.13 Key Master (I agree with the FFG forum poster, they now must make a piece of Ice: G0.Z3R Gate Keeper) is better in any 1-on-1 comparison against all the other Decoders. On average it costs half a credit less than the nearest competitor, in Peacock, which is surprisingly not as bad as I thought it might be at first glance. We shall not mention Yog.0 further.

> sortBy (compare `on` (snd)) $ zip codegateBreakers (mapAcross2 (map averagecost codegateBreakers1) codegateIce)

[("ZU.13 Key Master",3.7777777777777777),
("Gordian Blade",4.222222222222222),
("Peacock",4.777777777777778),
("Crypsis",5.666666666666667),
("Yog.0",33.333333333333336)]

Put one Personal Touch into the mix, and the mid-field switches around a little, with Gordian Blade approaching it’s pre-WLA status as best Decoder. Key Master is still the master, but the difference narrows between the two Shaper Decoders to only a half credit.

> sortBy (compare `on` (snd)) $ zip codegateBreakers (mapAcross2 (map averagecost codegateBreakers2) codegateIce)

[("Gordian Blade",2.888888888888889),
("ZU.13 Key Master",3.0),
("Peacock",3.888888888888889),
("Crypsis",4.777777777777778),
("Yog.0",11.444444444444445)]

GB overcomes the ZU.13 by a whisker, finally offsetting the higher raise cost against several mid-high strength Code Gates. Crypsis fails to close the gap on Peacock, and the AI - Virus remains a bad choice compared to the Criminal Icebreaker -Decoder. No change in the order though. I’m pleased to note, though, that the average rez cost for Code Gates remains lowest of all the classes of Ice, at ≈3.67 credits, for an average strength of ≈3.78

Finally, there are the Killer breakers vs. Sentry Ice:

> sortBy (compare `on` (snd)) $ zip sentryBreakers (mapAcross2 (map averagecost sentryBreakers) sentryIce)

[("Ninja",4.357142857142857),
("Femme Fatale",4.928571428571429),
("Creeper",5.142857142857143),
("Crypsis",5.642857142857143),
("Pipeline",6.214285714285714),
("Mimic",43.57142857142857)]

Creeper surprises me somewhat by being slightly more effective than Crypsis when “naked”. Ninja is well ahead of the rest of the pack, itself perhaps a surprising thing given that Ninja is a direct reprint of Matador from the Netrunner Classic expansion. Pipeline is appallingly expensive, and when I get around to modelling multiple-Ice run simulations I hope to see something justifying its existence.

> sortBy (compare `on` (snd)) $ zip sentryBreakers (mapAcross2 (map averagecost sentryBreakers1) sentryIce)

[("Femme Fatale",3.642857142857143),
("Ninja",3.9285714285714284),
("Creeper",4.5),
("Pipeline",4.928571428571429),
("Crypsis",4.928571428571429),
("Mimic",22.5)]

Not even application of the Personal Touch helps Pipeline. The lesson, kids, is don’t use it. Mind you this is the biggest shake up of the order in any subtype, with Femme Fatale overtaking Ninja as the most efficient (on average) Killer, and Pipeline stepping past Crypsis. Creeper maintains the third spot.

> sortBy (compare `on` (snd)) $ zip sentryBreakers (mapAcross2 (map averagecost sentryBreakers2) sentryIce)

[("Femme Fatale",2.7857142857142856),
("Pipeline",3.642857142857143),
("Ninja",3.9285714285714284),
("Creeper",4.071428571428571),
("Crypsis",4.285714285714286),
("Mimic",15.5)]

Two Personal Touches makes the Pipeline happier (and I am certain there’s a double-entendre there but I’m not touching that) 1. It remains worse than the wicked Femme, but overtakes both Ninja and Creeper.

One of the first things that I learned in undertaking this little exercise is the benefit of interpreting the data instead of just presenting it. I did note some odd values coming out which led to discovering a subtle bug in my code that arose in only a few corner cases. I need to strengthen my test cases a bit more to handle such instances, I suspect.

Some of the other things that we might take from this perhaps might bed a few myths in a touch of reality. I have seen claims for Crypsis being “second best” in each subtype of Icebreaker. More precisely, the claim is that in many cases Crypsis is only one credit more expensive than the best dedicated Icebreaker and frequently better than the remaining “non-best” Killers, Fracters or Decoders. Clearly my choice to (albeit crudely) model the additional action to load Crypsis as an extra credit (i.e. one not gained in the loading action) influences the outcome, even without factoring in The Personal Touch or other mechanisms for raising breaker strength or lowering Ice strength. In fact, when one considers this extra (hidden) cost of Crypsis it ends up being the worst or second worst breaker in every class.

Another broad observation that can be made is that while base strength on a breaker is the key factor; the raise cost is also a massive influencer in determining the average cost; the difference in efficiency between 2-to-raise vs. 1-to-raise is quite evident in the numbers. When the 2-to-raise breakers are given the extra boost of a point of strength or two, they tend to become more efficient on average than the 1-to-raise breakers. In other words, the less you need to boost the strength of these breakers, the better they become on average.

Note that Ninja’s average break cost is unaffected by the addition of a second strength buff; in other words, within this range (+0, +1, +2), Ninja with an Ice Carver is as good as it gets. A third buff will assist by dropping the average down to ≈3.07 credits, but this is now a very expansive investment in time, card,etc. Peacock continues to improve marginally if you add a third buff, down to ≈3.44 credits, as does Aurora, down to ≈4.29 credits.

Finally note that the average rez cost for sentries is ≈4.07 for and average strength of only ≈3.07. Have fun with all that!
[1] Which is just what she said

android, lcg, netrunner

Previous post Next post
Up