Completed
Push — trunk ( 0e7a2e...6a6c5e )
by SuperNova.WS
07:28
created

PageImperium::fleetGetFlyingToPlanets()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 7
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 6

Importance

Changes 0
Metric Value
cc 2
eloc 4
nc 2
nop 1
dl 0
loc 7
ccs 0
cts 6
cp 0
crap 6
rs 9.4285
c 0
b 0
f 0
1
<?php
2
/**
3
 * Created by Gorlum 01.10.2017 17:53
4
 */
5
6
namespace Pages\Deprecated;
7
8
use \template;
9
use \classLocale;
10
use Planet\DBStaticPlanet;
11
use \HelperString;
12
13
class PageImperium {
14
15
  const GROUPS_TO_NAMES = [
16
    UNIT_STRUCTURES         => 'structures',
17
    UNIT_STRUCTURES_SPECIAL => 'structures',
18
    UNIT_SHIPS              => 'fleet',
19
    UNIT_DEFENCE            => 'defense',
20
  ];
21
22
  /**
23
   * @var classLocale $lang ;
24
   */
25
  protected $lang;
26
27
28
  /**
29
   * @param template|null $template
30
   */
31
  public static function viewStatic(template $template = null) {
32
    $that = new static();
33
34
    $template = $that->view($template);
35
    unset($that);
36
37
    return $template;
38
  }
39
40
  /**
41
   * @param template|null $template
42
   */
43
  public static function modelStatic(template $template = null) {
44
    $that = new static();
45
46
    $that->modelAdjustMinePercent();
47
    unset($that);
48
49
    return $template;
50
  }
51
52
  public function __construct() {
53
    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...
54
    $this->lang = $lang;
55
  }
56
57
  /**
58
   * @param template|null $template
59
   *
60
   * @return template
61
   */
62
  public function view(template $template = null) {
63
    global $user;
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...
64
65
    list($planets, $ques) = $this->getUpdatedUserPlanetsAndQues($user);
66
    $fleets = $this->fleetGetFlyingToPlanets($planets);
67
68
    $template = gettemplate('imperium', $template);
69
70
    $template->assign_recursive(templateFillPercent());
71
72
    $template->assign_recursive($this->tplRenderPlanets($user, $planets, $fleets));
73
    $template->assign_recursive($this->tplRenderFleets($planets, $fleets));
74
    $this->tplTotalPlanetInfo($template, $planets);
75
76
    foreach (self::GROUPS_TO_NAMES as $unit_group_id => $internalGroupName) {
77
      $template->assign_block_vars('prods', array(
78
        'NAME' => $this->lang['tech'][$unit_group_id],
79
      ));
80
      $this->imperiumTemplatizeUnitGroup($user, $template, $unit_group_id, $planets, $ques, $fleets);
81
    }
82
83
    $template->assign_var('amount', count($planets) + 2);
84
    $this->tplAddGlobals($user, $template);
85
86
    return $template;
87
  }
88
89
  /**
90
   * Store current mines load in DB
91
   */
92
  protected function modelAdjustMinePercent() {
93
    global $user;
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...
94
95
    if (!sys_get_param('save_production') || !is_array($production = sys_get_param('percent')) || empty($production)) {
96
      return;
97
    }
98
99
    $sn_group_factories = sn_get_groups('factories');
100
101
    foreach (DBStaticPlanet::db_planet_list_sorted($user, false, '*') as $planetId => $planet) {
0 ignored issues
show
Bug introduced by
The expression Planet\DBStaticPlanet::d...rted($user, false, '*') of type false is not traversable.
Loading history...
102
      $query = [];
103
      foreach ($sn_group_factories as $factory_unit_id) {
104
        $unit_db_name_porcent = pname_factory_production_field_name($factory_unit_id);
105
        if (
106
          // Changes required to mine production
107
          isset($production[$factory_unit_id][$planet['id']])
108
          // If mine is managed
109
          && get_unit_param($factory_unit_id, P_MINING_IS_MANAGED)
110
          // Input value is valid
111
          && ($actual_porcent = intval($production[$factory_unit_id][$planet['id']] / 10)) >= 0
112
          && $actual_porcent <= 10
113
          // And changes really should be stored to DB
114
          && $actual_porcent != $planet[$unit_db_name_porcent]
115
        ) {
116
          $actual_porcent = intval($actual_porcent);
117
          $query[] = "`{$unit_db_name_porcent}` = {$actual_porcent}";
118
        }
119
      }
120
121
      if (!empty($query)) {
122
        DBStaticPlanet::db_planet_set_by_id($planet['id'], implode(',', $query));
123
      }
124
    }
125
  }
126
127
  /**
128
   * @param array $user
129
   *
130
   * @return array[]
131
   */
132
  protected function getUpdatedUserPlanetsAndQues($user) {
133
    $planets = array();
134
    $ques = array();
135
    $planet_row_list = DBStaticPlanet::db_planet_list_sorted($user);
136
    foreach ($planet_row_list as $planet) {
0 ignored issues
show
Bug introduced by
The expression $planet_row_list of type false is not traversable.
Loading history...
137
      sn_db_transaction_start();
138
      $global_data = sys_o_get_updated($user, $planet['id'], SN_TIME_NOW, false, true);
139
      $planets[$planet['id']] = $global_data['planet'];
140
      $ques[$planet['id']] = $global_data['que'];
141
      sn_db_transaction_commit();
142
    }
143
144
    return array($planets, $ques);
145
  }
146
147
  /**
148
   * @param array    $user
149
   * @param template $template
150
   * @param int      $unit_group_id
151
   * @param array[]  $planets
152
   * @param array[]  $ques
153
   * @param array    $fleets
154
   */
155
  protected function imperiumTemplatizeUnitGroup(&$user, $template, $unit_group_id, $planets, $ques, $fleets) {
156
    $sn_group_factories = sn_get_groups('factories');
157
158
    foreach (get_unit_param('techtree', $unit_group_id) as $unit_id) {
159
      $unit_count = $unit_count_abs = 0;
160
      $block_vars = array();
161
      $unit_is_factory = in_array($unit_id, $sn_group_factories) && get_unit_param($unit_id, P_MINING_IS_MANAGED);
162
      foreach ($planets as $planet) {
163
        $unit_level_plain = mrc_get_level($user, $planet, $unit_id, false, true);
164
165
        $levelGreen = 0;
166
        $levelYellow = 0;
167
168
        switch ($unit_group_id) {
169
          /** @noinspection PhpMissingBreakStatementInspection */
170
          case UNIT_SHIPS:
0 ignored issues
show
Coding Style introduced by
There must be a comment when fall-through is intentional in a non-empty case body
Loading history...
171
            $levelYellow = !empty($fleets[$planet['id']]['own']['total'][$unit_id]) ? floatval($fleets[$planet['id']]['own']['total'][$unit_id]) : 0;
172
173
          case UNIT_STRUCTURES:
174
          case UNIT_STRUCTURES_SPECIAL:
175
          case UNIT_DEFENCE:
176
            $levelGreen = floatval($ques[$planet['id']]['in_que'][que_get_unit_que($unit_id)][$user['id']][$planet['id']][$unit_id]);
177
          break;
178
179
          default:
180
          break;
181
        }
182
        $unitsPresentOrChanged = $unit_level_plain + abs($levelYellow) + abs($levelGreen);
183
184
        $unit_count += $unit_level_plain;
185
        $unit_count_abs += $unitsPresentOrChanged;
186
187
        $block_vars[] = [
188
          'ID'                     => $planet['id'],
189
          'TYPE'                   => $planet['planet_type'],
190
          'LEVEL'                  => $unitsPresentOrChanged ? $unit_level_plain : '-',
191
          'LEVEL_PLUS_YELLOW'      => $levelYellow,
192
          'LEVEL_PLUS_GREEN'       => $levelGreen,
193
          'LEVEL_TEXT'             => $unitsPresentOrChanged ? HelperString::numberFloorAndFormat($unit_level_plain) : '-',
0 ignored issues
show
Bug introduced by
It seems like $unit_level_plain can also be of type boolean; however, parameter $number of HelperString::numberFloorAndFormat() does only seem to accept integer|double, maybe add an additional type check? ( Ignorable by Annotation )

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

193
          'LEVEL_TEXT'             => $unitsPresentOrChanged ? HelperString::numberFloorAndFormat(/** @scrutinizer ignore-type */ $unit_level_plain) : '-',
Loading history...
194
          'LEVEL_PLUS_YELLOW_TEXT' => tplPrettyPlus($levelYellow),
195
          'LEVEL_PLUS_GREEN_TEXT'  => tplPrettyPlus($levelGreen),
196
          'PERCENT'                => $unit_is_factory ? ($unit_level_plain ? $planet[pname_factory_production_field_name($unit_id)] * 10 : -1) : -1,
197
          'FACTORY'                => $unit_is_factory,
198
        ];
199
      }
200
201
      if ($unit_count_abs) {
202
        $this->tplRenderUnitLine($template, $unit_id, $block_vars, $unit_count, $unit_is_factory);
0 ignored issues
show
Bug introduced by
It seems like $unit_count can also be of type double; however, parameter $unit_count of Pages\Deprecated\PageImperium::tplRenderUnitLine() does only seem to accept integer, maybe add an additional type check? ( Ignorable by Annotation )

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

202
        $this->tplRenderUnitLine($template, $unit_id, $block_vars, /** @scrutinizer ignore-type */ $unit_count, $unit_is_factory);
Loading history...
203
      }
204
    }
205
  }
206
207
  /**
208
   * Renders line of unit for each planet
209
   *
210
   * @param template $template
211
   * @param int      $unit_id
212
   * @param array    $block_vars
213
   * @param int      $unit_count
214
   * @param bool     $unit_is_factory
215
   *
216
   */
217
  protected function tplRenderUnitLine($template, $unit_id, $block_vars, $unit_count, $unit_is_factory) {
218
    // Adding unit cell name
219
    $template->assign_block_vars('prods', [
220
      'ID'    => $unit_id,
221
      'FIELD' => 'unit_' . $unit_id, // TODO Делать это прямо в темплейте
222
      'NAME'  => $this->lang['tech'][$unit_id],
223
      'MODE'  => static::GROUPS_TO_NAMES[get_unit_param($unit_id, P_UNIT_TYPE)],
224
    ]);
225
226
    $imperiumYellows = [];
227
    $imperiumGreens = [];
228
    // Adding data for each planet for this unit
229
    foreach ($block_vars as $block_var) {
230
      $imperiumYellows[$unit_id] += $block_var['LEVEL_PLUS_YELLOW'];
231
      $imperiumGreens[$unit_id] += $block_var['LEVEL_PLUS_GREEN'];
232
      $template->assign_block_vars('prods.planet', $block_var);
233
    }
234
235
    // Adding final cell with Imperium total stat about this unit
236
    $template->assign_block_vars('prods.planet', [
237
      'ID'                     => 0,
238
      'LEVEL'                  => $unit_count,
239
      'LEVEL_TEXT'             => HelperString::numberFloorAndFormat($unit_count),
240
      'LEVEL_PLUS_YELLOW'      => $imperiumYellows[$unit_id],
241
      'LEVEL_PLUS_GREEN'       => $imperiumGreens[$unit_id],
242
      'LEVEL_PLUS_YELLOW_TEXT' => $imperiumYellows[$unit_id] == 0 ? '' : tplPrettyPlus($imperiumYellows[$unit_id]),
243
      'LEVEL_PLUS_GREEN_TEXT'  => $imperiumGreens[$unit_id] == 0 ? '' : tplPrettyPlus($imperiumGreens[$unit_id]),
244
      'PERCENT'                => $unit_is_factory ? '' : -1,
245
      'FACTORY'                => $unit_is_factory,
246
    ]);
247
  }
248
249
  /**
250
   * @param array[] $planets
251
   * @param array   $fleets
252
   *
253
   * @return array[][]
254
   */
255
  protected function tplRenderPlanets($user, &$planets, $fleets) {
256
    $result = [];
257
258
    $planet_density = sn_get_groups('planet_density');
259
260
    foreach ($planets as $planetId => $planet) {
261
      $templatizedPlanet = tpl_parse_planet($user, $planet);
262
263
      $fleet_list = $fleets[$planetId];
264
      foreach ([RES_METAL, RES_CRYSTAL, RES_DEUTERIUM] as $resourceId) {
265
        if (empty($fleet_list['own']['total'][$resourceId])) {
266
          $templatizedPlanet['RES_' . $resourceId] = 0;
267
        } else {
268
          $templatizedPlanet['RES_' . $resourceId] = $fleet_list['own']['total'][$resourceId];
269
          $templatizedPlanet['RES_' . $resourceId . '_TEXT'] = HelperString::numberFloorAndFormat($fleet_list['own']['total'][$resourceId]);
270
        }
271
      }
272
      $templatizedPlanet += tpl_parse_planet_result_fleet($planet, $fleet_list);
273
274
      $templatizedPlanet += [
275
        'METAL_CUR'  => prettyNumberStyledCompare($planet['metal'], $planet['metal_max']),
276
        'METAL_PROD' => $planet['metal_perhour'],
277
278
        'CRYSTAL_CUR'  => prettyNumberStyledCompare($planet['crystal'], $planet['crystal_max']),
279
        'CRYSTAL_PROD' => $planet['crystal_perhour'],
280
281
        'DEUTERIUM_CUR'  => prettyNumberStyledCompare($planet['deuterium'], $planet['deuterium_max']),
282
        'DEUTERIUM_PROD' => $planet['deuterium_perhour'],
283
284
        'ENERGY_CUR' => $planet['energy_max'] - $planet['energy_used'],
285
        'ENERGY_MAX' => $planet['energy_max'],
286
287
        'TEMP_MIN' => $planet['temp_min'],
288
        'TEMP_MAX' => $planet['temp_max'],
289
290
        'DENSITY_CLASS'      => $planet['density_index'],
291
        'DENSITY_RICHNESS'   => $planet_density[$planet['density_index']][UNIT_PLANET_DENSITY_RICHNESS],
292
        'DENSITY_CLASS_TEXT' => $this->lang['uni_planet_density_types'][$planet['density_index']],
293
      ];
294
295
      $result[] = $templatizedPlanet;
296
    }
297
298
    return [
299
      '.' => [
300
        'planet' => $result
301
      ]
302
    ];
303
  }
304
305
  /**
306
   * @param array[] $planets
307
   * @param array[] $fleets
308
   *
309
   * @return array
310
   */
311
  protected function tplRenderFleets($planets, $fleets) {
312
    $fleetsRendered = [];
313
    foreach ($fleets as $planetId => $fleet_list) {
314
      if (!empty($fleet_list['own']['count'])) {
315
        $fleetsRendered[$planets[$planetId]['id']] = tpl_parse_fleet_sn($fleet_list['own']['total'], getUniqueFleetId(['id' => $planetId]));
316
      }
317
    }
318
319
    return tpl_assign_fleet_generate($fleetsRendered);
320
  }
321
322
  /**
323
   * @param array[] $planets
324
   *
325
   * @return array
326
   */
327
  protected function fleetGetFlyingToPlanets(&$planets) {
328
    $fleets = [];
329
    foreach ($planets as $planetId => &$planet) {
330
      $fleets[$planet['id']] = flt_get_fleets_to_planet($planet);
331
    }
332
333
    return $fleets;
334
  }
335
336
  /**
337
   * @param template $template
338
   * @param array    $planets
339
   */
340
  function tplTotalPlanetInfo($template, $planets) {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
341
    $imperiumStats = [
342
      'temp_min' => 1000,
343
      'temp_max' => -999,
344
    ];
345
346
    foreach ($planets as $planetId => &$planet) {
347
      $imperiumStats['fields'] += $planet['field_current'];
348
      $imperiumStats['metal'] += $planet['metal'];
349
      $imperiumStats['crystal'] += $planet['crystal'];
350
      $imperiumStats['deuterium'] += $planet['deuterium'];
351
      $imperiumStats['energy'] += $planet['energy_max'] - $planet['energy_used'];
352
353
      $imperiumStats['fields_max'] += eco_planet_fields_max($planet);
354
      $imperiumStats['metal_perhour'] += $planet['metal_perhour'];
355
      $imperiumStats['crystal_perhour'] += $planet['crystal_perhour'];
356
      $imperiumStats['deuterium_perhour'] += $planet['deuterium_perhour'];
357
      $imperiumStats['energy_max'] += $planet['energy_max'];
358
359
      $imperiumStats['temp_min'] = min($planet['temp_min'], $imperiumStats['temp_min']);
360
      $imperiumStats['temp_max'] = max($planet['temp_max'], $imperiumStats['temp_max']);
361
    }
362
363
    $template->assign_block_vars('planet', array_merge([
364
      'ID'   => 0,
365
      'NAME' => $this->lang['sys_total'],
366
367
      'FIELDS_CUR' => $imperiumStats['fields'],
368
      'FIELDS_MAX' => $imperiumStats['fields_max'],
369
370
      'METAL_CUR'  => HelperString::numberFloorAndFormat($imperiumStats['metal']),
371
      'METAL_PROD' => $imperiumStats['metal_perhour'],
372
373
      'CRYSTAL_CUR'  => HelperString::numberFloorAndFormat($imperiumStats['crystal']),
374
      'CRYSTAL_PROD' => $imperiumStats['crystal_perhour'],
375
376
      'DEUTERIUM_CUR'  => HelperString::numberFloorAndFormat($imperiumStats['deuterium']),
377
      'DEUTERIUM_PROD' => $imperiumStats['deuterium_perhour'],
378
379
      'ENERGY_CUR' => $imperiumStats['energy'],
380
      'ENERGY_MAX' => $imperiumStats['energy_max'],
381
382
      'TEMP_MIN' => $imperiumStats['temp_min'],
383
      'TEMP_MAX' => $imperiumStats['temp_max'],
384
    ]));
385
  }
386
387
  /**
388
   * @param array    $user
389
   * @param template $template
390
   */
391
  protected function tplAddGlobals(&$user, $template) {
392
    $template->assign_vars([
393
      'COLONIES_CURRENT' => get_player_current_colonies($user),
394
      'COLONIES_MAX'     => get_player_max_colonies($user),
395
396
      'EXPEDITIONS_CURRENT' => fleet_count_flying($user['id'], MT_EXPLORE),
397
      'EXPEDITIONS_MAX'     => get_player_max_expeditons($user),
398
399
      'PLANET_DENSITY_RICHNESS_NORMAL'  => PLANET_DENSITY_RICHNESS_NORMAL,
400
      'PLANET_DENSITY_RICHNESS_AVERAGE' => PLANET_DENSITY_RICHNESS_AVERAGE,
401
      'PLANET_DENSITY_RICHNESS_GOOD'    => PLANET_DENSITY_RICHNESS_GOOD,
402
      'PLANET_DENSITY_RICHNESS_PERFECT' => PLANET_DENSITY_RICHNESS_PERFECT,
403
404
      'PAGE_HEADER' => $this->lang['imp_overview'],
405
    ]);
406
  }
407
408
}
409