roll argument of get.optimal.armor.combos() is now movement, and
its values "Fast", "Mid", "Fat" and "None" are now "Light",
"Mid", "Fat" and "Poop". Each still names the heaviest movement
allowed; "Poop" (over 100% equip load, where the character can't roll and
walks slowly) means no load limit. Calls using roll = now fail with
"unused argument".SCORE_QUALITY is now an exact count among every combination at the
selected upgrade levels, rather than a normal approximation, so its values
change; the score itself is unchanged.SCORE_RAW is renamed SCORE.weights no longer has a default and must be given.get.all.armor.combos(), WEIGHT is now ARMOR_WEIGHT, added up in
32-bit floating point as the game does, and POISE is now ARMOR_POISE,
matching get.optimal.armor.combos().head.data.fullupgrade, chest.data.fullupgrade,
hands.data.fullupgrade and legs.data.fullupgrade datasets are removed.unarmored.weight is replaced by weapons: the weapons in the four weapon
slots, by name. The movement type is now checked exactly as the game checks
it: equip load and weights in 32-bit floating point, with the weapons and
then the armor added in the game's slot order. A combination sitting
exactly on a movement line on paper can fall on either side of it, as it
does in-game. EQUIP_LOAD, ARMOR_WEIGHT and TOTAL_WEIGHT are the exact
32-bit values.get.armor.tradeoffs() finds the best value of one stat (the score, Poise,
or one defense or resistance) at each armor-weight limit, with the same
settings as get.optimal.armor.combos(). weight.step, min.armor.weight
and max.armor.weight set which limits are computed (every 0.1 by
default). Among combinations
tied on the stat, the best-scoring one is returned.get.tradeoff.efficiency() describes a trade-off curve as jumps (single
steps that gain far more than the weight around them), flats (no gain),
lines (each compared with the curve's average rate) and the boundary points
between them, to show where extra weight pays off. jumps and flats
("few", "some" or "many") set how sensitively each is identified.minima and weights accept named vectors in any order, e.g.
minima = c(POISE = 30) or weights = c(PHYS_DEF = 2, MAG_DEF = 1); stats
left out are 0. Unnamed vectors work as before.weapon.data: every weapon, shield, bow and catalyst, with its weight.stat.scale sets what one unit of each stat counts as before it is
weighted: its standard deviation across every armor combination ("sd",
the default, as before), its highest value across every armor combination
("max"), or one unit with no adjustment ("raw").weights.mode = "grouped" takes one weight per group of stats
(PHYSICAL_DEFENSES, ELEMENTAL_DEFENSES and RESISTANCES), each group
counting as the average of its stats.max.table.size cutoff; previously the order was arbitrary.library(darksoulsarmor) no longer loads the Shiny packages; they load when
armor.application() runs.Initial release.
get.optimal.armor.combos() searches every valid head/chest/hands/legs
combination and returns the top-scoring ones subject to equip load, area
availability, and per-stat minimum constraints. Scores are built from ten
standardized stats (physical/strike/slash/thrust/magic/fire/lightning
defense, and bleed/poison/curse resistance) weighted by the weights
argument - see the "scoring" vignette for the full derivation
(vignette("scoring") if installed with build_vignettes = TRUE, or
vignettes/scoring.Rmd directly otherwise).get.all.armor.combos() returns every valid combination unscored, for
users who want to do their own analysis.armor.application() launches an interactive Shiny app built on top of
get.optimal.armor.combos().regular.level/twinkling.level and interpolate stats to any
intermediate upgrade level.