Passed
Push — dev ( 83f1db...78efa3 )
by Janko
43:47 queued 20:47
created

SearchFriendBehaviour::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 11
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 3
nc 1
nop 5
dl 0
loc 11
ccs 0
cts 4
cp 0
crap 2
rs 10
c 1
b 0
f 0
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 PirateReactionInterface $pirateReaction,
24
        private FightLibInterface $fightLib,
25
        LoggerUtilFactoryInterface $loggerUtilFactory
26
    ) {
27
        $this->shipRepository = $shipRepository;
28
        $this->pirateNavigation = $pirateNavigation;
29
30
        $this->logger = $loggerUtilFactory->getPirateLogger();
31
    }
32
33
    public function action(FleetWrapperInterface $fleet, PirateReactionInterface $pirateReaction): ?PirateBehaviourEnum
34
    {
35
        $leadWrapper = $fleet->getLeadWrapper();
36
        $leadShip = $leadWrapper->get();
37
38
        $friends = $this->shipRepository->getPirateFriends($leadShip);
39
40
        $this->logger->logf('    number of friends in reach: %d', count($friends));
41
42
        if (empty($friends)) {
43
            return PirateBehaviourEnum::HIDE;
44
        }
45
46
        usort(
47
            $friends,
48
            fn (ShipInterface $a, ShipInterface $b) =>
49
            $this->fightLib->calculateHealthPercentage($a) -  $this->fightLib->calculateHealthPercentage($b)
50
        );
51
52
        $weakestFriend = current($friends);
53
54
        $this->logger->logf('    navigating to weakest friend at %s', $weakestFriend->getSectorString());
55
56
        if ($this->pirateNavigation->navigateToTarget($fleet, $weakestFriend->getCurrentMapField())) {
57
58
            $this->logger->log('    reached weakest friend, now raging');
59
60
            $this->pirateReaction->react(
61
                $fleet->get(),
62
                PirateReactionTriggerEnum::ON_RAGE
63
            );
64
        }
65
66
        return null;
67
    }
68
}
69