1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
class UBEReport { |
4
|
|
|
|
5
|
|
|
// ------------------------------------------------------------------------------------------------ |
6
|
|
|
// Записывает боевой отчет в БД |
7
|
|
|
/** |
8
|
|
|
* @param UBE $ube |
9
|
|
|
* |
10
|
|
|
* @return bool|string |
11
|
|
|
* |
12
|
|
|
* @version 2016-02-25 23:42:45 41a4.68 |
13
|
|
|
*/ |
14
|
|
|
public function sn_ube_report_save($ube) { |
15
|
|
|
// Если уже есть ИД репорта - значит репорт был взят из таблицы. С таким мы не работаем |
16
|
|
|
if($ube->get_cypher()) { |
17
|
|
|
return false; |
18
|
|
|
} |
19
|
|
|
|
20
|
|
|
// Генерируем уникальный секретный ключ и проверяем наличие в базе |
21
|
|
|
do { |
22
|
|
|
$ube->report_cypher = sys_random_string(32); |
23
|
|
|
} while(classSupernova::$db->doSelectFetchArray("SELECT ube_report_cypher FROM {{ube_report}} WHERE ube_report_cypher = '{$ube->report_cypher}' LIMIT 1 FOR UPDATE")); |
|
|
|
|
24
|
|
|
|
25
|
|
|
// Инициализация таблицы для пакетной вставки информации |
26
|
|
|
$sql_perform = array( |
27
|
|
|
'ube_report_player' => array( |
28
|
|
|
array( |
29
|
|
|
'`ube_report_id`', |
30
|
|
|
'`ube_report_player_player_id`', |
31
|
|
|
'`ube_report_player_name`', |
32
|
|
|
'`ube_report_player_attacker`', |
33
|
|
|
'`ube_report_player_bonus_attack`', |
34
|
|
|
'`ube_report_player_bonus_shield`', |
35
|
|
|
'`ube_report_player_bonus_armor`', |
36
|
|
|
), |
37
|
|
|
), |
38
|
|
|
|
39
|
|
|
'ube_report_fleet' => array( |
40
|
|
|
array( |
41
|
|
|
'`ube_report_id`', |
42
|
|
|
'`ube_report_fleet_player_id`', |
43
|
|
|
'`ube_report_fleet_fleet_id`', |
44
|
|
|
'`ube_report_fleet_planet_id`', |
45
|
|
|
'`ube_report_fleet_planet_name`', |
46
|
|
|
'`ube_report_fleet_planet_galaxy`', |
47
|
|
|
'`ube_report_fleet_planet_system`', |
48
|
|
|
'`ube_report_fleet_planet_planet`', |
49
|
|
|
'`ube_report_fleet_planet_planet_type`', |
50
|
|
|
'`ube_report_fleet_resource_metal`', |
51
|
|
|
'`ube_report_fleet_resource_crystal`', |
52
|
|
|
'`ube_report_fleet_resource_deuterium`', |
53
|
|
|
'`ube_report_fleet_bonus_attack`', |
54
|
|
|
'`ube_report_fleet_bonus_shield`', |
55
|
|
|
'`ube_report_fleet_bonus_armor`', |
56
|
|
|
), |
57
|
|
|
), |
58
|
|
|
|
59
|
|
|
'ube_report_outcome_fleet' => array( |
60
|
|
|
array( |
61
|
|
|
'`ube_report_id`', |
62
|
|
|
'`ube_report_outcome_fleet_fleet_id`', |
63
|
|
|
'`ube_report_outcome_fleet_resource_lost_metal`', |
64
|
|
|
'`ube_report_outcome_fleet_resource_lost_crystal`', |
65
|
|
|
'`ube_report_outcome_fleet_resource_lost_deuterium`', |
66
|
|
|
'`ube_report_outcome_fleet_resource_dropped_metal`', |
67
|
|
|
'`ube_report_outcome_fleet_resource_dropped_crystal`', |
68
|
|
|
'`ube_report_outcome_fleet_resource_dropped_deuterium`', |
69
|
|
|
'`ube_report_outcome_fleet_resource_loot_metal`', |
70
|
|
|
'`ube_report_outcome_fleet_resource_loot_crystal`', |
71
|
|
|
'`ube_report_outcome_fleet_resource_loot_deuterium`', |
72
|
|
|
'`ube_report_outcome_fleet_resource_lost_in_metal`', |
73
|
|
|
), |
74
|
|
|
), |
75
|
|
|
|
76
|
|
|
'ube_report_outcome_unit' => array( |
77
|
|
|
array( |
78
|
|
|
'`ube_report_id`', |
79
|
|
|
'`ube_report_outcome_unit_fleet_id`', |
80
|
|
|
'`ube_report_outcome_unit_unit_id`', |
81
|
|
|
'`ube_report_outcome_unit_restored`', |
82
|
|
|
'`ube_report_outcome_unit_lost`', |
83
|
|
|
'`ube_report_outcome_unit_sort_order`', |
84
|
|
|
), |
85
|
|
|
), |
86
|
|
|
|
87
|
|
|
'ube_report_unit' => array( |
88
|
|
|
array( |
89
|
|
|
'`ube_report_id`', |
90
|
|
|
'`ube_report_unit_round`', |
91
|
|
|
'`ube_report_unit_player_id`', |
92
|
|
|
'`ube_report_unit_fleet_id`', |
93
|
|
|
'`ube_report_unit_unit_id`', |
94
|
|
|
'`ube_report_unit_count`', |
95
|
|
|
'`ube_report_unit_boom`', |
96
|
|
|
'`ube_report_unit_attack`', |
97
|
|
|
'`ube_report_unit_shield`', |
98
|
|
|
'`ube_report_unit_armor`', |
99
|
|
|
'`ube_report_unit_attack_base`', |
100
|
|
|
'`ube_report_unit_shield_base`', |
101
|
|
|
'`ube_report_unit_armor_base`', |
102
|
|
|
'`ube_report_unit_sort_order`', |
103
|
|
|
), |
104
|
|
|
), |
105
|
|
|
); |
106
|
|
|
|
107
|
|
|
// Сохраняем общую информацию о бое |
108
|
|
|
classSupernova::$db->doInsertSet(TABLE_UBE_REPORT, array( |
109
|
|
|
'ube_report_cypher' => (string)$ube->report_cypher, |
110
|
|
|
'ube_report_time_combat' => (string)date(FMT_DATE_TIME_SQL, $ube->combat_timestamp), |
111
|
|
|
'ube_report_time_spent' => (float)$ube->time_spent, |
112
|
|
|
'ube_report_combat_admin' => (int)$ube->is_admin_in_combat, |
113
|
|
|
'ube_report_mission_type' => (int)$ube->mission_type_id, |
114
|
|
|
'ube_report_combat_result' => (int)$ube->combat_result, |
115
|
|
|
'ube_report_combat_sfr' => (int)$ube->is_small_fleet_recce, |
116
|
|
|
'ube_report_planet_id' => (int)$ube->ube_planet_info[PLANET_ID], |
117
|
|
|
'ube_report_planet_name' => (string)$ube->ube_planet_info[PLANET_NAME], |
118
|
|
|
'ube_report_planet_size' => (int)$ube->ube_planet_info[PLANET_SIZE], |
119
|
|
|
'ube_report_planet_galaxy' => (int)$ube->ube_planet_info[PLANET_GALAXY], |
120
|
|
|
'ube_report_planet_system' => (int)$ube->ube_planet_info[PLANET_SYSTEM], |
121
|
|
|
'ube_report_planet_planet' => (int)$ube->ube_planet_info[PLANET_PLANET], |
122
|
|
|
'ube_report_planet_planet_type' => (int)$ube->ube_planet_info[PLANET_TYPE], |
123
|
|
|
'ube_report_capture_result' => (int)$ube->capture_result, |
124
|
|
|
) |
125
|
|
|
+ $ube->debris->report_generate_array() |
126
|
|
|
+ $ube->moon_calculator->report_generate_array() |
127
|
|
|
); |
128
|
|
|
$ube_report_id = classSupernova::$db->db_insert_id(); |
129
|
|
|
|
130
|
|
|
// Сохраняем общую информацию по игрокам |
131
|
|
|
$player_sides = $ube->players->get_player_sides(); |
132
|
|
|
foreach($player_sides as $player_id => $player_side) { |
133
|
|
|
$sql_perform['ube_report_player'][] = array( |
134
|
|
|
$ube_report_id, |
135
|
|
|
$player_id, |
136
|
|
|
|
137
|
|
|
"'" . db_escape($ube->players[$player_id]->name) . "'", |
138
|
|
|
$ube->players[$player_id]->getSide() == UBE_PLAYER_IS_ATTACKER ? 1 : 0, |
139
|
|
|
|
140
|
|
|
(float)$ube->players[$player_id]->player_bonus->calcBonus(P_ATTACK), |
141
|
|
|
(float)$ube->players[$player_id]->player_bonus->calcBonus(P_SHIELD), |
142
|
|
|
(float)$ube->players[$player_id]->player_bonus->calcBonus(P_ARMOR), |
143
|
|
|
); |
144
|
|
|
} |
145
|
|
|
|
146
|
|
|
// Всякая информация по флотам |
147
|
|
|
foreach($ube->fleet_list->_container as $fleet_id => $UBEFleet) { |
148
|
|
|
// Сохраняем общую информацию по флотам |
149
|
|
|
$sql_perform['ube_report_fleet'][] = $UBEFleet->sql_generate_array($ube_report_id); |
150
|
|
|
|
151
|
|
|
// Сохраняем итоговую информацию по ресурсам флота - потеряно, выброшено, увезено |
152
|
|
|
$sql_perform['ube_report_outcome_fleet'][] = $UBEFleet->sql_generate_outcome_fleet_array($ube_report_id); |
153
|
|
|
|
154
|
|
|
// Сохраняем результаты по юнитам - потеряно и восстановлено |
155
|
|
|
$UBEFleet->sql_generate_outcome_unit_array($sql_perform['ube_report_outcome_unit'], $ube_report_id); |
156
|
|
|
} |
157
|
|
|
|
158
|
|
|
// Сохраняем информацию о раундах |
159
|
|
|
$ube->rounds->sql_generate_unit_array($sql_perform['ube_report_unit'], $ube_report_id, $ube->fleet_list); |
160
|
|
|
|
161
|
|
|
// Пакетная вставка данных |
162
|
|
|
// First row is a list of field names |
163
|
|
|
foreach($sql_perform as $table_name => &$table_data) { |
164
|
|
|
// If only field names in this table - doing nothing |
165
|
|
|
if(count($table_data) < 2) { |
166
|
|
|
continue; |
167
|
|
|
} |
168
|
|
|
// Picking up field names |
169
|
|
|
$fields = array_shift($table_data); |
170
|
|
|
classSupernova::$db->doInsertBatch($table_name, $table_data, $fields, DB_INSERT_PLAIN); |
|
|
|
|
171
|
|
|
} |
172
|
|
|
|
173
|
|
|
return $ube->report_cypher; |
174
|
|
|
} |
175
|
|
|
|
176
|
|
|
|
177
|
|
|
// ------------------------------------------------------------------------------------------------ |
178
|
|
|
// Читает боевой отчет из БД |
179
|
|
|
/** |
180
|
|
|
* @param $report_cypher |
181
|
|
|
* |
182
|
|
|
* @return string|UBE |
183
|
|
|
*/ |
184
|
|
|
public function sn_ube_report_load($report_cypher) { |
185
|
|
|
$report_cypher = db_escape($report_cypher); |
186
|
|
|
|
187
|
|
|
$report_row = classSupernova::$db->doSelectFetchArray("SELECT * FROM {{ube_report}} WHERE ube_report_cypher = '{$report_cypher}' LIMIT 1"); |
|
|
|
|
188
|
|
|
if(!$report_row) { |
189
|
|
|
return UBE_REPORT_NOT_FOUND; |
190
|
|
|
} |
191
|
|
|
|
192
|
|
|
$ube = new UBE(); |
193
|
|
|
$ube->load_from_report_row($report_row, $report_cypher); |
194
|
|
|
|
195
|
|
|
return $ube; |
196
|
|
|
} |
197
|
|
|
|
198
|
|
|
|
199
|
|
|
/** |
200
|
|
|
* @param UBE $ube |
201
|
|
|
* @param $template_result |
202
|
|
|
*/ |
203
|
|
|
public function sn_ube_report_generate(UBE $ube, &$template_result) { |
204
|
|
|
if(!is_object($ube)) { |
205
|
|
|
return; |
206
|
|
|
} |
207
|
|
|
|
208
|
|
|
// Обсчитываем результаты боя из начальных данных |
209
|
|
|
// Генерируем отчет по флотам |
210
|
|
|
$ube->rounds->report_render_rounds($template_result, $ube); // OK3 |
211
|
|
|
|
212
|
|
|
// Боевые потери флотов |
213
|
|
|
$template_result['.']['loss'] = $ube->fleet_list->ube_report_render_fleets_outcome($ube); |
214
|
|
|
|
215
|
|
|
// TODO: $combat_data[UBE_OPTIONS][UBE_COMBAT_ADMIN] - если админский бой не генерировать осколки и не делать луну. Сделать серверную опцию |
216
|
|
|
|
217
|
|
|
// Координаты, тип и название планеты - если есть |
218
|
|
|
//R $planet_owner_id = $combat_data[UBE_FLEETS][0][UBE_OWNER]; |
219
|
|
|
if(isset($ube->ube_planet_info)) { |
220
|
|
|
$template_result += $ube->ube_planet_info; |
221
|
|
|
$template_result[PLANET_NAME] = str_replace(' ', ' ', htmlentities($template_result[PLANET_NAME], ENT_COMPAT, 'UTF-8')); |
222
|
|
|
} |
223
|
|
|
|
224
|
|
|
// Обломки |
225
|
|
|
$debris = array(); |
226
|
|
|
foreach(array(RES_METAL, RES_CRYSTAL) as $resource_id) { |
227
|
|
|
if($resource_amount = $ube->debris->debris_get_resource($resource_id)) { |
228
|
|
|
$debris[] = array( |
229
|
|
|
'NAME' => classLocale::$lang['tech'][$resource_id], |
230
|
|
|
'AMOUNT' => pretty_number($resource_amount), |
231
|
|
|
); |
232
|
|
|
} |
233
|
|
|
} |
234
|
|
|
$template_result['.']['debris'] = $debris; |
235
|
|
|
|
236
|
|
|
$template_result += $ube->moon_calculator->report_render_moon(); |
237
|
|
|
|
238
|
|
|
$template_result += array( |
239
|
|
|
'MICROTIME' => $ube->get_time_spent(), |
240
|
|
|
'COMBAT_TIME' => $ube->combat_timestamp ? $ube->combat_timestamp + SN_CLIENT_TIME_DIFF : 0, |
241
|
|
|
'COMBAT_TIME_TEXT' => date(FMT_DATE_TIME, $ube->combat_timestamp + SN_CLIENT_TIME_DIFF), |
242
|
|
|
'COMBAT_ROUNDS' => $ube->rounds->count() - 1, |
243
|
|
|
'UBE_MISSION_TYPE' => $ube->mission_type_id, |
244
|
|
|
'UBE_REPORT_CYPHER' => $ube->get_cypher(), |
245
|
|
|
|
246
|
|
|
'PLANET_TYPE_TEXT' => classLocale::$lang['sys_planet_type_sh'][$template_result['PLANET_TYPE']], |
247
|
|
|
|
248
|
|
|
'UBE_CAPTURE_RESULT' => $ube->capture_result, |
249
|
|
|
'UBE_CAPTURE_RESULT_TEXT' => classLocale::$lang['ube_report_capture_result'][$ube->capture_result], |
250
|
|
|
|
251
|
|
|
'UBE_SFR' => $ube->is_small_fleet_recce, |
252
|
|
|
'UBE_COMBAT_RESULT' => $ube->combat_result, |
253
|
|
|
|
254
|
|
|
'MT_DESTROY' => MT_DESTROY, |
255
|
|
|
'UBE_COMBAT_RESULT_WIN' => UBE_COMBAT_RESULT_WIN, |
256
|
|
|
'UBE_COMBAT_RESULT_LOSS' => UBE_COMBAT_RESULT_LOSS, |
257
|
|
|
); |
258
|
|
|
|
259
|
|
|
} |
260
|
|
|
|
261
|
|
|
} |
262
|
|
|
|
This method has been deprecated. The supplier of the class has supplied an explanatory message.
The explanatory message should give you some clue as to whether and when the method will be removed from the class and what other method or class to use instead.