sn_ube_combat_result_apply()   F
last analyzed

Complexity

Conditions 43
Paths > 20000

Size

Total Lines 138
Code Lines 78

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 43
eloc 78
nc 276672
nop 1
dl 0
loc 138
rs 0
c 0
b 0
f 0

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
use DBAL\OldDbChangeSet;
4
use Fleet\DbFleetStatic;
5
use Planet\DBStaticPlanet;
6
use Unit\DBStaticUnit;
7
8
require_once('ube_report.php');
9
10
/*
11
12
// TODO: Для админского боя обнулять обломки до луны - что бы не создавалась луна и не писалось количество обломков
13
14
// TODO: В симуляторе все равно печтатать поле обломков и изменить надпись "Средний диаметр луны с указанным шансом %%" UBE_MOON_SIMULATED
15
16
// TODO: Отсылать каждому игроку сообщение на его языке!
17
18
// TODO: Перевод на английский
19
20
*/
21
22
/*
23
Планы
24
25
[*] UBEv4: Уменьшать каждый раунд значение общей брони кораблей на % от дамаджа, прошедшего за щиты
26
    Так будет эмулироваться распределение повреждений по всем кораблям. На этот же процент уменьшать атаку. Процент брать от брони кораблей
27
[*] UBEv4: Рандомизировать броню в самом начале боя
28
[*] UBEv4: Можно прописать разным кораблям разную стойкость ко взрыву
29
[*] UBEv4: Уровень регенерации щитов
30
[*] UBEv4: При атаке и проигрыше выбрасывать в космос излишки ресурсов со складов - часть ресурсов, которые за пределами складов. А часть - терять
31
32
[*] UBEv4: Боевые порядки юнитов
33
[*] UBEv4: Collateral damage: Взрыв корабля наносит урон соседям. Взрыв всех или только одиночек ?
34
[*] UBEv4: Регенерация брони - спецмодуль корабля. И вообще подумать о спецмодулях - скорее всего через прошивки
35
[*] UBEv4: Распределить планетарный щит в пропорции между всеми защитными сооружениями - эмуляция первого залпа. Или просто добавить такое количество щитов всем оборонам
36
[*] UBEv4: Динамическое цветовое кодирование результатов боя - для защитников отдельно, для атакующих - отдельно
37
[*] UBEv4: При отлете СН и ЗС могут уничтожить новосозданную луну (?)
38
[*] UBEv4: Броня влияет на количество брони, соотношение брони и структуры - т.е. как быстро рванет корабль, а так же на ходовые качества
39
    Типы брони: дюралюминий (легкая, но непрочная - минус к весу, минус к броне), броневая сталь (стандартная броня),
40
    легированная сталь (более прочная и более дорогая версия стальной - плюс к броне, плюс к цене), комозитная броня (по прочности, как сталь, но легче - минус к весу, плюс к цене),
41
    урановая броня (более прочная и заметно тяжелее, чем стальная - плюс к весу, плюс к броне, плюс к цене),
42
    титановая броня (хай-энд: прочная, как уран, легкая, как дюралюминия, дорогая, как пиздец)
43
    Модуль активной брони против кинетического оружия
44
[*] UBEv4: Щиты
45
    Модуль для щитов "Перегрузка": дает 200% щитов на первый залп
46
47
[*] ЧР: Инфа об удержании
48
49
[*] Симулятор: Поддержка мультифлотов. Переписать интерфейс симулятора под работу с любым количеством флотов
50
51
[*] Артефакты: Гиперсборщик - позволяет собрать обломки сразу после боя
52
53
[*] Наемники: Мародер. Капитан или офицер. +1% к вывозимым ресурсам за каждый уровень. Скажем, до +25%. Считаем от общей доли вывоза или от всех ресов на планете?
54
55
[*] Боты: Захватывать ничьи планеты
56
57
*/
58
59
if (BE_DEBUG === true) {
0 ignored issues
show
introduced by
The condition BE_DEBUG === true is always true.
Loading history...
60
  require_once('ube_zi_helpers.php');
61
}
62
63
// ------------------------------------------------------------------------------------------------
64
// Рассылает письма всем участникам боя
65
function sn_ube_message_send(&$combat_data) {
66
  global $lang;
67
68
  // TODO: Отсылать каждому игроку сообщение на его языке!
69
70
  $outcome = &$combat_data[UBE_OUTCOME];
71
  $planet_info = &$outcome[UBE_PLANET];
72
73
  // Генерируем текст письма
74
  $text_common = sprintf($lang['ube_report_msg_body_common'],
75
    date(FMT_DATE_TIME, $combat_data['UBE_TIME']),
76
    $lang['sys_planet_type_sh'][$planet_info[PLANET_TYPE]],
77
    $planet_info[PLANET_GALAXY],
78
    $planet_info[PLANET_SYSTEM],
79
    $planet_info[PLANET_PLANET],
80
    htmlentities($planet_info[PLANET_NAME], ENT_COMPAT, 'UTF-8'),
81
    $lang[$outcome['UBE_COMBAT_RESULT'] == UBE_COMBAT_RESULT_WIN ? 'ube_report_info_outcome_win' :
82
      ($outcome['UBE_COMBAT_RESULT'] == UBE_COMBAT_RESULT_DRAW ? 'ube_report_info_outcome_draw' : 'ube_report_info_outcome_loss')]
83
  );
84
85
  $text_defender = '';
86
  foreach ($outcome[UBE_DEBRIS] as $resource_id => $resource_amount) {
87
    if ($resource_id == RES_DEUTERIUM) {
88
      continue;
89
    }
90
91
    $text_defender .= "{$lang['tech'][$resource_id]}: " . HelperString::numberFloorAndFormat($resource_amount) . '<br />';
92
  }
93
  if ($text_defender) {
94
    $text_defender = "{$lang['ube_report_msg_body_debris']}{$text_defender}<br />";
95
  }
96
97
  if ($outcome[UBE_MOON] == UBE_MOON_CREATE_SUCCESS) {
98
    $text_defender .= "{$lang['ube_report_moon_created']} {$outcome[UBE_MOON_SIZE]} {$lang['sys_kilometers_short']}<br /><br />";
99
  } elseif ($outcome[UBE_MOON] == UBE_MOON_CREATE_FAILED) {
100
    $text_defender .= "{$lang['ube_report_moon_chance']} {$outcome[UBE_MOON_CHANCE]}%<br /><br />";
101
  }
102
103
  if ($combat_data[UBE_OPTIONS][UBE_MISSION_TYPE] == MT_DESTROY) {
104
    if ($outcome[UBE_MOON_REAPERS] == UBE_MOON_REAPERS_NONE) {
105
      $text_defender .= $lang['ube_report_moon_reapers_none'];
106
    } else {
107
      $text_defender .= "{$lang['ube_report_moon_reapers_wave']}. {$lang['ube_report_moon_reapers_chance']} {$outcome[UBE_MOON_DESTROY_CHANCE]}%. ";
108
      $text_defender .= $lang[$outcome[UBE_MOON] == UBE_MOON_DESTROY_SUCCESS ? 'ube_report_moon_reapers_success' : 'ube_report_moon_reapers_failure'] . "<br />";
109
110
      $text_defender .= "{$lang['ube_report_moon_reapers_outcome']} {$outcome[UBE_MOON_REAPERS_DIE_CHANCE]}%. ";
111
      $text_defender .= $lang[$outcome[UBE_MOON_REAPERS] == UBE_MOON_REAPERS_RETURNED ? 'ube_report_moon_reapers_survive' : 'ube_report_moon_reapers_died'];
112
    }
113
    $text_defender .= '<br /><br />';
114
  }
115
116
  $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>";
117
118
  // TODO: Оптимизировать отсылку сообщений - отсылать пакетами
119
  foreach ($combat_data[UBE_PLAYERS] as $player_id => $player_info) {
120
    $message = $text_common . ($outcome[UBE_SFR] && $player_info[UBE_ATTACKER] ? $lang['ube_report_msg_body_sfr'] : $text_defender);
121
    msg_send_simple_message($player_id, '', $combat_data[UBE_TIME], MSG_TYPE_COMBAT, $lang['sys_mess_tower'], $lang['sys_mess_attack_report'], $message);
122
  }
123
124
}
125
126
127
// ------------------------------------------------------------------------------------------------
128
// Записывает результат боя в БД
129
function ube_combat_result_apply(&$combat_data) { return sn_function_call('ube_combat_result_apply', array(&$combat_data)); }
130
131
function sn_ube_combat_result_apply(&$combat_data) {
132
// TODO: Поменять все отладки на запросы
133
  $destination_user_id = $combat_data[UBE_FLEETS][0][UBE_OWNER];
134
135
  $outcome = &$combat_data[UBE_OUTCOME];
136
  $planet_info = &$outcome[UBE_PLANET];
137
  $planet_id = $planet_info[PLANET_ID];
138
  // Обновляем поле обломков на планете
139
  if (!$combat_data[UBE_OPTIONS][UBE_COMBAT_ADMIN] && !empty($outcome[UBE_DEBRIS])) {
140
    DBStaticPlanet::db_planet_set_by_gspt($planet_info[PLANET_GALAXY], $planet_info[PLANET_SYSTEM], $planet_info[PLANET_PLANET], "`debris_metal` = `debris_metal` + " . floor($outcome[UBE_DEBRIS][RES_METAL]) . ", `debris_crystal` = `debris_crystal` + " . floor($outcome[UBE_DEBRIS][RES_CRYSTAL]),
141
      PT_PLANET
142
    );
143
  }
144
145
  $db_save = array(
146
    UBE_FLEET_GROUP => array(), // Для САБов
147
  );
148
149
  $fleets_outcome = &$outcome[UBE_FLEETS];
150
  foreach ($combat_data[UBE_FLEETS] as $fleet_id => &$fleet_info) {
151
    if ($fleet_info[UBE_FLEET_GROUP]) {
152
      $db_save[UBE_FLEET_GROUP][$fleet_info[UBE_FLEET_GROUP]] = $fleet_info[UBE_FLEET_GROUP];
153
    }
154
155
    $fleet_info[UBE_COUNT] = $fleet_info[UBE_COUNT] ? $fleet_info[UBE_COUNT] : array();
156
    $fleets_outcome[$fleet_id][UBE_UNITS_LOST] = $fleets_outcome[$fleet_id][UBE_UNITS_LOST] ? $fleets_outcome[$fleet_id][UBE_UNITS_LOST] : array();
157
158
    $fleet_query = array();
159
    $db_changeset = array();
160
    $old_fleet_count = array_sum($fleet_info[UBE_COUNT]);
161
    $new_fleet_count = $old_fleet_count - array_sum($fleets_outcome[$fleet_id][UBE_UNITS_LOST]);
162
    // Перебираем юниты если во время боя количество юнитов изменилось и при этом во флоту остались юниты или это планета
163
    if ($new_fleet_count != $old_fleet_count && (!$fleet_id || $new_fleet_count)) {
164
      // Просматриваем результаты изменения флотов
165
      foreach ($fleet_info[UBE_COUNT] as $unit_id => $unit_count) {
166
        // Перебираем аутком на случай восстановления юнитов
167
        $units_lost = (float)$fleets_outcome[$fleet_id][UBE_UNITS_LOST][$unit_id];
168
169
        $units_left = $unit_count - $units_lost;
170
        if ($fleet_id) {
171
          // Не планета - всегда сразу записываем строку итогов флота
172
          $fleet_query[$unit_id] = "{$unit_id},{$units_left}";
173
        } elseif ($units_lost) {
174
          // Планета - записываем в ИД юнита его потери только если есть потери
175
          $db_changeset['unit'][] = OldDbChangeSet::db_changeset_prepare_unit($unit_id, -$units_lost, $combat_data[UBE_PLAYERS][$destination_user_id][UBE_PLAYER_DATA], $planet_id);
0 ignored issues
show
Deprecated Code introduced by
The function DBAL\OldDbChangeSet::db_changeset_prepare_unit() has been deprecated. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

175
          $db_changeset['unit'][] = /** @scrutinizer ignore-deprecated */ OldDbChangeSet::db_changeset_prepare_unit($unit_id, -$units_lost, $combat_data[UBE_PLAYERS][$destination_user_id][UBE_PLAYER_DATA], $planet_id);
Loading history...
176
        }
177
      }
178
179
      if ($fleet_id) {
180
        // Для флотов перегенерируем массив как одно вхождение в SET SQL-запроса
181
        $fleet_query = array(
182
          'fleet_array' => implode(';', $fleet_query),
183
        );
184
      }
185
    }
186
187
    $fleet_delta = array();
188
    // Если во флоте остались юниты или это планета - генерируем изменение ресурсов
189
    if ($new_fleet_count || !$fleet_id) {
190
      foreach (sn_get_groups('resources_loot') as $resource_id) {
191
        $resource_change = (float)$fleets_outcome[$fleet_id][UBE_RESOURCES_LOOTED][$resource_id] + (float)$fleets_outcome[$fleet_id][UBE_CARGO_DROPPED][$resource_id];
192
        if ($resource_change) {
193
          $resource_db_name = ($fleet_id ? 'fleet_resource_' : '') . pname_resource_name($resource_id);
194
          $fleet_delta[$resource_db_name] = -($resource_change);
195
        }
196
      }
197
    }
198
199
    if ($fleet_id && $new_fleet_count) {
200
      // Если защитник и не РМФ - отправляем флот назад
201
      if (($fleet_info[UBE_FLEET_TYPE] == UBE_DEFENDERS && !$outcome[UBE_SFR]) || $fleet_info[UBE_FLEET_TYPE] == UBE_ATTACKERS) {
202
        $fleet_query['fleet_mess'] = 1;
203
      }
204
    }
205
206
    if ($fleet_id) // Не планета
207
    {
208
      if ($fleet_info[UBE_FLEET_TYPE] == UBE_ATTACKERS && $outcome[UBE_MOON_REAPERS] == UBE_MOON_REAPERS_DIED) {
209
        $new_fleet_count = 0;
210
      }
211
212
      if ($new_fleet_count) {
213
        if (!empty($fleet_query) || !empty($fleet_delta)) {
214
          $fleet_query['fleet_amount'] = $new_fleet_count;
215
          DbFleetStatic::fleet_update_set($fleet_id, $fleet_query, $fleet_delta);
216
        }
217
      } else {
218
        // Удаляем пустые флоты
219
        DbFleetStatic::db_fleet_delete($fleet_id);
220
        DBStaticUnit::db_unit_list_delete(0, LOC_FLEET, $fleet_id, 0);
221
      }
222
    } else // Планета
223
    {
224
      // Сохраняем изменения ресурсов - если они есть
225
      if (!empty($fleet_delta)) {
226
        $temp = array();
227
        foreach ($fleet_delta as $resource_db_name => $resource_amount) {
228
          $temp[] = "`{$resource_db_name}` = `{$resource_db_name}` + ({$resource_amount})";
229
        }
230
        DBStaticPlanet::db_planet_set_by_id($planet_id, implode(',', $temp));
231
      }
232
      if (!empty($db_changeset)) // Сохраняем изменения юнитов на планете - если они есть
233
      {
234
        OldDbChangeSet::db_changeset_apply($db_changeset);
0 ignored issues
show
Deprecated Code introduced by
The function DBAL\OldDbChangeSet::db_changeset_apply() has been deprecated. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

234
        /** @scrutinizer ignore-deprecated */ OldDbChangeSet::db_changeset_apply($db_changeset);
Loading history...
235
      }
236
    }
237
  }
238
239
  // TODO: Связать сабы с флотами констраинтами ON DELETE SET NULL
240
  if (!empty($db_save[UBE_FLEET_GROUP])) {
241
    DbFleetStatic::dbAcsDelete($db_save[UBE_FLEET_GROUP]);
242
243
    $db_save[UBE_FLEET_GROUP] = implode(',', $db_save[UBE_FLEET_GROUP]);
244
  }
245
246
  if ($outcome[UBE_MOON] == UBE_MOON_CREATE_SUCCESS) {
247
    $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);
248
    $outcome[UBE_MOON_NAME] = $moon_row['name'];
249
    unset($moon_row);
250
  } elseif ($outcome[UBE_MOON] == UBE_MOON_DESTROY_SUCCESS) {
251
    DBStaticPlanet::db_planet_delete_by_id($planet_id);
252
  }
