diff --git a/d3hog_driver.php b/d3hog_driver.php index b1eecde..8e01e67 100644 --- a/d3hog_driver.php +++ b/d3hog_driver.php @@ -1,5 +1,7 @@
-Hall Score: hallScore(), 2); ?>

+Hall Score: hallScore(), 2, '.', ','); ?>

-DPS Score: DPSScore(), 2); ?>
-EHP Score: EHPScore(), 2); ?>
-Sustain Score: sustainScore(), 2); ?>
-Move Score: moveScore(), 2); ?>
-Paragon Score: paragonScore(), 2); ?>
-Misc Score: miscScore(), 2); ?>
+DPS Score: DPSScore(), 2, '.', ','); ?>
+EHP Score: EHPScore(), 2, '.', ','); ?>
+Sustain Score: sustainScore(), 2, '.', ','); ?>
+Move Score: moveScore(), 2, '.', ','); ?>
+Paragon Score: paragonScore(), 2, '.', ','); ?>

(.*?)}', $characterPage, $class); + private + function findClass($characterPage) { + preg_match('{(.*?)}', $characterPage, $class); - return strtolower($class[1]); - } + return strtolower($class[1]); + } } class DPClass { @@ -49,8 +50,14 @@ class DPClass { $this->stats[$attributes[1][$i]] = $attributes[2][$i]; } + $this->stats['Gem Life'] = $this->calculateGemLife(); + $this->modifyExpBonus(); + $this->stats['All Elemental Damage'] = $this->elementalDamage(); - // $this->stats['DPS Unbuffed'] = $this->modifiedDPSUnbuffed(); + + $this->modifyDPSUnbuffed(); + $this->modifyEHP(); + $this->modifyHP(); } function elementalDamage() { @@ -64,27 +71,91 @@ class DPClass { return ($totalElemental > 0) ? $totalElemental + 1 : 0; } - function modifiedDPSUnbuffed() { - return $this->getStat('DPS Unbuffed') * max(1, 1 + ($this->getStat('All Elemental Damage') / 2)) - * max(1, 1 + ($this->getStat('+DPS Against Elites') / 2)); + function calculateGemLife() { + if($this->isParagonMaxed()) return 0; + + switch($this->getStat('Exp Bonus')) { + case .19: return .12; + case .21: return .14; + case .25: return .15; + case .27: return .16; + case .29: return .17; + case .31: return .18; + default: return 0; + } + } + + function modifyExpBonus() { + if($this->getStat('Exp Bonus') >= .35) { + $this->stats['Exp Bonus'] = $this->getStat('Exp Bonus') - .35; + } + } + + function modifyDPSUnbuffed() { + $this->stats['DPS Unbuffed'] = $this->getStat('DPS Unbuffed') * + max(1, 1 + ($this->getStat('All Elemental Damage') / 2)) * + max(1, 1 + ($this->getStat('+DPS Against Elites') / 2)); + } + + function modifyEHP() { + $this->stats['EHP Unbuffed'] = $this->getStat('EHP Unbuffed') * + (1 + $this->getStat('Life Bonus') + $this->getStat('Gem Life')) / + (1 + $this->getStat('Life Bonus')); + } + + function modifyHP() { + $this->stats['Life'] = $this->getStat('Life') * + (1 + $this->getStat('Life Bonus') + $this->getStat('Gem Life')) / + (1 + $this->getStat('Life Bonus')); + } + + function isParagonMaxed() { + return $this->getStat('Paragon Level') == 100; } function hallScore() { return $this->DPSScore() * $this->EHPScore() * $this->sustainScore() - * $this->moveScore() * $this->paragonScore() * $this->miscScore(); + * $this->moveScore() * $this->paragonScore(); } function DPSScore() { - return $this->modifiedDPSUnbuffed() / 1000; + return $this->getStat('DPS Unbuffed') / 1000; } - function EHPScore() {} + function EHPScore() { + $ehp = $this->getStat('EHP Unbuffed'); + + if($ehp < 1000000) { + return $ehp / 10000; + } elseif(1000000 <= $ehp && $ehp <= 2000000) { + return 100 + ($ehp - 1000000) / 20000; + } elseif(2000000 <= $ehp && $ehp <= 5000000) { + return 150 + ($ehp - 2000000) / 40000; + } elseif($ehp <= 5000000) { + return 225 + ($ehp - 5000000) / 100000; + } + } function sustainScore() { - $effectiveLS = $this->getStat('DPS Unbuffed') * $this->getStat('Life Steal') * .2; + $effectiveLS = $this->getStat('DPS Unbuffed') * + $this->getStat('Life Steal') * .5; + $mitigation = $this->getStat('EHP Unbuffed') / $this->getStat('Life'); - return 1 + ($this->getStat('Life on Hit') + $this->getStat('Life per Second') + $effectiveLS) - * 10 / $this->getStat('Life'); + $rawSustainScore = 1 + $mitigation * ($this->getStat('Life on Hit') * + (1 + ($this->getStat('Attacks per Second') - 1) / 2) + + $effectiveLS + $this->getStat('Life per Second')) / + ($this->getStat('Life') * $this->EHPScore() * 10000 / + $this->getStat('EHP Unbuffed')); + + if($rawSustainScore <= 1.5) { + return $rawSustainScore; + } elseif(1.5 < $rawSustainScore && $rawSustainScore <= 2) { + return 1.5 + ($rawSustainScore - 1.5) / 2; + } elseif(2 < $rawSustainScore && $rawSustainScore <= 3) { + return 1.75 + ($rawSustainScore - 2) / 4; + } else { + return 2 + ($rawSustainScore - 3) / 10; + } } function moveScore() { @@ -95,14 +166,6 @@ class DPClass { return 1 + $this->stats['Paragon Level'] / 2 / 100; } - function miscScore() { - $bonusXP = $this->getStat('Exp Bonus'); - if($bonusXP >= .35) $bonusXP -= .35; - - return 1 + ($this->getStat('Melee Damage Reduction') + $this->getStat('Missile Damage Reduction') - + $bonusXP) / 2; - } - function getStat($name) { return (isset($this->stats[$name])) ? $this->stats[$name] : 0; }