https://pastebin.com/VmgC0dgS
https://onlinephp.io/c/f361d
Code: Select all
<?php
$race = 45; //race exp table percentage
$class = 250; //class exp table percentage
$startlevel = 25; //return exp needed starting at this level
$numlevels = 10; //return this many levels starting from startlevel
$exptable = GetExpTable($race+$class, $startlevel, $numlevels);
echo '<pre>'.print_r($exptable, true).'</pre>';
function GetExpTable($exptable, $startlevel=1, $numlevels=100) {
$i = 0; $potential_new_exp = 0; $ret = array(); $lastexp = 0; $startexp = 0;
$running_exp_tabulation = 0; $billions_tabulator = 0; $MAX_UINT = 4294967295;
$exp_multiplier = 0; $exp_divisor = 0; $ALTERNATE_NEW_EXP = 0; $accurate_exp = array();
// Calculate experience
for ($i = 1; $i <= ($startlevel+$numlevels-1); $i++) {
$startexp = $lastexp;
if ($i == 1) {
$running_exp_tabulation = 0;
} elseif ($i == 2) {
$running_exp_tabulation = $exptable * 10;
} else {
if ($i <= 26) { //levels 1-26
list($exp_multiplier, $exp_divisor) = GetExpModifiers($i);
} elseif ($i <= 55) { //levels 27-55
$exp_multiplier = 115;
$exp_divisor = 100;
} elseif ($i <= 58) { //levels 56-58
$exp_multiplier = 109;
$exp_divisor = 100;
} else { //levels 59+
$exp_multiplier = 108;
$exp_divisor = 100;
}
if ($exp_multiplier == 0 || $exp_divisor == 0) {
$potential_new_exp = 0;
} else {
$potential_new_exp = $running_exp_tabulation * $exp_multiplier;
}
if ($potential_new_exp > $MAX_UINT) { //UINT ROLLOVER #1
$num_divides = 0;
while ($potential_new_exp > $MAX_UINT) {
$running_exp_tabulation = floor($running_exp_tabulation / 100);
$potential_new_exp = $running_exp_tabulation * $exp_multiplier;
$num_divides++;
}
if ($num_divides > 1) {
$ALTERNATE_NEW_EXP = floor(($running_exp_tabulation * $exp_multiplier * 100) / $exp_divisor);
} else {
$ALTERNATE_NEW_EXP = floor($potential_new_exp / $exp_divisor);
}
while ($num_divides > 0) {
$ALTERNATE_NEW_EXP *= 100;
$num_divides--;
}
} else {
$ALTERNATE_NEW_EXP = floor($potential_new_exp / $exp_divisor);
}
$j = (1000000 * $exp_multiplier * $billions_tabulator);
while ($j > $MAX_UINT) { $j -= $MAX_UINT+1; } //UINT ROLLOVER #2
for ($j; $j >= 1000000000; $billions_tabulator++) {
$j -= 1000000000;
}
$k = ($j + $ALTERNATE_NEW_EXP);
for ($k; $k >= 1000000000; $billions_tabulator++) {
$k -= 1000000000;
}
$running_exp_tabulation = $k;
}
$lastexp = $running_exp_tabulation + ($billions_tabulator*1000000000);
//$neededexp = $lastexp - $startexp;
if ($i >= $startlevel) {
$ret[$i] = $lastexp;
}
}
return $ret;
}
// Returns the experience modifiers for a given level.
function GetExpModifiers($iLevel) {
switch ($iLevel) {
case 3:
return [40, 20];
case 4:
case 5:
return [44, 24];
case 6:
case 7:
return [48, 28];
case 8:
case 9:
return [52, 32];
case 10:
case 11:
return [56, 36];
case 12:
case 13:
return [60, 40];
case 14:
case 15:
return [65, 45];
case 16:
case 17:
return [70, 50];
case 18:
return [75, 55];
default:
if ($iLevel <= 26) {
return [50, 40];
} else {
return [23, 20];
}
}
}
?>
Output from above (which is level 25 plus 9 more levels for a stock dark-elf ranger):
Code: Select all
Array
(
[25] => 22276322
[26] => 27845402
[27] => 32022212
[28] => 36825543
[29] => 42349374
[30] => 48701600
[31] => 56006800
[32] => 64407800
[33] => 74068900
[34] => 85179200
)