refactor: tighten useAbility and Scenario archetype lookup
Final-review-driven changes (Tasks 6/M1, I1 from the ledger): - Drop the redundant abilities-list check in CombatEngine::useAbility. By construction (Scenario::__construct enforces the allowlist), any ability the unit 'knows' is also archetype-allowed; the second check alone is sufficient and removes a dead code path. - Update testUseAbilityRejectsAnAbilityTheArchetypeForbids to assert the 'Unit archetype forbids that ability.' message it actually exercises. - Compute $template once in Scenario::__construct's per-unit loop and drop the redundant catalog lookup on the next line.
This commit is contained in:
@@ -89,10 +89,6 @@ final class CombatEngine
|
||||
|
||||
$definition = $definitions[$abilityId];
|
||||
|
||||
if (!in_array($abilityId, $caster->abilities, true)) {
|
||||
throw new CombatException('Unit does not know that ability.');
|
||||
}
|
||||
|
||||
if (!in_array($abilityId, $caster->allowedAbilities(), true)) {
|
||||
throw new CombatException('Unit archetype forbids that ability.');
|
||||
}
|
||||
|
||||
@@ -72,12 +72,11 @@ final readonly class Scenario
|
||||
throw new InvalidArgumentException("Unit {$unit->id} is outside the battlefield.");
|
||||
}
|
||||
|
||||
if (!ArchetypeCatalog::templates()[$unit->archetype->value] ?? false) { // @phpstan-ignore nullCoalesce.expr, if.alwaysFalse, booleanNot.alwaysFalse (Runtime guard: defense in depth against an unknown Archetype enum value.)
|
||||
$template = ArchetypeCatalog::templates()[$unit->archetype->value] ?? null;
|
||||
if ($template === null) {
|
||||
throw new InvalidArgumentException("Unit {$unit->id} uses an unknown archetype.");
|
||||
}
|
||||
|
||||
$template = ArchetypeCatalog::templates()[$unit->archetype->value];
|
||||
|
||||
if ($unit->maxHealth < $template->minHealth || $unit->maxHealth > $template->maxHealth) {
|
||||
throw new InvalidArgumentException("Unit {$unit->id} health is outside archetype bounds.");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user