1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
namespace Zurbaev\Achievements; |
4
|
|
|
|
5
|
|
|
class AchievementCriteria |
6
|
|
|
{ |
7
|
|
|
/** |
8
|
|
|
* @var array |
9
|
|
|
*/ |
10
|
|
|
protected $data = []; |
11
|
|
|
|
12
|
|
|
/** |
13
|
|
|
* @var AchievementCriteriaProgress |
14
|
|
|
*/ |
15
|
|
|
protected $progress; |
16
|
|
|
|
17
|
|
|
/** |
18
|
|
|
* AchievementCriteria constructor. |
19
|
|
|
* |
20
|
|
|
* @param array $data |
21
|
|
|
*/ |
22
|
|
|
public function __construct(array $data) |
23
|
|
|
{ |
24
|
|
|
$this->data = $data; |
25
|
|
|
} |
26
|
|
|
|
27
|
|
|
/** |
28
|
|
|
* Criteria ID. |
29
|
|
|
* |
30
|
|
|
* @return mixed|null |
31
|
|
|
*/ |
32
|
|
|
public function id() |
33
|
|
|
{ |
34
|
|
|
return $this->data['id'] ?? null; |
35
|
|
|
} |
36
|
|
|
|
37
|
|
|
/** |
38
|
|
|
* Achievement ID. |
39
|
|
|
* |
40
|
|
|
* @return mixed|null |
41
|
|
|
*/ |
42
|
|
|
public function achievementId() |
43
|
|
|
{ |
44
|
|
|
return $this->data['achievement_id'] ?? null; |
45
|
|
|
} |
46
|
|
|
|
47
|
|
|
/** |
48
|
|
|
* Criteria type. |
49
|
|
|
* |
50
|
|
|
* @return string|null |
51
|
|
|
*/ |
52
|
|
|
public function type() |
53
|
|
|
{ |
54
|
|
|
return $this->data['type'] ?? null; |
55
|
|
|
} |
56
|
|
|
|
57
|
|
|
/** |
58
|
|
|
* Criteria requirements. |
59
|
|
|
* |
60
|
|
|
* @return array |
61
|
|
|
*/ |
62
|
|
View Code Duplication |
public function requirements(): array |
|
|
|
|
63
|
|
|
{ |
64
|
|
|
if (!isset($this->data['requirements']) || !is_array($this->data['requirements'])) { |
65
|
|
|
return []; |
66
|
|
|
} |
67
|
|
|
|
68
|
|
|
return $this->data['requirements']; |
69
|
|
|
} |
70
|
|
|
|
71
|
|
|
/** |
72
|
|
|
* Max criteria value. |
73
|
|
|
* |
74
|
|
|
* @return int |
75
|
|
|
*/ |
76
|
|
|
public function maxValue(): int |
77
|
|
|
{ |
78
|
|
|
return intval($this->data['max_value'] ?? 0); |
79
|
|
|
} |
80
|
|
|
|
81
|
|
|
/** |
82
|
|
|
* Get single requirement by name. |
83
|
|
|
* |
84
|
|
|
* @param string $requirement |
85
|
|
|
* @param mixed $default = null |
86
|
|
|
* |
87
|
|
|
* @return mixed|null |
88
|
|
|
*/ |
89
|
|
|
public function requirement(string $requirement, $default = null) |
90
|
|
|
{ |
91
|
|
|
return $this->requirements()[$requirement] ?? $default; |
92
|
|
|
} |
93
|
|
|
|
94
|
|
|
/** |
95
|
|
|
* Determines if criteria has given requirement. |
96
|
|
|
* |
97
|
|
|
* @param string $requirement |
98
|
|
|
* |
99
|
|
|
* @return bool |
100
|
|
|
*/ |
101
|
|
|
public function hasRequirement(string $requirement): bool |
102
|
|
|
{ |
103
|
|
|
return isset($this->requirements()[$requirement]); |
104
|
|
|
} |
105
|
|
|
|
106
|
|
|
/** |
107
|
|
|
* Criteria progress. |
108
|
|
|
* |
109
|
|
|
* @return AchievementCriteriaProgress |
110
|
|
|
*/ |
111
|
|
|
public function progress(): AchievementCriteriaProgress |
112
|
|
|
{ |
113
|
|
|
if (!is_null($this->progress)) { |
114
|
|
|
return $this->progress; |
115
|
|
|
} |
116
|
|
|
|
117
|
|
|
return $this->progress = new AchievementCriteriaProgress( |
118
|
|
|
$this->data['progress']['value'] ?? 0, |
119
|
|
|
$this->data['progress']['changed'] ?? false, |
120
|
|
|
$this->data['progress']['completed'] ?? false, |
121
|
|
|
$this->data['progress']['data'] ?? [] |
122
|
|
|
); |
123
|
|
|
} |
124
|
|
|
|
125
|
|
|
/** |
126
|
|
|
* Determines if criteria has previously stored progress. |
127
|
|
|
* |
128
|
|
|
* @return bool |
129
|
|
|
*/ |
130
|
|
|
public function hasProgress(): bool |
131
|
|
|
{ |
132
|
|
|
return !empty($this->data['progress']); |
133
|
|
|
} |
134
|
|
|
|
135
|
|
|
/** |
136
|
|
|
* Determines if criteria was already completed. |
137
|
|
|
* |
138
|
|
|
* @return bool |
139
|
|
|
*/ |
140
|
|
|
public function completed(): bool |
141
|
|
|
{ |
142
|
|
|
return boolval($this->progress()->completed ?? false); |
143
|
|
|
} |
144
|
|
|
} |
145
|
|
|
|
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.
You can also find more detailed suggestions in the “Code” section of your repository.