Completed
Push — trunk ( 5a98ee...c2d255 )
by SuperNova.WS
04:09
created

ube_attack_prepare_fleet()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 1
Code Lines 0

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 0
nc 1
nop 3
dl 0
loc 1
rs 10
c 0
b 0
f 0
1
<?php
0 ignored issues
show
Coding Style Compatibility introduced by
For compatibility and reusability of your code, PSR1 recommends that a file should introduce either new symbols (like classes, functions, etc.) or have side-effects (like outputting something, or including other files), but not both at the same time. The first symbol is defined on line 60 and the first side effect is on line 3.

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.

Loading history...
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) {
0 ignored issues
show
introduced by
The condition BE_DEBUG === true can never be false.
Loading history...
55
  require_once('ube_zi_helpers.php');
56
}
57
58
// ------------------------------------------------------------------------------------------------
59
// Рассылает письма всем участникам боя
60
function sn_ube_message_send(&$combat_data) {
61
  global $lang;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
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);
0 ignored issues
show
Deprecated Code introduced by
The function 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

170
          $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...
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);
0 ignored issues
show
Deprecated Code introduced by
The function 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

229
        /** @scrutinizer ignore-deprecated */ OldDbChangeSet::db_changeset_apply($db_changeset);
Loading history...
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");
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

256
        /** @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...
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