1
|
|
|
<?php |
|
|
|
|
2
|
|
|
|
3
|
|
|
require_once('ube_report.php'); |
4
|
|
|
|
5
|
|
|
/* |
6
|
|
|
|
7
|
|
|
// TODO: Для админского боя обнулять обломки до луны - что бы не создавалась луна и не писалось количество обломков |
8
|
|
|
|
9
|
|
|
// TODO: В симуляторе все равно печтатать поле обломков и изменить надпись "Средний диаметр луны с указанным шансом %%" UBE_MOON_SIMULATED |
10
|
|
|
|
11
|
|
|
// TODO: Отсылать каждому игроку сообщение на его языке! |
12
|
|
|
|
13
|
|
|
// TODO: Перевод на английский |
14
|
|
|
|
15
|
|
|
*/ |
16
|
|
|
|
17
|
|
|
/* |
18
|
|
|
Планы |
19
|
|
|
|
20
|
|
|
[*] UBEv4: Уменьшать каждый раунд значение общей брони кораблей на % от дамаджа, прошедшего за щиты |
21
|
|
|
Так будет эмулироваться распределение повреждений по всем кораблям. На этот же процент уменьшать атаку. Процент брать от брони кораблей |
22
|
|
|
[*] UBEv4: Рандомизировать броню в самом начале боя |
23
|
|
|
[*] UBEv4: Можно прописать разным кораблям разную стойкость ко взрыву |
24
|
|
|
[*] UBEv4: Уровень регенерации щитов |
25
|
|
|
[*] UBEv4: При атаке и проигрыше выбрасывать в космос излишки ресурсов со складов - часть ресурсов, которые за пределами складов. А часть - терять |
26
|
|
|
|
27
|
|
|
[*] UBEv4: Боевые порядки юнитов |
28
|
|
|
[*] UBEv4: Collateral damage: Взрыв корабля наносит урон соседям. Взрыв всех или только одиночек ? |
29
|
|
|
[*] UBEv4: Регенерация брони - спецмодуль корабля. И вообще подумать о спецмодулях - скорее всего через прошивки |
30
|
|
|
[*] UBEv4: Распределить планетарный щит в пропорции между всеми защитными сооружениями - эмуляция первого залпа. Или просто добавить такое количество щитов всем оборонам |
31
|
|
|
[*] UBEv4: Динамическое цветовое кодирование результатов боя - для защитников отдельно, для атакующих - отдельно |
32
|
|
|
[*] UBEv4: При отлете СН и ЗС могут уничтожить новосозданную луну (?) |
33
|
|
|
[*] UBEv4: Броня влияет на количество брони, соотношение брони и структуры - т.е. как быстро рванет корабль, а так же на ходовые качества |
34
|
|
|
Типы брони: дюралюминий (легкая, но непрочная - минус к весу, минус к броне), броневая сталь (стандартная броня), |
35
|
|
|
легированная сталь (более прочная и более дорогая версия стальной - плюс к броне, плюс к цене), комозитная броня (по прочности, как сталь, но легче - минус к весу, плюс к цене), |
36
|
|
|
урановая броня (более прочная и заметно тяжелее, чем стальная - плюс к весу, плюс к броне, плюс к цене), |
37
|
|
|
титановая броня (хай-энд: прочная, как уран, легкая, как дюралюминия, дорогая, как пиздец) |
38
|
|
|
Модуль активной брони против кинетического оружия |
39
|
|
|
[*] UBEv4: Щиты |
40
|
|
|
Модуль для щитов "Перегрузка": дает 200% щитов на первый залп |
41
|
|
|
|
42
|
|
|
[*] ЧР: Инфа об удержании |
43
|
|
|
|
44
|
|
|
[*] Симулятор: Поддержка мультифлотов. Переписать интерфейс симулятора под работу с любым количеством флотов |
45
|
|
|
|
46
|
|
|
[*] Артефакты: Гиперсборщик - позволяет собрать обломки сразу после боя |
47
|
|
|
|
48
|
|
|
[*] Наемники: Мародер. Капитан или офицер. +1% к вывозимым ресурсам за каждый уровень. Скажем, до +25%. Считаем от общей доли вывоза или от всех ресов на планете? |
49
|
|
|
|
50
|
|
|
[*] Боты: Захватывать ничьи планеты |
51
|
|
|
|
52
|
|
|
*/ |
53
|
|
|
|
54
|
|
|
if (BE_DEBUG === true) { |
|
|
|
|
55
|
|
|
require_once('ube_zi_helpers.php'); |
56
|
|
|
} |
57
|
|
|
|
58
|
|
|
// ------------------------------------------------------------------------------------------------ |
59
|
|
|
// Рассылает письма всем участникам боя |
60
|
|
|
function sn_ube_message_send(&$combat_data) { |
61
|
|
|
global $lang; |
|
|
|
|
62
|
|
|
|
63
|
|
|
// TODO: Отсылать каждому игроку сообщение на его языке! |
64
|
|
|
|
65
|
|
|
$outcome = &$combat_data[UBE_OUTCOME]; |
66
|
|
|
$planet_info = &$outcome[UBE_PLANET]; |
67
|
|
|
|
68
|
|
|
// Генерируем текст письма |
69
|
|
|
$text_common = sprintf($lang['ube_report_msg_body_common'], |
70
|
|
|
date(FMT_DATE_TIME, $combat_data['UBE_TIME']), |
71
|
|
|
$lang['sys_planet_type_sh'][$planet_info[PLANET_TYPE]], |
72
|
|
|
$planet_info[PLANET_GALAXY], |
73
|
|
|
$planet_info[PLANET_SYSTEM], |
74
|
|
|
$planet_info[PLANET_PLANET], |
75
|
|
|
htmlentities($planet_info[PLANET_NAME], ENT_COMPAT, 'UTF-8'), |
76
|
|
|
$lang[$outcome['UBE_COMBAT_RESULT'] == UBE_COMBAT_RESULT_WIN ? 'ube_report_info_outcome_win' : |
77
|
|
|
($outcome['UBE_COMBAT_RESULT'] == UBE_COMBAT_RESULT_DRAW ? 'ube_report_info_outcome_draw' : 'ube_report_info_outcome_loss')] |
78
|
|
|
); |
79
|
|
|
|
80
|
|
|
$text_defender = ''; |
81
|
|
|
foreach ($outcome[UBE_DEBRIS] as $resource_id => $resource_amount) { |
82
|
|
|
if ($resource_id == RES_DEUTERIUM) { |
83
|
|
|
continue; |
84
|
|
|
} |
85
|
|
|
|
86
|
|
|
$text_defender .= "{$lang['tech'][$resource_id]}: " . HelperString::numberFloorAndFormat($resource_amount) . '<br />'; |
87
|
|
|
} |
88
|
|
|
if ($text_defender) { |
89
|
|
|
$text_defender = "{$lang['ube_report_msg_body_debris']}{$text_defender}<br />"; |
90
|
|
|
} |
91
|
|
|
|
92
|
|
|
if ($outcome[UBE_MOON] == UBE_MOON_CREATE_SUCCESS) { |
93
|
|
|
$text_defender .= "{$lang['ube_report_moon_created']} {$outcome[UBE_MOON_SIZE]} {$lang['sys_kilometers_short']}<br /><br />"; |
94
|
|
|
} elseif ($outcome[UBE_MOON] == UBE_MOON_CREATE_FAILED) { |
95
|
|
|
$text_defender .= "{$lang['ube_report_moon_chance']} {$outcome[UBE_MOON_CHANCE]}%<br /><br />"; |
96
|
|
|
} |
97
|
|
|
|
98
|
|
|
if ($combat_data[UBE_OPTIONS][UBE_MISSION_TYPE] == MT_DESTROY) { |
99
|
|
|
if ($outcome[UBE_MOON_REAPERS] == UBE_MOON_REAPERS_NONE) { |
100
|
|
|
$text_defender .= $lang['ube_report_moon_reapers_none']; |
101
|
|
|
} else { |
102
|
|
|
$text_defender .= "{$lang['ube_report_moon_reapers_wave']}. {$lang['ube_report_moon_reapers_chance']} {$outcome[UBE_MOON_DESTROY_CHANCE]}%. "; |
103
|
|
|
$text_defender .= $lang[$outcome[UBE_MOON] == UBE_MOON_DESTROY_SUCCESS ? 'ube_report_moon_reapers_success' : 'ube_report_moon_reapers_failure'] . "<br />"; |
104
|
|
|
|
105
|
|
|
$text_defender .= "{$lang['ube_report_moon_reapers_outcome']} {$outcome[UBE_MOON_REAPERS_DIE_CHANCE]}%. "; |
106
|
|
|
$text_defender .= $lang[$outcome[UBE_MOON_REAPERS] == UBE_MOON_REAPERS_RETURNED ? 'ube_report_moon_reapers_survive' : 'ube_report_moon_reapers_died']; |
107
|
|
|
} |
108
|
|
|
$text_defender .= '<br /><br />'; |
109
|
|
|
} |
110
|
|
|
|
111
|
|
|
$text_defender .= "{$lang['ube_report_info_link']}: <a href=\"index.php?page=battle_report&cypher={$combat_data[UBE_REPORT_CYPHER]}\">{$combat_data[UBE_REPORT_CYPHER]}</a>"; |
112
|
|
|
|
113
|
|
|
// TODO: Оптимизировать отсылку сообщений - отсылать пакетами |
114
|
|
|
foreach ($combat_data[UBE_PLAYERS] as $player_id => $player_info) { |
115
|
|
|
$message = $text_common . ($outcome[UBE_SFR] && $player_info[UBE_ATTACKER] ? $lang['ube_report_msg_body_sfr'] : $text_defender); |
116
|
|
|
msg_send_simple_message($player_id, '', $combat_data[UBE_TIME], MSG_TYPE_COMBAT, $lang['sys_mess_tower'], $lang['sys_mess_attack_report'], $message); |
117
|
|
|
} |
118
|
|
|
|
119
|
|
|
} |
120
|
|
|
|
121
|
|
|
|
122
|
|
|
// ------------------------------------------------------------------------------------------------ |
123
|
|
|
// Записывает результат боя в БД |
124
|
|
|
function ube_combat_result_apply(&$combat_data) { return sn_function_call('ube_combat_result_apply', array(&$combat_data)); } |
125
|
|
|
|
126
|
|
|
function sn_ube_combat_result_apply(&$combat_data) { |
127
|
|
|
// TODO: Поменять все отладки на запросы |
128
|
|
|
$destination_user_id = $combat_data[UBE_FLEETS][0][UBE_OWNER]; |
129
|
|
|
|
130
|
|
|
$outcome = &$combat_data[UBE_OUTCOME]; |
131
|
|
|
$planet_info = &$outcome[UBE_PLANET]; |
132
|
|
|
$planet_id = $planet_info[PLANET_ID]; |
133
|
|
|
// Обновляем поле обломков на планете |
134
|
|
|
if (!$combat_data[UBE_OPTIONS][UBE_COMBAT_ADMIN] && !empty($outcome[UBE_DEBRIS])) { |
135
|
|
|
DBStaticPlanet::db_planet_set_by_gspt($planet_info[PLANET_GALAXY], $planet_info[PLANET_SYSTEM], $planet_info[PLANET_PLANET], PT_PLANET, |
136
|
|
|
"`debris_metal` = `debris_metal` + " . floor($outcome[UBE_DEBRIS][RES_METAL]) . ", `debris_crystal` = `debris_crystal` + " . floor($outcome[UBE_DEBRIS][RES_CRYSTAL]) |
137
|
|
|
); |
138
|
|
|
} |
139
|
|
|
|
140
|
|
|
$db_save = array( |
141
|
|
|
UBE_FLEET_GROUP => array(), // Для САБов |
142
|
|
|
); |
143
|
|
|
|
144
|
|
|
$fleets_outcome = &$outcome[UBE_FLEETS]; |
145
|
|
|
foreach ($combat_data[UBE_FLEETS] as $fleet_id => &$fleet_info) { |
146
|
|
|
if ($fleet_info[UBE_FLEET_GROUP]) { |
147
|
|
|
$db_save[UBE_FLEET_GROUP][$fleet_info[UBE_FLEET_GROUP]] = $fleet_info[UBE_FLEET_GROUP]; |
148
|
|
|
} |
149
|
|
|
|
150
|
|
|
$fleet_info[UBE_COUNT] = $fleet_info[UBE_COUNT] ? $fleet_info[UBE_COUNT] : array(); |
151
|
|
|
$fleets_outcome[$fleet_id][UBE_UNITS_LOST] = $fleets_outcome[$fleet_id][UBE_UNITS_LOST] ? $fleets_outcome[$fleet_id][UBE_UNITS_LOST] : array(); |
152
|
|
|
|
153
|
|
|
$fleet_query = array(); |
154
|
|
|
$db_changeset = array(); |
155
|
|
|
$old_fleet_count = array_sum($fleet_info[UBE_COUNT]); |
156
|
|
|
$new_fleet_count = $old_fleet_count - array_sum($fleets_outcome[$fleet_id][UBE_UNITS_LOST]); |
157
|
|
|
// Перебираем юниты если во время боя количество юнитов изменилось и при этом во флоту остались юниты или это планета |
158
|
|
|
if ($new_fleet_count != $old_fleet_count && (!$fleet_id || $new_fleet_count)) { |
159
|
|
|
// Просматриваем результаты изменения флотов |
160
|
|
|
foreach ($fleet_info[UBE_COUNT] as $unit_id => $unit_count) { |
161
|
|
|
// Перебираем аутком на случай восстановления юнитов |
162
|
|
|
$units_lost = (float)$fleets_outcome[$fleet_id][UBE_UNITS_LOST][$unit_id]; |
163
|
|
|
|
164
|
|
|
$units_left = $unit_count - $units_lost; |
165
|
|
|
if ($fleet_id) { |
166
|
|
|
// Не планета - всегда сразу записываем строку итогов флота |
167
|
|
|
$fleet_query[$unit_id] = "{$unit_id},{$units_left}"; |
168
|
|
|
} elseif ($units_lost) { |
169
|
|
|
// Планета - записываем в ИД юнита его потери только если есть потери |
170
|
|
|
$db_changeset['unit'][] = OldDbChangeSet::db_changeset_prepare_unit($unit_id, -$units_lost, $combat_data[UBE_PLAYERS][$destination_user_id][UBE_PLAYER_DATA], $planet_id); |
|
|
|
|
171
|
|
|
} |
172
|
|
|
} |
173
|
|
|
|
174
|
|
|
if ($fleet_id) { |
175
|
|
|
// Для флотов перегенерируем массив как одно вхождение в SET SQL-запроса |
176
|
|
|
$fleet_query = array( |
177
|
|
|
'fleet_array' => implode(';', $fleet_query), |
178
|
|
|
); |
179
|
|
|
} |
180
|
|
|
} |
181
|
|
|
|
182
|
|
|
$fleet_delta = array(); |
183
|
|
|
// Если во флоте остались юниты или это планета - генерируем изменение ресурсов |
184
|
|
|
if ($new_fleet_count || !$fleet_id) { |
185
|
|
|
foreach (sn_get_groups('resources_loot') as $resource_id) { |
186
|
|
|
$resource_change = (float)$fleets_outcome[$fleet_id][UBE_RESOURCES_LOOTED][$resource_id] + (float)$fleets_outcome[$fleet_id][UBE_CARGO_DROPPED][$resource_id]; |
187
|
|
|
if ($resource_change) { |
188
|
|
|
$resource_db_name = ($fleet_id ? 'fleet_resource_' : '') . pname_resource_name($resource_id); |
189
|
|
|
$fleet_delta[$resource_db_name] = -($resource_change); |
190
|
|
|
} |
191
|
|
|
} |
192
|
|
|
} |
193
|
|
|
|
194
|
|
|
if ($fleet_id && $new_fleet_count) { |
195
|
|
|
// Если защитник и не РМФ - отправляем флот назад |
196
|
|
|
if (($fleet_info[UBE_FLEET_TYPE] == UBE_DEFENDERS && !$outcome[UBE_SFR]) || $fleet_info[UBE_FLEET_TYPE] == UBE_ATTACKERS) { |
197
|
|
|
$fleet_query['fleet_mess'] = 1; |
198
|
|
|
} |
199
|
|
|
} |
200
|
|
|
|
201
|
|
|
if ($fleet_id) // Не планета |
202
|
|
|
{ |
203
|
|
|
if ($fleet_info[UBE_FLEET_TYPE] == UBE_ATTACKERS && $outcome[UBE_MOON_REAPERS] == UBE_MOON_REAPERS_DIED) { |
204
|
|
|
$new_fleet_count = 0; |
205
|
|
|
} |
206
|
|
|
|
207
|
|
|
if ($new_fleet_count) { |
208
|
|
|
if (!empty($fleet_query) || !empty($fleet_delta)) { |
209
|
|
|
$fleet_query['fleet_amount'] = $new_fleet_count; |
210
|
|
|
fleet_update_set($fleet_id, $fleet_query, $fleet_delta); |
211
|
|
|
} |
212
|
|
|
} else { |
213
|
|
|
// Удаляем пустые флоты |
214
|
|
|
db_fleet_delete($fleet_id); |
215
|
|
|
DBStaticUnit::db_unit_list_delete(0, LOC_FLEET, $fleet_id, 0); |
216
|
|
|
} |
217
|
|
|
} else // Планета |
218
|
|
|
{ |
219
|
|
|
// Сохраняем изменения ресурсов - если они есть |
220
|
|
|
if (!empty($fleet_delta)) { |
221
|
|
|
$temp = array(); |
222
|
|
|
foreach ($fleet_delta as $resource_db_name => $resource_amount) { |
223
|
|
|
$temp[] = "`{$resource_db_name}` = `{$resource_db_name}` + ({$resource_amount})"; |
224
|
|
|
} |
225
|
|
|
DBStaticPlanet::db_planet_set_by_id($planet_id, implode(',', $temp)); |
226
|
|
|
} |
227
|
|
|
if (!empty($db_changeset)) // Сохраняем изменения юнитов на планете - если они есть |
228
|
|
|
{ |
229
|
|
|
OldDbChangeSet::db_changeset_apply($db_changeset); |
|
|
|
|
230
|
|
|
} |
231
|
|
|
} |
232
|
|
|
} |
233
|
|
|
|
234
|
|
|
// TODO: Связать сабы с флотами констраинтами ON DELETE SET NULL |
235
|
|
|
if (!empty($db_save[UBE_FLEET_GROUP])) { |
236
|
|
|
$db_save[UBE_FLEET_GROUP] = implode(',', $db_save[UBE_FLEET_GROUP]); |
237
|
|
|
doquery("DELETE FROM {{aks}} WHERE `id` IN ({$db_save[UBE_FLEET_GROUP]})"); |
238
|
|
|
} |
239
|
|
|
|
240
|
|
|
if ($outcome[UBE_MOON] == UBE_MOON_CREATE_SUCCESS) { |
241
|
|
|
$moon_row = uni_create_moon($planet_info[PLANET_GALAXY], $planet_info[PLANET_SYSTEM], $planet_info[PLANET_PLANET], $destination_user_id, $outcome[UBE_MOON_SIZE], false); |
242
|
|
|
$outcome[UBE_MOON_NAME] = $moon_row['name']; |
243
|
|
|
unset($moon_row); |
244
|
|
|
} elseif ($outcome[UBE_MOON] == UBE_MOON_DESTROY_SUCCESS) { |
245
|
|
|
DBStaticPlanet::db_planet_delete_by_id($planet_id); |
246
|
|
|
} |
247
|
|
|
|
248
|
|
|
$bashing_list = array(); |
249
|
|
|
foreach ($combat_data[UBE_PLAYERS] as $player_id => $player_info) { |
250
|
|
|
if ($player_info[UBE_ATTACKER]) { |
251
|
|
|
if ($outcome[UBE_MOON] != UBE_MOON_DESTROY_SUCCESS) { |
252
|
|
|
$bashing_list[] = "({$player_id}, {$planet_id}, {$combat_data[UBE_TIME]})"; |
253
|
|
|
} |
254
|
|
|
if ($combat_data[UBE_OPTIONS][UBE_MISSION_TYPE] == MT_ATTACK && $combat_data[UBE_OPTIONS][UBE_DEFENDER_ACTIVE]) { |
255
|
|
|
$str_loose_or_win = $outcome[UBE_COMBAT_RESULT] == UBE_COMBAT_RESULT_WIN ? 'raidswin' : 'raidsloose'; |
256
|
|
|
db_user_set_by_id($player_id, "`xpraid` = `xpraid` + 1, `raids` = `raids` + 1, `{$str_loose_or_win}` = `{$str_loose_or_win}` + 1"); |
|
|
|
|
257
|
|
|
} |
258
|
|
|
} |
259
|
|
|
} |
260
|
|
|
$bashing_list = implode(',', $bashing_list); |
261
|
|
|
if ($bashing_list) { |
262
|
|
|
doquery("INSERT INTO {{bashing}} (bashing_user_id, bashing_planet_id, bashing_time) VALUES {$bashing_list};"); |
263
|
|
|
} |
264
|
|
|
} |
265
|
|
|
|
The PSR-1: Basic Coding Standard recommends that a file should either introduce new symbols, that is classes, functions, constants or similar, or have side effects. Side effects are anything that executes logic, like for example printing output, changing ini settings or writing to a file.
The idea behind this recommendation is that merely auto-loading a class should not change the state of an application. It also promotes a cleaner style of programming and makes your code less prone to errors, because the logic is not spread out all over the place.
To learn more about the PSR-1, please see the PHP-FIG site on the PSR-1.