/** * 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; }();