public static function registerSelf() { parent::registerSelf(); static::registerCodeAsSubType(MeleeWeaponCode::getIt(MeleeWeaponCode::HAND)); static::registerCodeAsSubType(RangedWeaponCode::getIt(RangedWeaponCode::HEAVY_CROSSBOW)); static::registerCodeAsSubType(ShieldCode::getIt(ShieldCode::BUCKLER)); }
public static function registerSelf() { parent::registerSelf(); // ARMAMENTS static::registerCodeAsSubType(ArrowCode::getIt(ArrowCode::BASIC_ARROW)); static::registerCodeAsSubType(BodyArmorCode::getIt(BodyArmorCode::CHAINMAIL_ARMOR)); static::registerCodeAsSubType(DartCode::getIt(DartCode::BASIC_DART)); static::registerCodeAsSubType(HelmCode::getIt(HelmCode::BARREL_HELM)); static::registerCodeAsSubType(MeleeWeaponCode::getIt(MeleeWeaponCode::HAND)); static::registerCodeAsSubType(RangedWeaponCode::getIt(RangedWeaponCode::HEAVY_CROSSBOW)); static::registerCodeAsSubType(ShieldCode::getIt(ShieldCode::BUCKLER)); static::registerCodeAsSubType(SlingStoneCode::getIt(SlingStoneCode::SLING_STONE_HEAVIER)); static::registerCodeAsSubType(WeaponCategoryCode::getIt(WeaponCategoryCode::ARROW)); // BODY static::registerCodeAsSubType(ActivityAffectingHealingCode::getIt(ActivityAffectingHealingCode::LIGHT_ACTIVITY)); static::registerCodeAsSubType(AfflictionByWoundDomainCode::getIt(AfflictionByWoundDomainCode::PHYSICAL)); static::registerCodeAsSubType(ConditionsAffectingHealingCode::getIt(ConditionsAffectingHealingCode::BAD_CONDITIONS)); static::registerCodeAsSubType(RestConditionsCode::getIt(RestConditionsCode::FOUL_CONDITIONS)); static::registerCodeAsSubType(WoundsOriginCode::getIt(WoundsOriginCode::ELEMENTAL)); static::registerCodeAsSubType(WoundTypeCode::getIt(WoundTypeCode::CRUSH)); // COMBAT ACTIONS static::registerCodeAsSubType(CombatActionCode::getIt(CombatActionCode::ATTACKED_FROM_BEHIND)); static::registerCodeAsSubType(MeleeCombatActionCode::getIt(MeleeCombatActionCode::COVER_OF_ALLY)); static::registerCodeAsSubType(RangedCombatActionCode::getIt(RangedCombatActionCode::AIMED_SHOT)); // ENVIRONMENT static::registerCodeAsSubType(LightConditionsCode::getIt(LightConditionsCode::STRONG_DAYLIGHT)); static::registerCodeAsSubType(LightSourceCode::getIt(LightSourceCode::BALEFIRE)); static::registerCodeAsSubType(LightSourceEnvironmentCode::getIt(LightSourceEnvironmentCode::MIRROR_BEHIND_LIGHT_SOURCE)); static::registerCodeAsSubType(TerrainCode::getIt(TerrainCode::DESERT)); // SKILLS static::registerCodeAsSubType(CombinedSkillCode::getIt(CombinedSkillCode::BIG_HANDWORK)); static::registerCodeAsSubType(PhysicalSkillCode::getIt(PhysicalSkillCode::ATHLETICS)); static::registerCodeAsSubType(PsychicalSkillCode::getIt(PsychicalSkillCode::ASTRONOMY)); static::registerCodeAsSubType(SkillTypeCode::getIt(SkillTypeCode::COMBINED)); // OTHERS static::registerCodeAsSubType(ElementCode::getIt(ElementCode::AIR)); static::registerCodeAsSubType(GenderCode::getIt(GenderCode::FEMALE)); static::registerCodeAsSubType(ItemHoldingCode::getIt(ItemHoldingCode::MAIN_HAND)); static::registerCodeAsSubType(MovementTypeCode::getIt(MovementTypeCode::RUN)); static::registerCodeAsSubType(ProfessionCode::getIt(ProfessionCode::COMMONER)); static::registerCodeAsSubType(PropertyCode::getIt(PropertyCode::AGE)); static::registerCodeAsSubType(RaceCode::getIt(RaceCode::DWARF)); static::registerCodeAsSubType(RidingAnimalCode::getIt(RidingAnimalCode::BULL)); static::registerCodeAsSubType(RidingAnimalMovementCode::getIt(RidingAnimalMovementCode::CANTER)); static::registerCodeAsSubType(RidingAnimalPropertyCode::getIt(RidingAnimalPropertyCode::DEFIANCE)); static::registerCodeAsSubType(SubRaceCode::getIt(SubRaceCode::COMMON)); static::registerCodeAsSubType(TimeCode::getIt(TimeCode::DAY)); }
/** * @param RangedWeaponCode $rangedWeaponCode * @param Speed $speed * @return int * @throws CanNotUseWeaponBecauseOfMissingStrength */ private function getEncounterRangeBonusBySpeed(RangedWeaponCode $rangedWeaponCode, Speed $speed) { if (!$rangedWeaponCode->isThrowingWeapon()) { return 0; } return SumAndRound::half($speed->getValue()); }
public function provideArmamentCodeAndExpectedSanctionsTable() { return [[BodyArmorCode::getIt(BodyArmorCode::HOBNAILED_ARMOR), ArmorStrengthSanctionsTable::class], [HelmCode::getIt(HelmCode::GREAT_HELM), ArmorStrengthSanctionsTable::class], [RangedWeaponCode::getIt(RangedWeaponCode::HEAVY_CROSSBOW), RangedWeaponStrengthSanctionsTable::class], [MeleeWeaponCode::getIt(MeleeWeaponCode::CLUB), MeleeWeaponStrengthSanctionsTable::class], [ShieldCode::getIt(ShieldCode::BUCKLER), ShieldStrengthSanctionsTable::class]]; }
/** * @test */ public function I_can_convert_spear_to_range_weapon_code() { $meleeSpear = MeleeWeaponCode::getIt(MeleeWeaponCode::SPEAR); self::assertInstanceOf(MeleeWeaponCode::class, $meleeSpear); self::assertSame($meleeSpear, $meleeSpear->convertToMeleeWeaponCodeEquivalent()); $rangeSpear = $meleeSpear->convertToRangedWeaponCodeEquivalent(); self::assertNotSame($meleeSpear, $rangeSpear); self::assertInstanceOf(RangedWeaponCode::class, $rangeSpear); self::assertSame(RangedWeaponCode::getIt(RangedWeaponCode::SPEAR), $rangeSpear); }
/** * @test */ public function I_can_get_maximal_applicable_strength_easily() { $bowsTable = new BowsTable(); self::assertSame(3, $bowsTable->getMaximalApplicableStrengthOf(RangedWeaponCode::getIt(RangedWeaponCode::SHORT_BOW))); self::assertSame(12, $bowsTable->getMaximalApplicableStrengthOf(RangedWeaponCode::POWER_BOW)); }
/** * @test */ public function I_can_easily_find_out_if_is_ranged() { self::assertTrue(RangedWeaponCode::getIt(RangedWeaponCode::MILITARY_CROSSBOW)->isRanged()); }
/** * @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}'"); }
/** * @test */ public function I_get_cover_of_two_for_every_ranged_weapon_and_zero_for_projectile() { $armourer = new Armourer(new Tables()); foreach (RangedWeaponCode::getPossibleValues() as $rangedWeaponCode) { $rangedWeapon = RangedWeaponCode::getIt($rangedWeaponCode); if ($rangedWeapon->isProjectile()) { self::assertSame(0, $armourer->getCoverOfWeaponOrShield($rangedWeapon)); } else { self::assertSame(2, $armourer->getCoverOfWeaponOrShield($rangedWeapon), "'{$rangedWeapon}' should has cover of 2"); } } }
/** * @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)'); }