diff --git a/hwe/sammo/InheritancePointManager.php b/hwe/sammo/InheritancePointManager.php index d185d607..b0e9e5a4 100644 --- a/hwe/sammo/InheritancePointManager.php +++ b/hwe/sammo/InheritancePointManager.php @@ -152,19 +152,7 @@ class InheritancePointManager }; switch ($key) { case InheritanceKey::dex: - $extractFn = function () use ($general, $multiplier) { - $dexLimit = Util::array_last(getDexLevelList())[0]; - $totalDex = 0; - foreach (array_keys(GameUnitConst::allType()) as $armType) { - $subDex = $general->getVar("dex{$armType}"); - if ($subDex > $dexLimit) { - $totalDex += ($subDex - $dexLimit) / 3; - $subDex = $dexLimit; - } - $totalDex += $subDex; - } - return [$totalDex * $multiplier, null]; - }; + $extractFn = fn () => [$this->getDexInheritancePoint($general), null]; break; case InheritanceKey::betting: $extractFn = function () use ($general, $multiplier) { @@ -189,6 +177,28 @@ class InheritancePointManager return $value; } + /** @param null|int[] $armTypes */ + public function getDexInheritancePoint( + General $general, + ?int $dexLimit = null, + ?array $armTypes = null + ): float + { + $dexLimit ??= Util::array_last(getDexLevelList())[0]; + $armTypes ??= array_keys(GameUnitConst::allType()); + $multiplier = $this->getInheritancePointType(InheritanceKey::dex)->pointCoeff; + $totalDex = 0; + foreach ($armTypes as $armType) { + $subDex = CentennialAllStarGrowthService::recordableValue($general, "dex{$armType}"); + if ($subDex > $dexLimit) { + $totalDex += ($subDex - $dexLimit) / 3; + $subDex = $dexLimit; + } + $totalDex += $subDex; + } + return $totalDex * $multiplier; + } + public function setInheritancePoint(General $general, InheritanceKey $key, $value, $aux = null) { diff --git a/tests/CentennialAllStarGrowthTest.php b/tests/CentennialAllStarGrowthTest.php index 579c0064..ccca836d 100644 --- a/tests/CentennialAllStarGrowthTest.php +++ b/tests/CentennialAllStarGrowthTest.php @@ -5,6 +5,7 @@ use sammo\CentennialAllStarGrowth; use sammo\CentennialAllStarGrowthService; use sammo\General; use sammo\GameConst; +use sammo\InheritancePointManager; $loader = require __DIR__ . '/../vendor/autoload.php'; $loader->addPsr4('sammo\\', __DIR__ . '/../hwe/sammo', true); @@ -371,6 +372,28 @@ final class CentennialAllStarGrowthTest extends TestCase self::assertSame(900000, CentennialAllStarGrowth::dexFloor(900000, 1)); } + public function testSynchronizedDexDoesNotIncreaseInheritancePoint(): void + { + $vars = $this->emptyGeneralVars(); + $vars['dex1'] = 1_300_000; + $vars['dex2'] = 1_300_000; + $aux = CentennialAllStarGrowthService::initialAux( + $this->singleDexTarget('inheritance', 0), + [] + ); + $aux['granted']['dex1'] = 1_000_000; + $general = $this->createStateGeneralMock($vars, $aux); + + self::assertSame( + 1_400.0, + InheritancePointManager::getInstance()->getDexInheritancePoint( + $general, + 1_000_000, + [1, 2, 3, 4, 5] + ) + ); + } + public function testNpcDexStopsAtFortyPercentOfHistoricalTarget(): void { $target = 900000;