253
254
  $bashing_list = array();
255
  foreach ($combat_data[UBE_PLAYERS] as $player_id => $player_info) {
256
    if ($player_info[UBE_ATTACKER]) {
257
      if ($outcome[UBE_MOON] != UBE_MOON_DESTROY_SUCCESS) {
258
        $bashing_list[] = "({$player_id}, {$planet_id}, {$combat_data[UBE_TIME]})";
259
      }
260
      if ($combat_data[UBE_OPTIONS][UBE_MISSION_TYPE] == MT_ATTACK && $combat_data[UBE_OPTIONS][UBE_DEFENDER_ACTIVE]) {
261
        $str_loose_or_win = $outcome[UBE_COMBAT_RESULT] == UBE_COMBAT_RESULT_WIN ? 'raidswin' : 'raidsloose';
262
        db_user_set_by_id($player_id, "`xpraid` = `xpraid` + 1, `raids` = `raids` + 1, `{$str_loose_or_win}` = `{$str_loose_or_win}` + 1");
0 ignored issues
show
Deprecated Code introduced by
The function db_user_set_by_id() has been deprecated. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

262
        /** @scrutinizer ignore-deprecated */ db_user_set_by_id($player_id, "`xpraid` = `xpraid` + 1, `raids` = `raids` + 1, `{$str_loose_or_win}` = `{$str_loose_or_win}` + 1");
Loading history...
263
      }
264
    }
265
  }
266
  $bashing_list = implode(',', $bashing_list);
267
  if ($bashing_list) {
268
    doquery("INSERT INTO {{bashing}} (bashing_user_id, bashing_planet_id, bashing_time) VALUES {$bashing_list};");
0 ignored issues
show
Deprecated Code introduced by
The function doquery() has been deprecated. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

268
    /** @scrutinizer ignore-deprecated */ doquery("INSERT INTO {{bashing}} (bashing_user_id, bashing_planet_id, bashing_time) VALUES {$bashing_list};");
Loading history...
269
  }
270
}
271