|
1
|
|
|
<?php |
|
2
|
|
|
|
|
3
|
|
|
declare(strict_types=1); |
|
4
|
|
|
|
|
5
|
|
|
namespace AardsGerds\Game\Infrastructure\Persistence; |
|
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\SecretKnowledge\SecretKnowledge; |
|
17
|
|
|
use AardsGerds\Game\Build\Talent\Talent; |
|
18
|
|
|
use AardsGerds\Game\Build\Talent\TalentCollection; |
|
19
|
|
|
use AardsGerds\Game\Build\Talent\TalentPoints; |
|
20
|
|
|
use AardsGerds\Game\Build\Talent\WeaponMastery\WeaponMastery; |
|
21
|
|
|
use AardsGerds\Game\Build\Talent\WeaponMastery\WeaponMasteryLevel; |
|
22
|
|
|
use AardsGerds\Game\Entity\Corruption; |
|
23
|
|
|
use AardsGerds\Game\Inventory\Inventory; |
|
24
|
|
|
use AardsGerds\Game\Inventory\InventoryItem; |
|
25
|
|
|
use AardsGerds\Game\Inventory\Weapon\RebredirWeapon; |
|
26
|
|
|
use AardsGerds\Game\Inventory\Weapon\Weapon; |
|
27
|
|
|
use AardsGerds\Game\Inventory\Weapon\WeaponType; |
|
28
|
|
|
use AardsGerds\Game\Player\Player; |
|
29
|
|
|
use function Lambdish\Phunctional\map; |
|
30
|
|
|
|
|
31
|
|
|
final class DenormalizePlayer |
|
32
|
|
|
{ |
|
33
|
1 |
|
public function __invoke(array $data): Player |
|
34
|
|
|
{ |
|
35
|
1 |
|
return new Player( |
|
36
|
1 |
|
$data['name'], |
|
37
|
1 |
|
new Health($data['health']), |
|
38
|
1 |
|
new Etherum($data['etherum']), |
|
39
|
1 |
|
new Strength($data['strength']), |
|
40
|
1 |
|
new Initiative($data['initiative']), |
|
41
|
1 |
|
self::denormalizeTalents($data['talents']), |
|
42
|
1 |
|
self::denormalizeInventory($data['inventory']), |
|
43
|
1 |
|
$data['weapon'] !== null ? self::denormalizeWeapon($data['weapon']) : null, |
|
44
|
1 |
|
$data['corruption'] !== null ? new Corruption($data['corruption']) : null, |
|
45
|
1 |
|
new LevelProgress( |
|
46
|
1 |
|
new Level($data['levelProgress']['level']), |
|
47
|
1 |
|
new Experience($data['levelProgress']['currentExperience']), |
|
48
|
|
|
), |
|
49
|
1 |
|
new Health($data['maximumHealth']), |
|
50
|
1 |
|
new AttributePoints($data['attributePoints']), |
|
51
|
1 |
|
new TalentPoints($data['talentPoints']), |
|
52
|
1 |
|
new $data['checkpoint']['className'](), |
|
53
|
|
|
); |
|
54
|
|
|
} |
|
55
|
|
|
|
|
56
|
1 |
|
private static function denormalizeTalents(array $data): TalentCollection |
|
57
|
|
|
{ |
|
58
|
1 |
|
return new TalentCollection(map( |
|
59
|
1 |
|
static function(array $talent): Talent { |
|
60
|
1 |
|
$reflection = new \ReflectionClass($talent['className']); |
|
61
|
|
|
|
|
62
|
1 |
|
$talent = match ($talent['className']) { |
|
63
|
|
|
WeaponMastery::class => |
|
64
|
1 |
|
$reflection->newInstance( |
|
65
|
1 |
|
new WeaponType($talent['type']), |
|
66
|
1 |
|
new WeaponMasteryLevel($talent['level']), |
|
67
|
|
|
), |
|
68
|
|
|
SecretKnowledge::class => |
|
69
|
1 |
|
$reflection->newInstance(new Ascension($talent['ascension'])), |
|
70
|
1 |
|
default => $reflection->newInstance(), |
|
71
|
|
|
}; |
|
72
|
|
|
|
|
73
|
1 |
|
assert($talent instanceof Talent); |
|
74
|
|
|
|
|
75
|
1 |
|
return $talent; |
|
76
|
1 |
|
}, |
|
77
|
1 |
|
$data, |
|
78
|
|
|
)); |
|
79
|
|
|
} |
|
80
|
|
|
|
|
81
|
1 |
|
private static function denormalizeWeapon(array $data): Weapon |
|
82
|
|
|
{ |
|
83
|
1 |
|
$reflection = new \ReflectionClass($data['className']); |
|
84
|
|
|
|
|
85
|
1 |
|
$weapon = match (true) { |
|
86
|
1 |
|
$reflection->isSubclassOf(RebredirWeapon::class) => |
|
87
|
1 |
|
$reflection->newInstance(new Etherum($data['etherumLoad'])), |
|
88
|
1 |
|
default => $reflection->newInstance(), |
|
89
|
|
|
}; |
|
90
|
|
|
|
|
91
|
1 |
|
assert($weapon instanceof Weapon); |
|
92
|
|
|
|
|
93
|
1 |
|
return $weapon; |
|
94
|
|
|
} |
|
95
|
|
|
|
|
96
|
1 |
|
private static function denormalizeInventory(array $data): Inventory |
|
97
|
|
|
{ |
|
98
|
1 |
|
return new Inventory(map( |
|
99
|
1 |
|
static function(array $item): InventoryItem { |
|
100
|
1 |
|
$reflection = new \ReflectionClass($item['className']); |
|
101
|
|
|
|
|
102
|
1 |
|
$item = match (true) { |
|
103
|
1 |
|
$reflection->isSubclassOf(Weapon::class) => self::denormalizeWeapon($item), |
|
104
|
1 |
|
default => $reflection->newInstance(), |
|
105
|
|
|
}; |
|
106
|
|
|
|
|
107
|
1 |
|
assert($item instanceof InventoryItem); |
|
108
|
|
|
|
|
109
|
1 |
|
return $item; |
|
110
|
1 |
|
}, |
|
111
|
1 |
|
$data, |
|
112
|
|
|
)); |
|
113
|
|
|
} |
|
114
|
|
|
} |
|
115
|
|
|
|