Completed
Push — master ( 29e2cf...033bf5 )
by Jakub
02:40
created

SkillAttack   A

Complexity

Total Complexity 14

Size/Duplication

Total Lines 65
Duplicated Lines 0 %

Test Coverage

Coverage 80.95%

Importance

Changes 0
Metric Value
wmc 14
eloc 43
dl 0
loc 65
ccs 34
cts 42
cp 0.8095
rs 10
c 0
b 0
f 0

5 Methods

Rating   Name   Duplication   Size   Complexity  
A getPriority() 0 2 1
A do() 0 22 6
A doSingleAttack() 0 18 3
A shouldUse() 0 9 3
A getName() 0 2 1
1
<?php
2
declare(strict_types=1);
3
4
namespace HeroesofAbenez\Combat\CombatActions;
5
6
use HeroesofAbenez\Combat\Character;
7
use HeroesofAbenez\Combat\CombatBase;
8
use HeroesofAbenez\Combat\CombatLogEntry;
9
use HeroesofAbenez\Combat\CharacterAttackSkill;
10
use HeroesofAbenez\Combat\SkillAttack as Skill;
11
use HeroesofAbenez\Combat\NotImplementedException;
12
use Nexendrie\Utils\Numbers;
13
14 1
final class SkillAttack implements ICombatAction {
15
  public function getName(): string {
16 1
    return CombatLogEntry::ACTION_SKILL_ATTACK;
17
  }
18
19
  public function getPriority(): int {
20 1
    return 1001;
21
  }
22
23
  public function shouldUse(CombatBase $combat, Character $character): bool {
24 1
    $attackTarget = $combat->selectAttackTarget($character);
25 1
    if(is_null($attackTarget)) {
26
      return false;
27
    }
28 1
    if(count($character->usableSkills) < 1) {
29 1
      return false;
30
    }
31 1
    return ($character->usableSkills[0] instanceof CharacterAttackSkill);
32
  }
33
34
  protected function doSingleAttack(Character $attacker, Character $defender, CharacterAttackSkill $skill, CombatBase $combat): void {
0 ignored issues
show
introduced by
Line exceeds 120 characters; contains 134 characters
Loading history...
35 1
    $result = [];
36 1
    $result["result"] = $combat->successCalculator->hasHit($attacker, $defender, $skill);
37 1
    $result["amount"] = 0;
38 1
    if($result["result"]) {
39 1
      $amount = (int) ($attacker->damage - $defender->defense / 100 * $skill->damage);
40 1
      $result["amount"] = Numbers::range($amount, 0, $defender->hitpoints);
41
    }
42 1
    if($result["amount"] > 0) {
43 1
      $defender->harm($result["amount"]);
44
    }
45 1
    $result["action"] = CombatLogEntry::ACTION_SKILL_ATTACK;
46 1
    $result["name"] = $skill->skill->name;
47 1
    $result["character1"] = $attacker;
48 1
    $result["character2"] = $defender;
49 1
    $combat->logDamage($attacker, $result["amount"]);
50 1
    $combat->log->log($result);
51 1
    $skill->resetCooldown();
52 1
  }
53
54
  /**
55
   * @throws NotImplementedException
56
   */
57
  public function do(CombatBase $combat, Character $character): void {
58
    /** @var CharacterAttackSkill $skill */
59 1
    $skill = $character->usableSkills[0];
60 1
    $targets = [];
61
    /** @var Character $primaryTarget */
62 1
    $primaryTarget = $combat->selectAttackTarget($character);
63 1
    switch($skill->skill->target) {
64 1
      case Skill::TARGET_SINGLE:
65 1
        $targets[] = $primaryTarget;
66 1
        break;
67
      case Skill::TARGET_ROW:
68
        $targets = $combat->getTeam($primaryTarget)->getItems(["positionRow" => $primaryTarget->positionRow]);
69
        break;
70
      case Skill::TARGET_COLUMN:
71
        $targets = $combat->getTeam($primaryTarget)->getItems(["positionColumn" => $primaryTarget->positionColumn]);
72
        break;
73
      default:
74
        throw new NotImplementedException("Target {$skill->skill->target} for attack skills is not implemented.");
75
    }
76 1
    foreach($targets as $target) {
77 1
      for($i = 1; $i <= $skill->skill->strikes; $i++) {
78 1
        $this->doSingleAttack($character, $target, $skill, $combat);
79
      }
80
    }
81 1
  }
82
}
83
?>