1 | <?php |
||||||
2 | /** |
||||||
3 | * Created by Gorlum 30.09.2017 8:28 |
||||||
4 | */ |
||||||
5 | |||||||
6 | namespace Pages\Deprecated; |
||||||
7 | |||||||
8 | use DBAL\db_mysql; |
||||||
9 | use \Exception; |
||||||
0 ignored issues
–
show
|
|||||||
10 | use \SN; |
||||||
0 ignored issues
–
show
The type
\SN was not found. Maybe you did not declare it correctly or list all dependencies?
The issue could also be caused by a filter entry in the build configuration.
If the path has been excluded in your configuration, e.g. filter:
dependency_paths: ["lib/*"]
For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths ![]() |
|||||||
11 | use SnTemplate; |
||||||
12 | use Unit\DBStaticUnit; |
||||||
13 | use \template; |
||||||
0 ignored issues
–
show
The type
\template was not found. Maybe you did not declare it correctly or list all dependencies?
The issue could also be caused by a filter entry in the build configuration.
If the path has been excluded in your configuration, e.g. filter:
dependency_paths: ["lib/*"]
For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths ![]() |
|||||||
14 | |||||||
15 | class PageMercenary { |
||||||
16 | |||||||
17 | /** |
||||||
18 | * @var \classConfig $config |
||||||
19 | */ |
||||||
20 | protected $config; |
||||||
21 | /** |
||||||
22 | * @var \classLocale $lang |
||||||
23 | */ |
||||||
24 | protected $lang; |
||||||
25 | |||||||
26 | /** |
||||||
27 | * @var float[] $sn_powerup_buy_discounts |
||||||
28 | */ |
||||||
29 | protected $sn_powerup_buy_discounts; |
||||||
30 | |||||||
31 | /** |
||||||
32 | * What we purchasing - Plans or Mercenaries? |
||||||
33 | * @var int $mode |
||||||
34 | */ |
||||||
35 | protected $mode = UNIT_MERCENARIES; // Or UNIT_PLANS |
||||||
36 | |||||||
37 | /** |
||||||
38 | * If purchased units are permanent? |
||||||
39 | * @var bool $isUnitsPermanent |
||||||
40 | */ |
||||||
41 | protected $isUnitsPermanent = false; |
||||||
42 | |||||||
43 | /** |
||||||
44 | * Multiplier for Alliance's purchases |
||||||
45 | * |
||||||
46 | * @var float $cost_alliance_multiplier |
||||||
47 | */ |
||||||
48 | protected $cost_alliance_multiplier; |
||||||
49 | |||||||
50 | public function __construct() { |
||||||
51 | global $lang, $sn_powerup_buy_discounts; |
||||||
52 | |||||||
53 | lng_include('mrc_mercenary'); |
||||||
54 | lng_include('infos'); |
||||||
55 | |||||||
56 | $this->config = SN::$config; |
||||||
57 | $this->lang = $lang; |
||||||
58 | $this->sn_powerup_buy_discounts = $sn_powerup_buy_discounts; |
||||||
59 | |||||||
60 | $this->loadParams(); |
||||||
61 | } |
||||||
62 | |||||||
63 | protected function loadParams() { |
||||||
64 | // Getting page mode |
||||||
65 | $this->mode = sys_get_param_int('mode', UNIT_MERCENARIES); |
||||||
66 | $this->mode = in_array($this->mode, array(UNIT_MERCENARIES, UNIT_PLANS)) ? $this->mode : UNIT_MERCENARIES; |
||||||
67 | |||||||
68 | $this->isUnitsPermanent = $this->mode == UNIT_PLANS || !$this->config->empire_mercenary_temporary; |
||||||
69 | $this->cost_alliance_multiplier = min(1, defined('SN_IN_ALLY') && (SN_IN_ALLY === true) && $this->mode == UNIT_PLANS ? $this->config->ali_bonus_members : 1); |
||||||
70 | } |
||||||
71 | |||||||
72 | |||||||
73 | /** |
||||||
74 | * @param array $user |
||||||
75 | */ |
||||||
76 | public function mrc_mercenary_render($user) { |
||||||
77 | $template = SnTemplate::gettemplate('mrc_mercenary_hire'); |
||||||
78 | |||||||
79 | $operation_result = $this->modelMercenaryHire($user); |
||||||
80 | if (!empty($operation_result)) { |
||||||
81 | $template->assign_block_vars('result', $operation_result); |
||||||
82 | } |
||||||
83 | |||||||
84 | $this->fillDiscountTable($template); |
||||||
85 | |||||||
86 | $user_dark_matter = mrc_get_level($user, [], RES_DARK_MATTER); |
||||||
87 | foreach (sn_get_groups($this->mode == UNIT_PLANS ? 'plans' : 'mercenaries') as $mercenary_id) { |
||||||
88 | $mercenary = get_unit_param($mercenary_id); |
||||||
89 | |||||||
90 | $mercenary_level = mrc_get_level($user, [], $mercenary_id, false, true); |
||||||
91 | $mercenary_level_bonus = max(0, mrc_get_level($user, [], $mercenary_id) - $mercenary_level); |
||||||
92 | |||||||
93 | $currentUnitCostDM = 0; |
||||||
94 | if ($this->isUnitsPermanent) { |
||||||
95 | $currentUnitCostDM = eco_get_total_cost($mercenary_id, $mercenary_level); |
||||||
96 | $currentUnitCostDM = $currentUnitCostDM[BUILD_CREATE][RES_DARK_MATTER] * $this->cost_alliance_multiplier; |
||||||
97 | } |
||||||
98 | $nextLevelCostData = eco_get_total_cost($mercenary_id, $mercenary_level + 1); |
||||||
99 | $nextLevelCostDM = $nextLevelCostData[BUILD_CREATE][RES_DARK_MATTER] * $this->cost_alliance_multiplier; |
||||||
100 | |||||||
101 | $mercenary_unit = DBStaticUnit::db_unit_by_location($user['id'], LOC_USER, $user['id'], $mercenary_id); |
||||||
102 | $mercenary_time_start = strtotime($mercenary_unit['unit_time_start']); |
||||||
103 | $mercenary_time_finish = strtotime($mercenary_unit['unit_time_finish']); |
||||||
104 | $unitIsOutdated = $mercenary_time_finish && $mercenary_time_finish >= SN_TIME_NOW; |
||||||
105 | $template->assign_block_vars('officer', array( |
||||||
106 | 'ID' => $mercenary_id, |
||||||
107 | 'NAME' => $this->lang['tech'][$mercenary_id], |
||||||
108 | 'DESCRIPTION' => $this->lang['info'][$mercenary_id]['description'], |
||||||
109 | 'EFFECT' => $this->lang['info'][$mercenary_id]['effect'], |
||||||
110 | 'COST' => $nextLevelCostDM - $currentUnitCostDM, |
||||||
111 | 'COST_TEXT' => prettyNumberStyledCompare($nextLevelCostDM - $currentUnitCostDM, $user_dark_matter), |
||||||
0 ignored issues
–
show
It seems like
$user_dark_matter can also be of type boolean ; however, parameter $compareTo of prettyNumberStyledCompare() does only seem to accept double|integer , maybe add an additional type check?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() |
|||||||
112 | 'LEVEL' => $mercenary_level, |
||||||
113 | 'LEVEL_BONUS' => $mercenary_level_bonus, |
||||||
114 | 'LEVEL_MAX' => $mercenary['max'], |
||||||
115 | 'BONUS' => SnTemplate::tpl_render_unit_bonus_data($mercenary), |
||||||
116 | 'BONUS_TYPE' => $mercenary[P_BONUS_TYPE], |
||||||
117 | 'HIRE_END' => $unitIsOutdated ? date(FMT_DATE_TIME, $mercenary_time_finish) : '', |
||||||
118 | 'HIRE_LEFT_PERCENT' => $unitIsOutdated ? round(($mercenary_time_finish - SN_TIME_NOW) / ($mercenary_time_finish - $mercenary_time_start) * 100, 1) : 0, |
||||||
119 | 'CAN_BUY' => $this->mrc_officer_accessible($user, $mercenary_id), |
||||||
120 | )); |
||||||
121 | |||||||
122 | $this->renderMercenaryLevelsAvail($user_dark_matter, $mercenary_id, $currentUnitCostDM, $template, $mercenary_level, $mercenary['max']); |
||||||
0 ignored issues
–
show
It seems like
$user_dark_matter can also be of type boolean ; however, parameter $user_dark_matter of Pages\Deprecated\PageMer...rMercenaryLevelsAvail() does only seem to accept double , maybe add an additional type check?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() It seems like
$mercenary_level can also be of type boolean and double ; however, parameter $mercenary_level of Pages\Deprecated\PageMer...rMercenaryLevelsAvail() does only seem to accept integer , maybe add an additional type check?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() |
|||||||
123 | |||||||
124 | $this->renderMercenaryReq($user, $mercenary, $template); |
||||||
125 | } |
||||||
126 | |||||||
127 | $template->assign_vars(array( |
||||||
128 | 'PAGE_HEADER' => $this->lang['tech'][$this->mode], |
||||||
129 | 'MODE' => $this->mode, |
||||||
130 | 'IS_PERMANENT' => intval($this->isUnitsPermanent), |
||||||
131 | 'EMPIRE_MERCENARY_TEMPORARY' => $this->config->empire_mercenary_temporary, |
||||||
132 | 'DARK_MATTER' => $user_dark_matter, |
||||||
133 | )); |
||||||
134 | |||||||
135 | SnTemplate::display($template, $this->lang['tech'][$this->mode]); |
||||||
136 | } |
||||||
137 | |||||||
138 | protected function mrc_mercenary_hire($user, $mercenary_id) { |
||||||
139 | if (!in_array($mercenary_id, sn_get_groups($this->mode == UNIT_PLANS ? 'plans' : 'mercenaries'))) { |
||||||
140 | throw new Exception('mrc_msg_error_wrong_mercenary', ERR_ERROR); |
||||||
141 | } |
||||||
142 | |||||||
143 | if (!$this->mrc_officer_accessible($user, $mercenary_id)) { |
||||||
144 | throw new Exception('mrc_msg_error_requirements', ERR_ERROR); |
||||||
145 | } |
||||||
146 | |||||||
147 | $mercenary_level = sys_get_param_int('mercenary_level'); |
||||||
148 | if ($mercenary_level < 0 || $mercenary_level > get_unit_param($mercenary_id, P_MAX_STACK)) { |
||||||
149 | throw new Exception('mrc_msg_error_wrong_level', ERR_ERROR); |
||||||
150 | } |
||||||
151 | |||||||
152 | $mercenary_period = sys_get_param_int('mercenary_period'); |
||||||
153 | if ($mercenary_level && !array_key_exists($mercenary_period, $this->sn_powerup_buy_discounts)) { |
||||||
154 | throw new Exception('mrc_msg_error_wrong_period', ERR_ERROR); |
||||||
155 | } |
||||||
156 | |||||||
157 | db_mysql::db_transaction_start(); |
||||||
158 | |||||||
159 | $mercenary_level_old = mrc_get_level($user, [], $mercenary_id, true, true); |
||||||
160 | if ($this->config->empire_mercenary_temporary && $mercenary_level_old && $mercenary_level) { |
||||||
161 | throw new Exception('mrc_msg_error_already_hired', ERR_ERROR); // Can't hire already hired temp mercenary - dismiss first |
||||||
162 | } elseif ($this->config->empire_mercenary_temporary && !$mercenary_level_old && !$mercenary_level) { |
||||||
163 | throw new Exception('', ERR_NONE); // Can't dismiss (!$mercenary_level) not hired (!$mercenary_level_old) temp mercenary. But no error |
||||||
164 | } |
||||||
165 | |||||||
166 | if ($mercenary_level) { |
||||||
167 | $darkmater_cost = eco_get_total_cost($mercenary_id, $mercenary_level); |
||||||
168 | if (!$this->config->empire_mercenary_temporary && $mercenary_level_old) { |
||||||
169 | $darkmater_cost_old = eco_get_total_cost($mercenary_id, $mercenary_level_old); |
||||||
170 | $darkmater_cost[BUILD_CREATE][RES_DARK_MATTER] -= $darkmater_cost_old[BUILD_CREATE][RES_DARK_MATTER]; |
||||||
171 | } |
||||||
172 | $darkmater_cost = ceil($darkmater_cost[BUILD_CREATE][RES_DARK_MATTER] * $mercenary_period * $this->sn_powerup_buy_discounts[$mercenary_period] / $this->config->empire_mercenary_base_period); |
||||||
173 | } else { |
||||||
174 | $darkmater_cost = 0; |
||||||
175 | } |
||||||
176 | $darkmater_cost *= $this->cost_alliance_multiplier; |
||||||
177 | |||||||
178 | if (mrc_get_level($user, [], RES_DARK_MATTER) < $darkmater_cost) { |
||||||
179 | throw new Exception('mrc_msg_error_no_resource', ERR_ERROR); |
||||||
180 | } |
||||||
181 | |||||||
182 | $this->mercenaryDismiss($user, $mercenary_id, $darkmater_cost, $mercenary_level); |
||||||
183 | |||||||
184 | if ($darkmater_cost && $mercenary_level) { |
||||||
185 | DBStaticUnit::db_unit_set_insert( |
||||||
186 | "unit_player_id = {$user['id']}, |
||||||
187 | unit_location_type = " . LOC_USER . ", |
||||||
188 | unit_location_id = {$user['id']}, |
||||||
189 | unit_type = {$this->mode}, |
||||||
190 | unit_snid = {$mercenary_id}, |
||||||
191 | unit_level = {$mercenary_level}, |
||||||
192 | unit_time_start = " . (!$this->isUnitsPermanent ? 'FROM_UNIXTIME(' . SN_TIME_NOW . ')' : 'null') . ", |
||||||
193 | unit_time_finish = " . (!$this->isUnitsPermanent ? 'FROM_UNIXTIME(' . (SN_TIME_NOW + $mercenary_period) . ')' : 'null') |
||||||
194 | ); |
||||||
195 | |||||||
196 | rpg_points_change($user['id'], $this->mode == UNIT_PLANS ? RPG_PLANS : RPG_MERCENARY, -($darkmater_cost), |
||||||
197 | sprintf($this->lang[$this->mode == UNIT_PLANS ? 'mrc_plan_bought_log' : 'mrc_mercenary_hired_log'], $this->lang['tech'][$mercenary_id], $mercenary_id, $darkmater_cost, round($mercenary_period / PERIOD_DAY))); |
||||||
198 | } |
||||||
199 | db_mysql::db_transaction_commit(); |
||||||
200 | sys_redirect($_SERVER['REQUEST_URI']); |
||||||
201 | } |
||||||
202 | |||||||
203 | protected function mrc_officer_accessible(&$user, $mercenary_id) { |
||||||
204 | $mercenary_info = get_unit_param($mercenary_id); |
||||||
205 | |||||||
206 | if ($this->config->empire_mercenary_temporary || $mercenary_info[P_UNIT_TYPE] == UNIT_PLANS) { |
||||||
207 | return true; |
||||||
208 | } |
||||||
209 | |||||||
210 | return eco_can_build_unit($user, [], $mercenary_id) == BUILD_ALLOWED; |
||||||
211 | } |
||||||
212 | |||||||
213 | /** |
||||||
214 | * @param \template $template |
||||||
215 | */ |
||||||
216 | protected function fillDiscountTable($template) { |
||||||
217 | foreach ($this->sn_powerup_buy_discounts as $hire_period => $hire_discount) { |
||||||
218 | $template->assign_block_vars('period', array( |
||||||
219 | 'LENGTH' => $hire_period, |
||||||
220 | 'TEXT' => $this->lang['mrc_period_list'][$hire_period], |
||||||
221 | 'DISCOUNT' => $hire_period / $this->config->empire_mercenary_base_period * $hire_discount, |
||||||
222 | 'SELECTED' => $hire_period == $this->config->empire_mercenary_base_period, |
||||||
223 | )); |
||||||
224 | } |
||||||
225 | } |
||||||
226 | |||||||
227 | /** |
||||||
228 | * @param $user |
||||||
229 | * |
||||||
230 | * @return array |
||||||
231 | */ |
||||||
232 | protected function modelMercenaryHire($user) { |
||||||
233 | $operation_result = []; |
||||||
234 | if ($mercenary_id = sys_get_param_int('mercenary_id')) { |
||||||
235 | try { |
||||||
236 | $this->mrc_mercenary_hire($user, $mercenary_id); |
||||||
237 | } catch (Exception $e) { |
||||||
238 | db_mysql::db_transaction_rollback(); |
||||||
239 | $operation_result = array( |
||||||
240 | 'STATUS' => in_array($e->getCode(), array(ERR_NONE, ERR_WARNING, ERR_ERROR)) ? $e->getCode() : ERR_ERROR, |
||||||
241 | 'MESSAGE' => $this->lang[$e->getMessage()], |
||||||
242 | ); |
||||||
243 | } |
||||||
244 | } |
||||||
245 | |||||||
246 | return $operation_result; |
||||||
247 | } |
||||||
248 | |||||||
249 | /** |
||||||
250 | * @param array $user |
||||||
251 | * @param int $mercenary_id |
||||||
252 | * @param float $darkmater_cost |
||||||
253 | * @param int $mercenary_level |
||||||
254 | */ |
||||||
255 | protected function mercenaryDismiss($user, $mercenary_id, $darkmater_cost, $mercenary_level) { |
||||||
256 | if ((!$darkmater_cost || !$mercenary_level) && $this->isUnitsPermanent) { |
||||||
257 | return; |
||||||
258 | } |
||||||
259 | |||||||
260 | $unit_row = DBStaticUnit::db_unit_by_location($user['id'], LOC_USER, $user['id'], $mercenary_id); |
||||||
261 | if (is_array($unit_row) && ($dismiss_left_days = floor((strtotime($unit_row['unit_time_finish']) - SN_TIME_NOW) / PERIOD_DAY))) { |
||||||
262 | $dismiss_full_cost = eco_get_total_cost($mercenary_id, $unit_row['unit_level']); |
||||||
263 | $dismiss_full_cost = $dismiss_full_cost[BUILD_CREATE][RES_DARK_MATTER]; |
||||||
264 | |||||||
265 | $dismiss_full_days = round((strtotime($unit_row['unit_time_finish']) - strtotime($unit_row['unit_time_start'])) / PERIOD_DAY); |
||||||
266 | rpg_points_change($user['id'], RPG_MERCENARY_DISMISSED, 0, |
||||||
267 | sprintf($this->lang['mrc_mercenary_dismissed_log'], $this->lang['tech'][$mercenary_id], $mercenary_id, $dismiss_full_cost, $dismiss_full_days, |
||||||
0 ignored issues
–
show
sprintf($this->lang['mrc... / $dismiss_full_days)) of type string is incompatible with the type boolean expected by parameter $comment of rpg_points_change() .
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() |
|||||||
268 | $unit_row['unit_time_start'], $unit_row['unit_time_finish'], $dismiss_left_days, floor($dismiss_full_cost * $dismiss_left_days / $dismiss_full_days) |
||||||
269 | )); |
||||||
270 | } |
||||||
271 | DBStaticUnit::db_unit_list_delete($user['id'], LOC_USER, $user['id'], $mercenary_id); |
||||||
272 | } |
||||||
273 | |||||||
274 | /** |
||||||
275 | * @param $user |
||||||
276 | * @param $mercenary |
||||||
277 | * @param template $template |
||||||
278 | */ |
||||||
279 | protected function renderMercenaryReq(&$user, $mercenary, $template) { |
||||||
280 | if (empty($mercenary[P_REQUIRE]) || !is_array($mercenary[P_REQUIRE])) { |
||||||
281 | return; |
||||||
282 | } |
||||||
283 | |||||||
284 | foreach ($mercenary[P_REQUIRE] as $requireUnitId => $requireLevel) { |
||||||
285 | $template->assign_block_vars('officer.require', $q = [ |
||||||
286 | 'ID' => $requireUnitId, |
||||||
287 | 'LEVEL_GOT' => mrc_get_level($user, [], $requireUnitId), |
||||||
288 | 'LEVEL_REQUIRED' => $requireLevel, |
||||||
289 | 'NAME' => \HelperString::htmlSafe($this->lang['tech'][$requireUnitId]) |
||||||
290 | ]); |
||||||
291 | } |
||||||
292 | } |
||||||
293 | |||||||
294 | /** |
||||||
295 | * @param float $user_dark_matter |
||||||
296 | * @param int $mercenary_id |
||||||
297 | * @param float $currentCost |
||||||
298 | * @param template $template |
||||||
299 | * @param int $mercenary_level |
||||||
300 | * @param $mercenary_max_level |
||||||
301 | */ |
||||||
302 | protected function renderMercenaryLevelsAvail($user_dark_matter, $mercenary_id, $currentCost, $template, $mercenary_level, $mercenary_max_level) { |
||||||
303 | $upgrade_cost = 1; |
||||||
304 | for ( |
||||||
305 | $i = $this->config->empire_mercenary_temporary ? 1 : $mercenary_level + 1; |
||||||
306 | $mercenary_max_level ? ($i <= $mercenary_max_level) : $upgrade_cost <= $user_dark_matter; |
||||||
307 | $i++ |
||||||
308 | ) { |
||||||
309 | $newCost = eco_get_total_cost($mercenary_id, $i); |
||||||
310 | $upgrade_cost = $newCost[BUILD_CREATE][RES_DARK_MATTER] * $this->cost_alliance_multiplier - $currentCost; |
||||||
311 | $template->assign_block_vars('officer.level', array( |
||||||
312 | 'VALUE' => $i, |
||||||
313 | 'PRICE' => $upgrade_cost, |
||||||
314 | )); |
||||||
315 | } |
||||||
316 | } |
||||||
317 | |||||||
318 | } |
||||||
319 |
The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g.
excluded_paths: ["lib/*"]
, you can move it to the dependency path list as follows:For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths