Passed
Push — master ( bc69e6...465240 )
by Jakub
12:35
created

SkillAttack   A

Complexity

Total Complexity 12

Size/Duplication

Total Lines 63
Duplicated Lines 0 %

Test Coverage

Coverage 75%

Importance

Changes 2
Bugs 0 Features 1
Metric Value
wmc 12
eloc 38
dl 0
loc 63
rs 10
c 2
b 0
f 1
ccs 27
cts 36
cp 0.75

5 Methods

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