Passed
Push — master ( cdb94c...dd3471 )
by Jakub
04:07
created

SkillSpecial   A

Complexity

Total Complexity 13

Size/Duplication

Total Lines 65
Duplicated Lines 0 %

Test Coverage

Coverage 75%

Importance

Changes 0
Metric Value
wmc 13
eloc 43
dl 0
loc 65
ccs 30
cts 40
cp 0.75
rs 10
c 0
b 0
f 0

5 Methods

Rating   Name   Duplication   Size   Complexity  
B do() 0 22 6
A shouldUse() 0 9 3
A getName() 0 2 1
A getPriority() 0 2 1
A doSingleTarget() 0 16 2
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\CharacterSpecialSkill;
10
use HeroesofAbenez\Combat\SkillSpecial as Skill;
11
use HeroesofAbenez\Combat\NotImplementedException;
12
use HeroesofAbenez\Combat\CharacterEffect;
13
14 1
final class SkillSpecial implements ICombatAction {
15 1
  use \Nette\SmartObject;
16
17
  public function getName(): string {
18 1
    return CombatLogEntry::ACTION_SKILL_SPECIAL;
19
  }
20
21
  public function getPriority(): int {
22 1
    return 1000;
23
  }
24
25
  public function shouldUse(CombatBase $combat, Character $character): bool {
26 1
    $attackTarget = $combat->selectAttackTarget($character);
27 1
    if(is_null($attackTarget)) {
28
      return false;
29
    }
30 1
    if(count($character->usableSkills) < 1) {
31 1
      return false;
32
    }
33 1
    return ($character->usableSkills[0] instanceof CharacterSpecialSkill);
34
  }
35
36
  protected function doSingleTarget(Character $character1, Character $target, CharacterSpecialSkill $skill, CombatBase $combat): void {
0 ignored issues
show
introduced by
Line exceeds 120 characters; contains 135 characters
Loading history...
37
    $result = [
38 1
      "result" => true, "amount" => 0, "action" => $this->getName(), "name" => $skill->skill->name,
39 1
      "character1" => $character1, "character2" => $target,
40
    ];
41 1
    $effect = new CharacterEffect([
42 1
      "id" => "skill{$skill->skill->id}Effect",
43 1
      "type" => $skill->skill->type,
44 1
      "stat" => ((in_array($skill->skill->type, Skill::NO_STAT_TYPES, true)) ? null : $skill->skill->stat),
45 1
      "value" => $skill->value,
46
      "valueAbsolute" => false,
47 1
      "duration" => $skill->skill->duration,
48
    ]);
49 1
    $target->addEffect($effect);
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 CharacterSpecialSkill $skill */
59 1
    $skill = $character->usableSkills[0];
60 1
    $targets = [];
61 1
    switch($skill->skill->target) {
62 1
      case Skill::TARGET_ENEMY:
63
        $targets[] = $combat->selectAttackTarget($character);
64
        break;
65 1
      case Skill::TARGET_SELF:
66 1
        $targets[] = $character;
67 1
        break;
68
      case Skill::TARGET_PARTY:
69
        $targets = $combat->getTeam($character)->toArray();
70
        break;
71
      case Skill::TARGET_ENEMY_PARTY:
72
        $targets = $combat->getEnemyTeam($character)->toArray();
73
        break;
74
      default:
75
        throw new NotImplementedException("Target {$skill->skill->target} for special skills is not implemented.");
76
    }
77 1
    foreach($targets as $target) {
78 1
      $this->doSingleTarget($character, $target, $skill, $combat);
79
    }
80 1
  }
81
}
82
?>