Skip to content

Commit ca3a847

Browse files
committed
introduce crew skills and enhancement
1 parent 6ff3155 commit ca3a847

File tree

94 files changed

+2345
-315
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

94 files changed

+2345
-315
lines changed

phpstan-baseline.neon

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -747,6 +747,12 @@ parameters:
747747
count: 1
748748
path: src/Module/Crew/Lib/CrewCreator.php
749749

750+
-
751+
message: '#^Cannot call method getExpertise\(\) on Stu\\Orm\\Entity\\CrewSkillInterface\|null\.$#'
752+
identifier: method.nonObject
753+
count: 2
754+
path: src/Module/Crew/Lib/CrewCreator.php
755+
750756
-
751757
message: '#^Cannot call method getId\(\) on Stu\\Orm\\Entity\\ShipRumpRoleInterface\|null\.$#'
752758
identifier: method.nonObject

src/Component/Crew/CrewEnum.php

Lines changed: 0 additions & 63 deletions
This file was deleted.
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Stu\Component\Crew;
6+
7+
enum CrewGenderEnum: int
8+
{
9+
case MALE = 1;
10+
case FEMALE = 2;
11+
12+
public function getShort(): string
13+
{
14+
return match ($this) {
15+
self::MALE => "m",
16+
self::FEMALE => "w"
17+
};
18+
}
19+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Stu\Component\Crew;
6+
7+
enum CrewPositionEnum: int
8+
{
9+
case COMMAND = 1;
10+
case SECURITY = 2;
11+
case SCIENCE = 3;
12+
case TECHNICAL = 4;
13+
case NAVIGATION = 5;
14+
case CREWMAN = 6;
15+
case CAPTAIN = 7;
16+
17+
public function getDescription(): string
18+
{
19+
return match ($this) {
20+
self::CAPTAIN => "Captain",
21+
self::COMMAND => "Commander",
22+
self::SECURITY => "Sicherheit",
23+
self::SCIENCE => "Wissenschaftler",
24+
self::TECHNICAL => "Ingenieur",
25+
self::NAVIGATION => "Navigator",
26+
self::CREWMAN => "Crewman",
27+
};
28+
}
29+
30+
public function getFightCapability(): int
31+
{
32+
return match ($this) {
33+
self::SECURITY => 20,
34+
self::CAPTAIN => 10,
35+
self::COMMAND => 8,
36+
self::CREWMAN => 6,
37+
self::TECHNICAL => 4,
38+
self::NAVIGATION => 2,
39+
self::SCIENCE => 0
40+
};
41+
}
42+
43+
/** @return array<CrewPositionEnum> */
44+
public static function getOrder(): array
45+
{
46+
return [
47+
self::CAPTAIN,
48+
self::COMMAND,
49+
self::SECURITY,
50+
self::SCIENCE,
51+
self::TECHNICAL,
52+
self::NAVIGATION,
53+
self::CREWMAN
54+
];
55+
}
56+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Stu\Component\Crew\Skill;
6+
7+
use Stu\Module\Control\StuTime;
8+
use Stu\Orm\Entity\CrewSkillInterface;
9+
use Stu\Orm\Entity\SkillEnhancementInterface;
10+
use Stu\Orm\Repository\SkillEnhancementLogRepositoryInterface;
11+
12+
class CreateEnhancementLog
13+
{
14+
public function __construct(
15+
private SkillEnhancementLogRepositoryInterface $skillEnhancementLogRepository,
16+
private StuTime $stuTime
17+
) {}
18+
19+
public function createEnhancementLog(
20+
CrewSkillInterface $crewSkill,
21+
string $spacecraftName,
22+
SkillEnhancementInterface $enhancement,
23+
int $amount,
24+
CrewSkillLevelEnum $oldRank
25+
): void {
26+
27+
$crew = $crewSkill->getCrew();
28+
29+
$log = $this->skillEnhancementLogRepository
30+
->prototype()
31+
->setUser($crew->getUser())
32+
->setEnhancement($enhancement)
33+
->setCrewName($crew->getName())
34+
->setShipName($spacecraftName)
35+
->setCrewId($crew->getId())
36+
->setExpertise($amount)
37+
->setExpertiseSum($crewSkill->getExpertise())
38+
->setPromotion($this->getPromotion($oldRank, $crewSkill->getRank()))
39+
->setTimestamp($this->stuTime->time());
40+
41+
$this->skillEnhancementLogRepository->save($log);
42+
}
43+
44+
private function getPromotion(CrewSkillLevelEnum $oldRank, CrewSkillLevelEnum $newRank): ?string
45+
{
46+
return $oldRank !== $newRank
47+
? sprintf('Beförderung %s -> %s', $oldRank->getDescription(), $newRank->getDescription())
48+
: null;
49+
}
50+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Stu\Component\Crew\Skill;
6+
7+
use Stu\Config\Init;
8+
use Stu\Module\Spacecraft\Lib\SpacecraftWrapperInterface;
9+
use Stu\Orm\Entity\SpacecraftInterface;
10+
11+
abstract class CrewEnhancemenProxy
12+
{
13+
public static function addExpertise(
14+
SpacecraftInterface|SpacecraftWrapperInterface $target,
15+
SkillEnhancementEnum $trigger,
16+
int $percentage = 100
17+
): void {
18+
19+
$crewEnhancement =
20+
Init::getContainer()->get(CrewEnhancementInterface::class);
21+
22+
23+
$crewEnhancement->addExpertise($target, $trigger, $percentage);
24+
}
25+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Stu\Component\Crew\Skill;
6+
7+
use Stu\Module\Spacecraft\Lib\SpacecraftWrapperInterface;
8+
use Stu\Orm\Entity\SpacecraftInterface;
9+
10+
class CrewEnhancement implements CrewEnhancementInterface
11+
{
12+
public function __construct(
13+
private SkillEnhancementCacheInterface $skillEnhancementCache,
14+
private RaiseExpertise $raiseExpertise
15+
) {}
16+
17+
public function addExpertise(
18+
SpacecraftInterface|SpacecraftWrapperInterface $target,
19+
SkillEnhancementEnum $trigger,
20+
int $percentage
21+
): void {
22+
23+
$spacecraft = $target instanceof SpacecraftInterface ? $target : $target->get();
24+
25+
$enhancements = $this->skillEnhancementCache->getSkillEnhancements($trigger);
26+
if ($enhancements === null) {
27+
return;
28+
}
29+
30+
foreach ($spacecraft->getCrewAssignments() as $crewAssignment) {
31+
$position = $crewAssignment->getPosition();
32+
if ($position === null) {
33+
continue;
34+
}
35+
36+
if (!array_key_exists($position->value, $enhancements)) {
37+
continue;
38+
}
39+
40+
$this->raiseExpertise->raiseExpertise(
41+
$crewAssignment->getCrew(),
42+
$spacecraft,
43+
$position,
44+
$enhancements[$position->value],
45+
$percentage
46+
);
47+
}
48+
}
49+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Stu\Component\Crew\Skill;
6+
7+
use Stu\Module\Spacecraft\Lib\SpacecraftWrapperInterface;
8+
use Stu\Orm\Entity\SpacecraftInterface;
9+
10+
interface CrewEnhancementInterface
11+
{
12+
public function addExpertise(
13+
SpacecraftInterface|SpacecraftWrapperInterface $target,
14+
SkillEnhancementEnum $trigger,
15+
int $percentage
16+
): void;
17+
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Stu\Component\Crew\Skill;
6+
7+
enum CrewSkillLevelEnum: string
8+
{
9+
case ADMIRAL = 'ADMIRAL';
10+
case COMMODORE = 'COMMODORE';
11+
case SENIOR_COMMANDER = 'SENIOR_COMMANDER';
12+
case COMMANDER = 'COMMANDER';
13+
case LIEUTENANT_COMMANDER = 'LIEUTENANT_COMMANDER';
14+
case LIEUTENANT = 'LIEUTENANT';
15+
case JUNIOR_LIEUTENANT = 'JUNIOR_LIEUTENANT';
16+
case ENSIGN = 'ENSIGN';
17+
case CADET = 'CADET';
18+
case RECRUIT = 'RECRUIT';
19+
20+
public function getNeededExpertise(): int
21+
{
22+
return match ($this) {
23+
self::ADMIRAL => 100_000,
24+
self::COMMODORE => 50_000,
25+
self::SENIOR_COMMANDER => 20_000,
26+
self::COMMANDER => 10_000,
27+
self::LIEUTENANT_COMMANDER => 5_000,
28+
self::LIEUTENANT => 2_000,
29+
self::JUNIOR_LIEUTENANT => 1_000,
30+
self::ENSIGN => 300,
31+
self::CADET => 100,
32+
self::RECRUIT => 0
33+
};
34+
}
35+
36+
public function getBonusPercentage(): int
37+
{
38+
return match ($this) {
39+
self::ADMIRAL => 25,
40+
self::COMMODORE => 20,
41+
self::SENIOR_COMMANDER => 15,
42+
self::COMMANDER => 12,
43+
self::LIEUTENANT_COMMANDER => 9,
44+
self::LIEUTENANT => 6,
45+
self::JUNIOR_LIEUTENANT => 4,
46+
self::ENSIGN => 2,
47+
self::CADET => 1,
48+
self::RECRUIT => 0
49+
};
50+
}
51+
52+
public function getDescription(): string
53+
{
54+
return match ($this) {
55+
self::ADMIRAL => 'Admiral',
56+
self::COMMODORE => 'Kommodore',
57+
self::SENIOR_COMMANDER => 'Oberkommandant',
58+
self::COMMANDER => 'Kommandant',
59+
self::LIEUTENANT_COMMANDER => 'Oberleutnant',
60+
self::LIEUTENANT => 'Leutnant',
61+
self::JUNIOR_LIEUTENANT => 'Unterleutnant',
62+
self::ENSIGN => 'Fähnrich',
63+
self::CADET => 'Kadett',
64+
self::RECRUIT => 'Rekrut'
65+
};
66+
}
67+
68+
public static function getForExpertise(int $expertise): CrewSkillLevelEnum
69+
{
70+
return match (true) {
71+
$expertise < self::CADET->getNeededExpertise() => self::RECRUIT,
72+
$expertise < self::ENSIGN->getNeededExpertise() => self::CADET,
73+
$expertise < self::JUNIOR_LIEUTENANT->getNeededExpertise() => self::ENSIGN,
74+
$expertise < self::LIEUTENANT->getNeededExpertise() => self::JUNIOR_LIEUTENANT,
75+
$expertise < self::LIEUTENANT_COMMANDER->getNeededExpertise() => self::LIEUTENANT,
76+
$expertise < self::COMMANDER->getNeededExpertise() => self::LIEUTENANT_COMMANDER,
77+
$expertise < self::SENIOR_COMMANDER->getNeededExpertise() => self::COMMANDER,
78+
$expertise < self::COMMODORE->getNeededExpertise() => self::SENIOR_COMMANDER,
79+
$expertise < self::ADMIRAL->getNeededExpertise() => self::COMMODORE,
80+
default => self::ADMIRAL
81+
};
82+
}
83+
}

0 commit comments

Comments
 (0)