/**
  * @param ProfessionLevel $excludedProfession
  *
  * @return \Mockery\MockInterface[]|ProfessionFirstLevel[]|ProfessionNextLevel[]
  */
 private function getLevelsExcept(ProfessionLevel $excludedProfession)
 {
     $professionLevels = $this->buildProfessionLevels();
     return array_filter($professionLevels, function (ProfessionLevel $level) use($excludedProfession) {
         return $level->getProfession()->getValue() !== $excludedProfession->getProfession()->getValue();
     });
 }
 /**
  * @param ProfessionLevel $searchedThroughProfessionLevel
  * @param BaseProperty $patternPropertyIncrement
  * @return Charisma|Intelligence|Knack|Will
  */
 private function getSamePropertyIncrement(ProfessionLevel $searchedThroughProfessionLevel, BaseProperty $patternPropertyIncrement)
 {
     return $searchedThroughProfessionLevel->getBasePropertyIncrement($patternPropertyIncrement->getCode());
 }
 private function checkChosenPropertiesSum($primaryPropertiesSum, $secondaryPropertiesSum, ExceptionalityFate $fate, ProfessionLevel $professionLevel)
 {
     if ($primaryPropertiesSum !== $fate->getPrimaryPropertiesBonusOnChoice()) {
         throw new Exceptions\InvalidSumOfChosenProperties("Expected sum of primary properties is {$fate->getPrimaryPropertiesBonusOnChoice()}, got {$primaryPropertiesSum}" . " for profession {$professionLevel->getProfession()->getValue()} and fate {$fate::getCode()}");
     }
     if ($secondaryPropertiesSum !== $fate->getSecondaryPropertiesBonusOnChoice()) {
         throw new Exceptions\InvalidSumOfChosenProperties("Expected sum of secondary properties is {$fate->getSecondaryPropertiesBonusOnChoice()}, got {$secondaryPropertiesSum}" . " for profession {$professionLevel->getProfession()->getValue()} and fate {$fate::getCode()}");
     }
 }
 private static function checkFirstLevelPayment(array $firstLevelPayments, ProfessionLevel $firstLevel, BackgroundSkillPoints $backgroundSkillPoints, Tables $tables)
 {
     foreach ($firstLevelPayments as $skillType => $payment) {
         if (!$payment['spentFirstLevelSkillPoints']) {
             continue;
             // no skills have been "bought" at all
         }
         $paymentBackgroundSkills = $payment['backgroundSkillPoints'];
         self::checkIfBackgroundSkillPointsAreTheSame($paymentBackgroundSkills, $backgroundSkillPoints);
         $availableSkillPoints = 0;
         switch ($skillType) {
             case self::PHYSICAL:
                 $availableSkillPoints = $backgroundSkillPoints->getPhysicalSkillPoints($firstLevel->getProfession(), $tables);
                 break;
             case self::PSYCHICAL:
                 $availableSkillPoints = $backgroundSkillPoints->getPsychicalSkillPoints($firstLevel->getProfession(), $tables);
                 break;
             case self::COMBINED:
                 $availableSkillPoints = $backgroundSkillPoints->getCombinedSkillPoints($firstLevel->getProfession(), $tables);
                 break;
         }
         if ($availableSkillPoints < $payment['spentFirstLevelSkillPoints']) {
             throw new Exceptions\HigherSkillRanksFromFirstLevelThanPossible("First level skills of type '{$skillType}' have higher ranks then possible." . " Expected spent {$availableSkillPoints} skill points at most, got " . $payment['spentFirstLevelSkillPoints']);
         }
     }
 }