Passed
Push — dev ( 981eff...c0869c )
by Nico
06:28
created

SystemDamage::getHealthySystems()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 7
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 1

Importance

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