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

SkillSpecial   A

Complexity

Total Complexity 13

Size/Duplication

Total Lines 63
Duplicated Lines 0 %

Test Coverage

Coverage 75%

Importance

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

5 Methods

Rating   Name   Duplication   Size   Complexity  
A doSingleTarget() 0 16 2
B do() 0 22 6
A shouldUse() 0 9 3
A getName() 0 2 1
A getPriority() 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\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
  public function getName(): string {
16 1
    return CombatLogEntry::ACTION_SKILL_SPECIAL;
17
  }
18
19
  public function getPriority(): int {
20 1
    return 1000;
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 CharacterSpecialSkill);
32
  }
33
34
  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...
35
    $result = [
36 1
      "result" => true, "amount" => 0, "action" => CombatLogEntry::ACTION_SKILL_SPECIAL, "name" => $skill->skill->name,
37 1
      "character1" => $character1, "character2" => $target,
38
    ];
39 1
    $effect = new CharacterEffect([
40 1
      "id" => "skill{$skill->skill->id}Effect",
41 1
      "type" => $skill->skill->type,
42 1
      "stat" => ((in_array($skill->skill->type, Skill::NO_STAT_TYPES, true)) ? null : $skill->skill->stat),
43 1
      "value" => $skill->value,
44 1
      "source" => CharacterEffect::SOURCE_SKILL,
45 1
      "duration" => $skill->skill->duration,
46
    ]);
47 1
    $target->addEffect($effect);
48 1
    $combat->log->log($result);
49 1
    $skill->resetCooldown();
50 1
  }
51
52
  /**
53
   * @throws NotImplementedException
54
   */
55
  public function do(CombatBase $combat, Character $character): void {
56
    /** @var CharacterSpecialSkill $skill */
57 1
    $skill = $character->usableSkills[0];
58 1
    $targets = [];
59 1
    switch($skill->skill->target) {
60 1
      case Skill::TARGET_ENEMY:
61
        $targets[] = $combat->selectAttackTarget($character);
62
        break;
63 1
      case Skill::TARGET_SELF:
64 1
        $targets[] = $character;
65 1
        break;
66
      case Skill::TARGET_PARTY:
67
        $targets = $combat->getTeam($character)->toArray();
68
        break;
69
      case Skill::TARGET_ENEMY_PARTY:
70
        $targets = $combat->getEnemyTeam($character)->toArray();
71
        break;
72
      default:
73
        throw new NotImplementedException("Target {$skill->skill->target} for special skills is not implemented.");
74
    }
75 1
    foreach($targets as $target) {
76 1
      $this->doSingleTarget($character, $target, $skill, $combat);
77
    }
78 1
  }
79
}
80
?>