Passed
Push — dev ( 8522e6...9faab9 )
by Janko
41:38 queued 14:55
created

SearchFriendBehaviour   A

Complexity

Total Complexity 4

Size/Duplication

Total Lines 50
Duplicated Lines 0 %

Test Coverage

Coverage 0%

Importance

Changes 2
Bugs 1 Features 0
Metric Value
eloc 23
c 2
b 1
f 0
dl 0
loc 50
ccs 0
cts 25
cp 0
rs 10
wmc 4

2 Methods

Rating   Name   Duplication   Size   Complexity  
A action() 0 34 3
A __construct() 0 10 1
1
<?php
2
3
namespace Stu\Lib\Pirate\Behaviour;
4
5
use Stu\Module\Logging\LoggerUtilFactoryInterface;
6
use Stu\Module\Ship\Lib\FleetWrapperInterface;
7
use Stu\Lib\Pirate\Component\PirateNavigationInterface;
8
use Stu\Lib\Pirate\PirateBehaviourEnum;
9
use Stu\Lib\Pirate\PirateReactionInterface;
10
use Stu\Lib\Pirate\PirateReactionTriggerEnum;
11
use Stu\Module\Logging\PirateLoggerInterface;
12
use Stu\Module\Ship\Lib\Battle\FightLibInterface;
13
use Stu\Orm\Entity\ShipInterface;
14
use Stu\Orm\Repository\ShipRepositoryInterface;
15
16
class SearchFriendBehaviour implements PirateBehaviourInterface
17
{
18
    private PirateLoggerInterface $logger;
19
20
    public function __construct(
21
        private ShipRepositoryInterface $shipRepository,
22
        private PirateNavigationInterface $pirateNavigation,
23
        private FightLibInterface $fightLib,
24
        LoggerUtilFactoryInterface $loggerUtilFactory
25
    ) {
26
        $this->shipRepository = $shipRepository;
27
        $this->pirateNavigation = $pirateNavigation;
28
29
        $this->logger = $loggerUtilFactory->getPirateLogger();
30
    }
31
32
    public function action(FleetWrapperInterface $fleet, PirateReactionInterface $pirateReaction): ?PirateBehaviourEnum
33
    {
34
        $leadWrapper = $fleet->getLeadWrapper();
35
        $leadShip = $leadWrapper->get();
36
37
        $friends = $this->shipRepository->getPirateFriends($leadShip);
38
39
        $this->logger->logf('    number of friends in reach: %d', count($friends));
40
41
        if (empty($friends)) {
42
            return PirateBehaviourEnum::HIDE;
43
        }
44
45
        usort(
46
            $friends,
47
            fn (ShipInterface $a, ShipInterface $b) =>
48
            $this->fightLib->calculateHealthPercentage($a) -  $this->fightLib->calculateHealthPercentage($b)
49
        );
50
51
        $weakestFriend = current($friends);
52
53
        $this->logger->logf('    navigating to weakest friend at %s', $weakestFriend->getSectorString());
54
55
        if ($this->pirateNavigation->navigateToTarget($fleet, $weakestFriend->getCurrentMapField())) {
56
57
            $this->logger->log('    reached weakest friend, now raging');
58
59
            $pirateReaction->react(
60
                $fleet->get(),
61
                PirateReactionTriggerEnum::ON_RAGE
62
            );
63
        }
64
65
        return null;
66
    }
67
}
68