/** * @param RangedWeaponCode $rangeWeaponCode * @return BowsTable|CrossbowsTable|ThrowingWeaponsTable * @throws UnknownRangedWeapon */ public function getRangedWeaponsTableByRangedWeaponCode(RangedWeaponCode $rangeWeaponCode) { if ($rangeWeaponCode->isBow()) { return $this->getBowsTable(); } if ($rangeWeaponCode->isCrossbow()) { return $this->getCrossbowsTable(); } if ($rangeWeaponCode->isThrowingWeapon()) { return $this->getThrowingWeaponsTable(); } throw new UnknownRangedWeapon("Unknown type of range weapon '{$rangeWeaponCode}'"); }
/** * Bows get bonus to range from used strength (up to maximal strength applicable for given bow). * Other ranged weapons gets no range bonus (zero) from strength. * * @param RangedWeaponCode $rangedWeaponCode * @param Strength $currentStrength * @return int * @throws CanNotUseWeaponBecauseOfMissingStrength * @throws UnknownBow * @throws UnknownRangedWeapon */ private function getEncounterRangeBonusByStrength(RangedWeaponCode $rangedWeaponCode, Strength $currentStrength) { if (!$rangedWeaponCode->isBow()) { return 0; } $currentStrength = $this->getApplicableStrength($rangedWeaponCode, $currentStrength); // the range bonus for bow is equal to strength applicable for it return min($this->tables->getBowsTable()->getMaximalApplicableStrengthOf($rangedWeaponCode), $currentStrength->getValue()); }
/** * @param RangedWeaponCode $rangeWeaponCode * @return int * @throws \DrdPlus\Skills\Combined\Exceptions\CombinedSkillsDoNotHowToUseThatWeapon */ private function getFightWithShootingWeaponRankValue(RangedWeaponCode $rangeWeaponCode) { if ($rangeWeaponCode->isBow()) { return $this->getFightWithBows() ? $this->getFightWithBows()->getCurrentSkillRank()->getValue() : 0; } if ($rangeWeaponCode->isCrossbow()) { return $this->getFightWithCrossbows() ? $this->getFightWithCrossbows()->getCurrentSkillRank()->getValue() : 0; } throw new Exceptions\CombinedSkillsDoNotHowToUseThatWeapon("Given range weapon {$rangeWeaponCode} is not affected by combined skills" . ' (only shooting weapons using knack are)'); }