/** * Leveling sequentially from very first level up to highest possible until all experiences are spent. * @param Experiences $experiences * @return Level */ public function toTotalLevel(Experiences $experiences) { $currentExperiences = 0; $usedExperiences = 0; $maxLevelValue = 0; while ($usedExperiences + $currentExperiences <= $experiences->getValue()) { $level = $this->toLevel(new Experiences($currentExperiences, $this)); if ($maxLevelValue < $level->getValue()) { $usedExperiences += $currentExperiences; $maxLevelValue = $level->getValue(); } $currentExperiences++; } return new Level($maxLevelValue, $this); }
/** * @test */ public function I_can_get_experiences() { $experiences = new Experiences($value = 456, $this->getExperiencesTable(), Experiences::EXPERIENCES); self::assertSame($value, $experiences->getValue()); }
/** * @test */ public function I_can_create_first_level_from_max_experiences_for_it_but_get_zero_back() { $experiencesTable = new ExperiencesTable(new WoundsTable()); $experiencesForFirstLevel = new Experiences($experiencesValue = 21, $experiencesTable); $levelOfMainProfession = $experiencesTable->toTotalLevel($experiencesForFirstLevel); self::assertSame(1, $levelOfMainProfession->getValue()); self::assertSame(0, $levelOfMainProfession->getExperiences()->getValue()); self::assertSame(0, $levelOfMainProfession->getTotalExperiences()->getValue()); $minimalExperiencesForSecondLevel = new Experiences($experiencesValue + 2, $experiencesTable); $shouldBeSecondLevel = $minimalExperiencesForSecondLevel->getLevel(); self::assertSame(2, $shouldBeSecondLevel->getValue()); self::assertSame($experiencesValue + 1, $shouldBeSecondLevel->getExperiences()->getValue()); self::assertSame($experiencesValue + 1, $shouldBeSecondLevel->getTotalExperiences()->getValue()); }