Passed
Push — dev ( 25d289...645e0b )
by Janko
25:47
created

PirateReaction::checkForPirateReaction()   A

Complexity

Conditions 3
Paths 2

Size

Total Lines 21
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 12

Importance

Changes 0
Metric Value
cc 3
eloc 10
c 0
b 0
f 0
nc 2
nop 3
dl 0
loc 21
ccs 0
cts 11
cp 0
crap 12
rs 9.9332
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
    ];
53
54
    private PirateLoggerInterface $logger;
55
56
    /** @param array<int, PirateBehaviourInterface> $behaviours */
57
    public function __construct(
58
        private ShipWrapperFactoryInterface $shipWrapperFactory,
59
        private ReloadMinimalEpsInterface $reloadMinimalEps,
60
        private PirateWrathManagerInterface $pirateWrathManager,
61
        private StuRandom $stuRandom,
62
        LoggerUtilFactoryInterface $loggerUtilFactory,
63
        private array $behaviours
64
    ) {
65
        $this->logger = $loggerUtilFactory->getPirateLogger();
66
    }
67
68
    public function checkForPirateReaction(
69
        ShipInterface $target,
70
        PirateReactionTriggerEnum $reactionTrigger,
71
        ShipInterface $triggerShip
72
    ): bool {
73
74
        $targetFleet = $target->getFleet();
75
        if (
76
            $targetFleet === null
77
            || $targetFleet->getUser()->getId() !== UserEnum::USER_NPC_KAZON
78
        ) {
79
            return false;
80
        }
81
82
        $this->react(
83
            $targetFleet,
84
            PirateReactionTriggerEnum::ON_SCAN,
85
            $triggerShip
86
        );
87
88
        return true;
89
    }
90
91
    public function react(FleetInterface $fleet, PirateReactionTriggerEnum $reactionTrigger, ShipInterface $triggerShip): void
92
    {
93
        // check if fleet already defeated
94
        if ($fleet->getShips()->isEmpty()) {
95
            return;
96
        }
97
98
        $this->pirateWrathManager->increaseWrath($triggerShip->getUser(), $reactionTrigger);
99
100
        $behaviourType = $this->getRandomBehaviourType($reactionTrigger);
101
        $this->logger->log(sprintf(
102
            'pirateFleetId %d reacts on %s with %s',
103
            $fleet->getId(),
104
            $reactionTrigger->name,
0 ignored issues
show
Bug introduced by
The property name does not seem to exist on Stu\Lib\Pirate\PirateReactionTriggerEnum.
Loading history...
105
            $behaviourType->name
0 ignored issues
show
Bug introduced by
The property name does not seem to exist on Stu\Lib\Pirate\PirateBehaviourEnum.
Loading history...
106
        ));
107
108
        if ($behaviourType === PirateBehaviourEnum::DO_NOTHING) {
109
            return;
110
        }
111
112
        $fleetWrapper = $this->shipWrapperFactory->wrapFleet($fleet);
113
114
        $alternativeBehaviour = $this->action($behaviourType, $fleetWrapper);
115
        if ($alternativeBehaviour !== null) {
116
            $this->logger->log(sprintf(
117
                'pirateFleetId %d does alternative behaviour %s',
118
                $fleet->getId(),
119
                $alternativeBehaviour->name
120
            ));
121
            $this->action($alternativeBehaviour, $fleetWrapper);
122
        }
123
124
        if ($reactionTrigger === PirateReactionTriggerEnum::ON_ATTACK) {
125
            $this->action(PirateBehaviourEnum::GO_ALERT_RED, $fleetWrapper);
126
        }
127
128
        $this->action(PirateBehaviourEnum::DEACTIVATE_SHIELDS, $fleetWrapper);
129
    }
130
131
    private function getRandomBehaviourType(PirateReactionTriggerEnum $reactionTrigger): PirateBehaviourEnum
132
    {
133
        $value = $this->stuRandom->randomOfProbabilities(self::REACTION_PROBABILITIES[$reactionTrigger->value]);
134
135
        return PirateBehaviourEnum::from($value);
136
    }
137
138
    private function action(PirateBehaviourEnum $behaviour, FleetWrapperInterface $fleetWrapper): ?PirateBehaviourEnum
139
    {
140
        $alternativeBehaviour = $this->behaviours[$behaviour->value]->action($fleetWrapper, $this);
141
142
        $this->reloadMinimalEps->reload($fleetWrapper);
143
144
        return $alternativeBehaviour;
145
    }
146
}
147