Issues (8)

src/Player/Player.php (1 issue)

1
<?php
2
3
declare(strict_types=1);
4
5
namespace AardsGerds\Game\Player;
6
7
use AardsGerds\Game\Build\Attribute\AttributePoints;
8
use AardsGerds\Game\Build\Attribute\Etherum;
9
use AardsGerds\Game\Build\Attribute\Health;
10
use AardsGerds\Game\Build\Attribute\Initiative;
11
use AardsGerds\Game\Build\Attribute\Strength;
12
use AardsGerds\Game\Build\Experience;
13
use AardsGerds\Game\Build\Level;
14
use AardsGerds\Game\Build\LevelProgress;
15
use AardsGerds\Game\Build\Talent\SecretKnowledge\Ascension;
16
use AardsGerds\Game\Build\Talent\TalentCollection;
17
use AardsGerds\Game\Build\Talent\TalentPoints;
18
use AardsGerds\Game\Build\Talent\WeaponMastery\ShortSword\Novice\Slash;
19
use AardsGerds\Game\Build\Talent\WeaponMastery\WeaponMastery;
20
use AardsGerds\Game\Build\Talent\WeaponMastery\WeaponMasteryLevel;
21
use AardsGerds\Game\Entity\Corruption;
22
use AardsGerds\Game\Entity\Entity;
23
use AardsGerds\Game\Event\Story\FirstChapter\MercenaryCamp\MercenaryCampVisitEvent;
24
use AardsGerds\Game\Event\VisitEvent;
25
use AardsGerds\Game\Inventory\Alchemy\Potion\HealthPotion;
26
use AardsGerds\Game\Inventory\Inventory;
27
use AardsGerds\Game\Inventory\Weapon\ShortSword\RustyShortSword;
28
use AardsGerds\Game\Inventory\Weapon\Weapon;
29
use AardsGerds\Game\Shared\IntegerValueException;
30
31
final class Player extends Entity
32
{
33 4
    public function __construct(
34
        string $name,
35
        Health $health,
36
        Etherum $etherum,
37
        Strength $strength,
38
        Initiative $initiative,
39
        TalentCollection $talentCollection,
40
        Inventory $inventory,
41
        ?Weapon $weapon,
42
        ?Corruption $corruption,
43
        private LevelProgress $levelProgress,
44
        private Health $maximumHealth,
45
        private AttributePoints $attributePoints,
46
        private TalentPoints $talentPoints,
47
        private VisitEvent $checkpoint,
48
    ) {
49 4
        parent::__construct(
50 4
            $name,
51
            $health,
52
            $etherum,
53
            $strength,
54
            $initiative,
55
            $talentCollection,
56
            $inventory,
57
            $weapon,
58
            $corruption,
59
        );
60 4
    }
61
62 3
    public static function new(string $name): self
63
    {
64 3
        return new self(
65 3
            $name,
66 3
            new Health(100),
67 3
            new Etherum(1),
68 3
            new Strength(5),
69 3
            new Initiative(10),
70 3
            new TalentCollection([
71 3
                WeaponMastery::shortSword(WeaponMasteryLevel::novice()),
72 3
                new Slash(),
73
            ]),
74 3
            new Inventory([new HealthPotion(), new HealthPotion()]),
75 3
            new RustyShortSword(),
76 3
            null,
77 3
            new LevelProgress(
78 3
                new Level(1),
79 3
                new Experience(0),
80
            ),
81 3
            new Health(100),
82 3
            new AttributePoints(0),
83 3
            new TalentPoints(0),
84 3
            new MercenaryCampVisitEvent(),
85
        );
86
    }
87
88 1
    public function getLevelProgress(): LevelProgress
89
    {
90 1
        return $this->levelProgress;
91
    }
92
93
    public function increaseExperience(Experience $experience, PlayerAction $playerAction): void
94
    {
95
        $this->levelProgress->increase($experience, $this, $playerAction);
96
    }
97
98 1
    public function getMaximumHealth(): Health
99
    {
100 1
        return $this->maximumHealth;
101
    }
102
103 1
    public function getAttributePoints(): AttributePoints
104
    {
105 1
        return $this->attributePoints;
106
    }
107
108 1
    public function getTalentPoints(): TalentPoints
109
    {
110 1
        return $this->talentPoints;
111
    }
112
113 1
    public function getCheckpoint(): VisitEvent
114
    {
115 1
        return $this->checkpoint;
116
    }
117
118
    public function setCheckpoint(VisitEvent $checkpoint): void
119
    {
120
        $this->checkpoint = $checkpoint;
121
    }
122
123 1
    public function heal(Health $health): void
124
    {
125 1
        $this->health->increaseBy($health);
126
127 1
        if ($this->health->isGreaterThan($this->maximumHealth)) {
128 1
            $this->healCompletely();
129
        }
130 1
    }
131
132 1
    public function healCompletely(): void
133
    {
134 1
        $this->health->replaceWith($this->maximumHealth);
135 1
    }
136
137
    /**
138
     * @throws PlayerException
139
     */
140 4
    public function increaseEtherum(Etherum $etherum): void
141
    {
142 4
        $this->etherum->increaseBy($etherum);
143
144 4
        $playerAscension = $this->talentCollection->findSecretKnowledge()?->getAscension()
145 1
            ?? throw PlayerException::etherumOverdose();
146
147 3
        $corruptionBoundary = $this->calculateCorruptionBoundary();
148
149 3
        if ($this->etherum->isGreaterThanOrEqual($corruptionBoundary)) {
150 3
            if ($this->corruption !== null) {
151
                try {
152
                    $this->corruption->increment();
153
                } catch (IntegerValueException) {}
0 ignored issues
show
Coding Style Comprehensibility introduced by
Consider adding a comment why this CATCH block is empty.
Loading history...
154
            }
155
156 3
            if ($playerAscension->isLowerThan(Ascension::sixthAscension())) {
157 1
                throw PlayerException::etherumOverdose();
158
            }
159
160 2
            $this->corruption = Corruption::low();
161
        }
162 2
    }
163
}
164