|
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; |
|
|
|
|
|
|
10
|
|
|
use \SN; |
|
|
|
|
|
|
11
|
|
|
use SnTemplate; |
|
12
|
|
|
use Unit\DBStaticUnit; |
|
13
|
|
|
use \template; |
|
|
|
|
|
|
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), |
|
|
|
|
|
|
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']); |
|
|
|
|
|
|
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, |
|
|
|
|
|
|
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