Passed
Push — master ( e661f4...30021e )
by Nico
25:16 queued 10:59
created

SystemDamage::getHealthySystems()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 7
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 5
nc 1
nop 2
dl 0
loc 7
ccs 0
cts 6
cp 0
crap 2
rs 10
c 1
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Stu\Module\Spacecraft\Lib\Damage;
6
7
use Override;
0 ignored issues
show
Bug introduced by
The type Override was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
8
use Stu\Component\Spacecraft\System\SpacecraftSystemManagerInterface;
9
use Stu\Component\Spacecraft\System\SpacecraftSystemModeEnum;
10
use Stu\Lib\Damage\DamageWrapper;
11
use Stu\Lib\Information\InformationInterface;
12
use Stu\Module\Spacecraft\Lib\SpacecraftWrapperInterface;
13
use Stu\Orm\Entity\SpacecraftSystemInterface;
14
15
//TODO unit tests and move to Lib/Damage
16
final class SystemDamage implements SystemDamageInterface
17
{
18 1
    public function __construct(
19
        private SpacecraftSystemManagerInterface $spacecraftSystemManager
20 1
    ) {}
21
22
    #[Override]
23
    public function checkForDamagedShipSystems(
24
        SpacecraftWrapperInterface $wrapper,
25
        DamageWrapper $damageWrapper,
26
        int $huelleVorher,
27
        InformationInterface $informations
28
    ): bool {
29
        $ship = $wrapper->get();
30
        $systemsToDamage = ceil($huelleVorher * 6 / $ship->getMaxHull()) -
31
            ceil($ship->getHull() * 6 / $ship->getMaxHull());
32
33
        if ($systemsToDamage == 0) {
34
            return false;
35
        }
36
37
        for ($i = 1; $i <= $systemsToDamage; $i++) {
38
            $this->damageRandomShipSystem($wrapper, $damageWrapper, $informations);
39
        }
40
41
        return true;
42
    }
43
44
    #[Override]
45
    public function destroyRandomShipSystem(SpacecraftWrapperInterface $wrapper, DamageWrapper $damageWrapper): ?string
46
    {
47
        $healthySystems = $this->getHealthySystems($wrapper, $damageWrapper);
48
        shuffle($healthySystems);
49
50
        if ($healthySystems === []) {
51
            return null;
52
        }
53
        $system = $healthySystems[0];
54
        $system->setStatus(0);
55
        $system->setMode(SpacecraftSystemModeEnum::MODE_OFF);
56
        $this->spacecraftSystemManager->handleDestroyedSystem($wrapper, $healthySystems[0]->getSystemType());
57
58
        return $healthySystems[0]->getSystemType()->getDescription();
59
    }
60
61
    #[Override]
62
    public function damageRandomShipSystem(
63
        SpacecraftWrapperInterface $wrapper,
64
        DamageWrapper $damageWrapper,
65
        InformationInterface $informations,
66
        ?int $percent = null
67
    ): void {
68
        $healthySystems = $this->getHealthySystems($wrapper, $damageWrapper);
69
        shuffle($healthySystems);
70
71
        if ($healthySystems !== []) {
72
            $system = $healthySystems[0];
73
74
            $this->damageShipSystem($wrapper, $system, $percent ?? random_int(1, 70), $informations);
75
        }
76
    }
77
78
    /** @return array<SpacecraftSystemInterface>  */
79
    private function getHealthySystems(SpacecraftWrapperInterface $wrapper, DamageWrapper $damageWrapper): array
80
    {
81
        return $wrapper->get()->getSystems()
82
            ->filter(fn(SpacecraftSystemInterface $system): bool => $damageWrapper->canDamageSystem($system->getSystemType()))
83
            ->filter(fn(SpacecraftSystemInterface $system): bool => $system->getStatus() > 0)
84
            ->filter(fn(SpacecraftSystemInterface $system): bool => $system->getSystemType()->canBeDamaged())
85
            ->toArray();
86
    }
87
88
    #[Override]
89
    public function damageShipSystem(
90
        SpacecraftWrapperInterface $wrapper,
91
        SpacecraftSystemInterface $system,
92
        int $dmg,
93
        InformationInterface $informations
94
    ): bool {
95
        $status = $system->getStatus();
96
        $systemName = $system->getSystemType()->getDescription();
97
98
        if ($status > $dmg) {
99
            $system->setStatus($status - $dmg);
100
            $this->spacecraftSystemManager->handleDamagedSystem($wrapper, $system->getSystemType());
101
            $informations->addInformation("- Folgendes System wurde beschädigt: " . $systemName);
102
103
            return false;
104
        } else {
105
            $system->setStatus(0);
106
            $system->setMode(SpacecraftSystemModeEnum::MODE_OFF);
107
            $this->spacecraftSystemManager->handleDestroyedSystem($wrapper, $system->getSystemType());
108
            $informations->addInformation("- Der Schaden zerstört folgendes System: " . $systemName);
109
110
            return true;
111
        }
112
    }
113
}
114