Passed
Pull Request — master (#1801)
by Nico
23:50
created

PirateReaction   A

Complexity

Total Complexity 12

Size/Duplication

Total Lines 147
Duplicated Lines 0 %

Test Coverage

Coverage 0%

Importance

Changes 6
Bugs 0 Features 0
Metric Value
eloc 83
dl 0
loc 147
ccs 0
cts 52
cp 0
rs 10
c 6
b 0
f 0
wmc 12

5 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 9 1
A checkForPirateReaction() 0 21 3
A action() 0 11 1
A getRandomBehaviourType() 0 5 1
B react() 0 43 6
1
<?php
2
3
namespace Stu\Lib\Pirate;
4
5
use Stu\Lib\Pirate\Behaviour\PirateBehaviourInterface;
6
use Stu\Lib\Pirate\Component\PirateWrathManagerInterface;
7
use Stu\Lib\Pirate\Component\ReloadMinimalEpsInterface;
8
use Stu\Module\Control\StuRandom;
9
use Stu\Module\Logging\LoggerUtilFactoryInterface;
10
use Stu\Module\Logging\PirateLoggerInterface;
11
use Stu\Module\PlayerSetting\Lib\UserEnum;
12
use Stu\Module\Ship\Lib\FleetWrapperInterface;
13
use Stu\Module\Ship\Lib\ShipWrapperFactoryInterface;
14
use Stu\Orm\Entity\FleetInterface;
15
use Stu\Orm\Entity\ShipInterface;
16
17
class PirateReaction implements PirateReactionInterface
18
{
19
    private const REACTION_PROBABILITIES = [
20
        PirateReactionTriggerEnum::ON_ATTACK->value => [
21
            PirateBehaviourEnum::RAGE->value => 50,
22
            PirateBehaviourEnum::CALL_FOR_SUPPORT->value => 30,
23
            PirateBehaviourEnum::SEARCH_FRIEND->value => 30,
24
            PirateBehaviourEnum::FLY->value => 20,
25
            PirateBehaviourEnum::HIDE->value => 20,
26
            PirateBehaviourEnum::DO_NOTHING->value => 10,
27
        ],
28
        PirateReactionTriggerEnum::ON_SCAN->value => [
29
            PirateBehaviourEnum::DO_NOTHING->value => 60,
30
            PirateBehaviourEnum::RAGE->value => 60,
31
            PirateBehaviourEnum::CALL_FOR_SUPPORT->value => 20,
32
            PirateBehaviourEnum::FLY->value => 20,
33
            PirateBehaviourEnum::HIDE->value => 20,
34
            PirateBehaviourEnum::SEARCH_FRIEND->value => 5,
35
        ],
36
        PirateReactionTriggerEnum::ON_INTERCEPTION->value => [
37
            PirateBehaviourEnum::RAGE->value => 40,
38
            PirateBehaviourEnum::CALL_FOR_SUPPORT->value => 20,
39
            PirateBehaviourEnum::SEARCH_FRIEND->value => 15,
40
            PirateBehaviourEnum::DO_NOTHING->value => 10,
41
            PirateBehaviourEnum::FLY->value => 10,
42
        ],
43
        PirateReactionTriggerEnum::ON_SUPPORT_CALL->value => [
44
            PirateBehaviourEnum::RAGE->value => 100,
45
            PirateBehaviourEnum::CALL_FOR_SUPPORT->value => 20
46
        ],
47
        PirateReactionTriggerEnum::ON_RAGE->value => [
48
            PirateBehaviourEnum::RAGE->value => 50,
49
            PirateBehaviourEnum::DO_NOTHING->value => 30,
50
            PirateBehaviourEnum::CALL_FOR_SUPPORT->value => 20
51
        ],
52
        PirateReactionTriggerEnum::ON_TRACTOR->value => [
53
            PirateBehaviourEnum::RAGE->value => 50,
54
            PirateBehaviourEnum::CALL_FOR_SUPPORT->value => 50,
55
            PirateBehaviourEnum::DO_NOTHING->value => 20
56
        ],
57
        PirateReactionTriggerEnum::ON_BEAM->value => [
58
            PirateBehaviourEnum::RAGE->value => 50,
59
            PirateBehaviourEnum::CALL_FOR_SUPPORT->value => 50,
60
            PirateBehaviourEnum::DO_NOTHING->value => 10
61
        ],
62
    ];
63
64
    private PirateLoggerInterface $logger;
65
66
    /** @param array<int, PirateBehaviourInterface> $behaviours */
67
    public function __construct(
68
        private ShipWrapperFactoryInterface $shipWrapperFactory,
69
        private ReloadMinimalEpsInterface $reloadMinimalEps,
70
        private PirateWrathManagerInterface $pirateWrathManager,
71
        private StuRandom $stuRandom,
72
        LoggerUtilFactoryInterface $loggerUtilFactory,
73
        private array $behaviours
74
    ) {
75
        $this->logger = $loggerUtilFactory->getPirateLogger();
76
    }
77
78
    public function checkForPirateReaction(
79
        ShipInterface $target,
80
        PirateReactionTriggerEnum $reactionTrigger,
81
        ShipInterface $triggerShip
82
    ): bool {
83
84
        $targetFleet = $target->getFleet();
85
        if (
86
            $targetFleet === null
87
            || $targetFleet->getUser()->getId() !== UserEnum::USER_NPC_KAZON
88
        ) {
89
            return false;
90
        }
91
92
        $this->react(
93
            $targetFleet,
94
            $reactionTrigger,
95
            $triggerShip
96
        );
97
98
        return true;
99
    }
100
101
    public function react(FleetInterface $fleet, PirateReactionTriggerEnum $reactionTrigger, ShipInterface $triggerShip): void
102
    {
103
        $this->pirateWrathManager->increaseWrath($triggerShip->getUser(), $reactionTrigger);
104
105
        // check if fleet already defeated
106
        if ($fleet->getShips()->isEmpty()) {
107
            return;
108
        }
109
110
        $behaviourType = $this->getRandomBehaviourType($reactionTrigger);
111
        $this->logger->log(sprintf(
112
            'pirateFleetId %d reacts on %s from "%s" (%d) with %s',
113
            $fleet->getId(),
114
            $reactionTrigger->name,
0 ignored issues
show
Bug introduced by
The property name does not seem to exist on Stu\Lib\Pirate\PirateReactionTriggerEnum.
Loading history...
115
            $triggerShip->getName(),
116
            $triggerShip->getId(),
117
            $behaviourType->name
0 ignored issues
show
Bug introduced by
The property name does not seem to exist on Stu\Lib\Pirate\PirateBehaviourEnum.
Loading history...
118
        ));
119
120
        if ($behaviourType === PirateBehaviourEnum::DO_NOTHING) {
121
            return;
122
        }
123
124
        $fleetWrapper = $this->shipWrapperFactory->wrapFleet($fleet);
125
126
        $alternativeBehaviour = $this->action($behaviourType, $fleetWrapper, $triggerShip);
127
        if (
128
            $reactionTrigger->triggerAlternativeReaction()
129
            &&  $alternativeBehaviour !== null
130
        ) {
131
            $this->logger->log(sprintf(
132
                'pirateFleetId %d does alternative behaviour %s',
133
                $fleet->getId(),
134
                $alternativeBehaviour->name
135
            ));
136
            $this->action($alternativeBehaviour, $fleetWrapper, $triggerShip);
137
        }
138
139
        if ($reactionTrigger === PirateReactionTriggerEnum::ON_ATTACK) {
140
            $this->action(PirateBehaviourEnum::GO_ALERT_RED, $fleetWrapper, null);
141
        }
142
143
        $this->action(PirateBehaviourEnum::DEACTIVATE_SHIELDS, $fleetWrapper, null);
144
    }
145
146
    private function getRandomBehaviourType(PirateReactionTriggerEnum $reactionTrigger): PirateBehaviourEnum
147
    {
148
        $value = $this->stuRandom->randomOfProbabilities(self::REACTION_PROBABILITIES[$reactionTrigger->value]);
149
150
        return PirateBehaviourEnum::from($value);
151
    }
152
153
    private function action(PirateBehaviourEnum $behaviour, FleetWrapperInterface $fleetWrapper, ?ShipInterface $triggerShip): ?PirateBehaviourEnum
154
    {
155
        $alternativeBehaviour = $this->behaviours[$behaviour->value]->action(
156
            $fleetWrapper,
157
            $this,
158
            $triggerShip
159
        );
160
161
        $this->reloadMinimalEps->reload($fleetWrapper);
162
163
        return $alternativeBehaviour;
164
    }
165
}
166