Passed
Push — dev ( 27fd35...b446a3 )
by Janko
48:37 queued 24:30
created

PirateReaction::react()   B

Complexity

Conditions 6
Paths 6

Size

Total Lines 41
Code Lines 24

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 42

Importance

Changes 4
Bugs 0 Features 0
Metric Value
cc 6
eloc 24
c 4
b 0
f 0
nc 6
nop 3
dl 0
loc 41
ccs 0
cts 26
cp 0
crap 42
rs 8.9137
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 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
            $behaviourType->name
0 ignored issues
show
Bug introduced by
The property name does not seem to exist on Stu\Lib\Pirate\PirateBehaviourEnum.
Loading history...
116
        ));
117
118
        if ($behaviourType === PirateBehaviourEnum::DO_NOTHING) {
119
            return;
120
        }
121
122
        $fleetWrapper = $this->shipWrapperFactory->wrapFleet($fleet);
123
124
        $alternativeBehaviour = $this->action($behaviourType, $fleetWrapper);
125
        if (
126
            $reactionTrigger->triggerAlternativeReaction()
127
            &&  $alternativeBehaviour !== null
128
        ) {
129
            $this->logger->log(sprintf(
130
                'pirateFleetId %d does alternative behaviour %s',
131
                $fleet->getId(),
132
                $alternativeBehaviour->name
133
            ));
134
            $this->action($alternativeBehaviour, $fleetWrapper);
135
        }
136
137
        if ($reactionTrigger === PirateReactionTriggerEnum::ON_ATTACK) {
138
            $this->action(PirateBehaviourEnum::GO_ALERT_RED, $fleetWrapper);
139
        }
140
141
        $this->action(PirateBehaviourEnum::DEACTIVATE_SHIELDS, $fleetWrapper);
142
    }
143
144
    private function getRandomBehaviourType(PirateReactionTriggerEnum $reactionTrigger): PirateBehaviourEnum
145
    {
146
        $value = $this->stuRandom->randomOfProbabilities(self::REACTION_PROBABILITIES[$reactionTrigger->value]);
147
148
        return PirateBehaviourEnum::from($value);
149
    }
150
151
    private function action(PirateBehaviourEnum $behaviour, FleetWrapperInterface $fleetWrapper): ?PirateBehaviourEnum
152
    {
153
        $alternativeBehaviour = $this->behaviours[$behaviour->value]->action($fleetWrapper, $this);
154
155
        $this->reloadMinimalEps->reload($fleetWrapper);
156
157
        return $alternativeBehaviour;
158
    }
159
}
160