summaryrefslogblamecommitdiff
path: root/public/js/comp/stat.js
blob: cd756468dfcb87864d0636472d6fb17ec5184e2c (plain) (tree)
























































































































































                                                                                                                           
/**
 * Make computations about tmwAthena's stat requirements.
 *
 * Amongst other things, this can be used to derive a minimum base level for a stat configuration.
 */
var stat = function(){
  var stat = {};
  var statpoint = [
    48,
    52,
    56,
    60,
    64,
    69,
    74,
    79,
    84,
    90,
    96,
    102,
    108,
    115,
    122,
    129,
    136,
    144,
    152,
    160,
    168,
    177,
    186,
    195,
    204,
    214,
    224,
    234,
    244,
    255,
    266,
    277,
    288,
    300,
    312,
    324,
    336,
    349,
    362,
    375,
    388,
    402,
    416,
    430,
    444,
    459,
    474,
    489,
    504,
    520,
    536,
    552,
    568,
    585,
    602,
    619,
    636,
    654,
    672,
    690,
    708,
    727,
    746,
    765,
    784,
    804,
    824,
    844,
    864,
    885,
    906,
    927,
    948,
    970,
    992,
    1014,
    1036,
    1059,
    1082,
    1105,
    1128,
    1152,
    1176,
    1200,
    1224,
    1249,
    1274,
    1299,
    1324,
    1350,
    1376,
    1402,
    1428,
    1455,
    1482,
    1509,
    1536,
    1564,
    1592
  ];
  /* If a character is using a certain number of status points, what is the lowest level it could be? */
  stat.minLevelForStatusPoints = function(statusPoints) {
    /*
     * tmwAthena status points for a level are described by the following recurrence relation:
     *  p(1) = 48
     *  p(l) = p(l - 1) + floor((l + 14) / 4)
     * For whatever reason, the server also loads a cached copy from a file of all places - db/statpoint.txt.
     * If this is out of sync with the equation, fun things can happen.
     * For now, naively assume that statpoint.txt is correct and shamelessly dump it here (see above).
     */
    return crossfilter.bisect.left(statpoint, statusPoints, 0, statpoint.length) + 1;
  };
  var statusPointInc = [0, 0]
  stat.statusPointsForStat = function(v) {
    if (isNaN(v)) {
      throw "Invalid input";
    }
    /* First, convert the absolute stat to terms of increments. */
    /* This is as simple as removing the starting value - 1 - from it. */
    /*
     * The status points needed to increase from a stat with value v can be calculated as follows:
     *  floor((v + 9) / 10) + 1
     */
    if (statusPointInc.length > v) {
      return statusPointInc[v];
    }
    var i = stat.statusPointsForStat(v - 1) + Math.floor(((v - 1) + 9) / 10) + 1;
    statusPointInc.push(i);
    return i;
  }
  /* If a character has a certain arrangement of attributes, how many status points are required for this configuration? */
  stat.statusPointsForStats = function(str, agi, vit, dex, int, luk) {
    return stat.statusPointsForStat(str) +
           stat.statusPointsForStat(agi) +
           stat.statusPointsForStat(vit) +
           stat.statusPointsForStat(dex) +
           stat.statusPointsForStat(int) +
           stat.statusPointsForStat(luk);
  };
  /* Helper function currying minLevelForStatusPoints and stat.statusPointsForStats */
  stat.minLevelForStats = function(str, agi, vit, dex, int, luk) {
    return stat.minLevelForStatusPoints(stat.statusPointsForStats(str, agi, vit, dex, int, luk));
  };
  return stat;
}();