We could not synchronize checks via GitHub's checks API since Scrutinizer's GitHub App is not installed for this repository.
Conditions | 38 |
Paths | > 20000 |
Total Lines | 201 |
Code Lines | 108 |
Lines | 0 |
Ratio | 0 % |
Changes | 1 | ||
Bugs | 0 | Features | 0 |
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:
If many parameters/temporary variables are present:
1 | <?php declare(strict_types=1); |
||
23 | public function build(SmrAccount $account): never { |
||
24 | $db = Database::getInstance(); |
||
25 | |||
26 | $gameID = $this->gameID; |
||
27 | $game = SmrGame::getGame($gameID); |
||
28 | $galaxies = $game->getGalaxies(); |
||
29 | |||
30 | // Save the original sizes for later processing |
||
31 | $origGals = []; |
||
32 | foreach ($galaxies as $i => $galaxy) { |
||
33 | $origGals[$i] = [ |
||
34 | 'Width' => $galaxy->getWidth(), |
||
35 | 'Height' => $galaxy->getHeight(), |
||
36 | ]; |
||
37 | } |
||
38 | |||
39 | // Modify the galaxy properties |
||
40 | foreach ($galaxies as $i => $galaxy) { |
||
41 | $galaxy->setName(Request::get('gal' . $i)); |
||
42 | $galaxy->setGalaxyType(Request::get('type' . $i)); |
||
43 | $galaxy->setMaxForceTime(IFloor(Request::getFloat('forces' . $i) * 3600)); |
||
|
|||
44 | if (!$game->isEnabled()) { |
||
45 | $galaxy->setWidth(Request::getInt('width' . $i)); |
||
46 | $galaxy->setHeight(Request::getInt('height' . $i)); |
||
47 | } |
||
48 | } |
||
49 | |||
50 | // Early return if no galaxy dimensions are modified |
||
51 | $galaxySizesUnchanged = true; |
||
52 | foreach ($galaxies as $i => $galaxy) { |
||
53 | if ($galaxy->getWidth() != $origGals[$i]['Width'] || $galaxy->getHeight() != $origGals[$i]['Height']) { |
||
54 | $galaxySizesUnchanged = false; |
||
55 | break; |
||
56 | } |
||
57 | } |
||
58 | if ($galaxySizesUnchanged) { |
||
59 | SmrGalaxy::saveGalaxies(); |
||
60 | $message = '<span class="green">SUCCESS: </span>Edited galaxies (sizes unchanged).'; |
||
61 | $container = new EditGalaxy($this->gameID, $this->galaxyID, $message); |
||
62 | $container->go(); |
||
63 | } |
||
64 | |||
65 | // *** BEGIN GALAXY DIMENSION MODIFICATION! *** |
||
66 | // Warning: This changes primary keys for several tables, which needs to be |
||
67 | // done carefully. It also interacts with the caches in unexpected ways. |
||
68 | // *** BEGIN GALAXY DIMENSION MODIFICATION! *** |
||
69 | |||
70 | // Efficiently construct the caches before proceeding |
||
71 | // NOTE: these will be associated with the old sector IDs, so the caches |
||
72 | // will need to be cleared afterwards. |
||
73 | foreach ($galaxies as $galaxy) { |
||
74 | $galaxy->getSectors(); |
||
75 | $galaxy->getPorts(); |
||
76 | $galaxy->getLocations(); |
||
77 | $galaxy->getPlanets(); |
||
78 | } |
||
79 | |||
80 | // Determine the mapping from old to new sector IDs |
||
81 | $newID = 0; |
||
82 | $oldID = 0; |
||
83 | $sectorMap = []; |
||
84 | foreach ($galaxies as $i => $galaxy) { |
||
85 | $maxRows = max($galaxy->getHeight(), $origGals[$i]['Height']); |
||
86 | $maxCols = max($galaxy->getWidth(), $origGals[$i]['Width']); |
||
87 | for ($row = 0; $row < $maxRows; $row++) { |
||
88 | for ($col = 0; $col < $maxCols; $col++) { |
||
89 | $oldExists = ($row < $origGals[$i]['Height'] && $col < $origGals[$i]['Width']); |
||
90 | $newExists = ($row < $galaxy->getHeight() && $col < $galaxy->getWidth()); |
||
91 | |||
92 | if ($oldExists && $newExists) { |
||
93 | $oldID++; |
||
94 | $newID++; |
||
95 | $sectorMap[$newID] = $oldID; |
||
96 | } elseif ($newExists) { |
||
97 | $newID++; |
||
98 | $sectorMap[$newID] = false; |
||
99 | } elseif ($oldExists) { |
||
100 | $oldID++; |
||
101 | // Remove this sector and everything in it |
||
102 | $delSector = SmrSector::getSector($gameID, $oldID); |
||
103 | $delSector->removeAllFixtures(); |
||
104 | $db->write('DELETE FROM sector WHERE ' . $delSector->getSQL()); |
||
105 | } |
||
106 | } |
||
107 | } |
||
108 | } |
||
109 | |||
110 | // Save remaining old warps to re-add later, then clear all warp data. |
||
111 | // This is necessary because we will be manually modifying sector IDs. |
||
112 | $oldWarps = []; |
||
113 | foreach ($galaxies as $galaxy) { |
||
114 | foreach ($galaxy->getSectors() as $galSector) { |
||
115 | if ($galSector->hasWarp()) { |
||
116 | $oldWarps[$galSector->getSectorID()] = $galSector->getWarp(); |
||
117 | } |
||
118 | } |
||
119 | } |
||
120 | $db->write('UPDATE sector SET warp = 0 WHERE game_id = ' . $db->escapeNumber($gameID)); |
||
121 | |||
122 | // Many sectors will have their IDs shifted up or down, so we need to modify |
||
123 | // the primary keys for the sector table as well as planets, ports, etc. |
||
124 | // We have to do this in a loop to ensure that the new sector ID will not |
||
125 | // collide with an old sector ID that hasn't been shifted yet (because we |
||
126 | // may be both adding and removing sectors). |
||
127 | // |
||
128 | // NOTE: We have already accounted for collisions from removing sectors by |
||
129 | // deleting all fixtures from sectors that will no longer exist. |
||
130 | $needsUpdate = $sectorMap; |
||
131 | while ($needsUpdate) { |
||
132 | foreach ($needsUpdate as $newID => $oldID) { |
||
133 | // If sector is new or has the same ID, then no shifting is necessary |
||
134 | if ($oldID === false || $oldID == $newID) { |
||
135 | unset($needsUpdate[$newID]); |
||
136 | continue; |
||
137 | } |
||
138 | |||
139 | // If the oldID still exists, then we have to defer shifting until |
||
140 | // this destination has been vacated. |
||
141 | if (array_search($newID, $needsUpdate)) { |
||
142 | continue; |
||
143 | } |
||
144 | |||
145 | // Else we are ready to shift from oldID to newID |
||
146 | $oldSector = SmrSector::getSector($gameID, $oldID); |
||
147 | $SQL = 'SET sector_id = ' . $db->escapeNumber($newID) . ' WHERE ' . $oldSector->getSQL(); |
||
148 | |||
149 | if ($oldSector->hasPlanet()) { |
||
150 | $db->write('UPDATE planet ' . $SQL); |
||
151 | $db->write('UPDATE planet_has_building ' . $SQL); |
||
152 | $db->write('UPDATE planet_has_cargo ' . $SQL); |
||
153 | $db->write('UPDATE planet_has_weapon ' . $SQL); |
||
154 | } |
||
155 | |||
156 | if ($oldSector->hasPort()) { |
||
157 | $db->write('UPDATE port ' . $SQL); |
||
158 | $db->write('UPDATE port_has_goods ' . $SQL); |
||
159 | } |
||
160 | |||
161 | if ($oldSector->hasLocation()) { |
||
162 | $db->write('UPDATE location ' . $SQL); |
||
163 | } |
||
164 | |||
165 | $db->write('UPDATE sector ' . $SQL); |
||
166 | unset($needsUpdate[$newID]); |
||
167 | } |
||
168 | } |
||
169 | |||
170 | // Clear all the caches, since they are associated with the old IDs. |
||
171 | // NOTE: We can't re-initialize the cache here because the sectors |
||
172 | // still have the wrong galaxy ID at this point. |
||
173 | SmrSector::clearCache(); |
||
174 | SmrPort::clearCache(); |
||
175 | SmrPlanet::clearCache(); |
||
176 | SmrLocation::clearCache(); |
||
177 | |||
178 | // Create any new sectors that need to be made |
||
179 | foreach ($sectorMap as $newID => $oldID) { |
||
180 | if ($oldID === false) { |
||
181 | SmrSector::createSector($gameID, $newID); |
||
182 | } |
||
183 | } |
||
184 | |||
185 | // Finally, modify sector properties (galaxy ID, links, and warps) |
||
186 | foreach ($sectorMap as $newID => $oldID) { |
||
187 | $newSector = SmrSector::getSector($gameID, $newID); |
||
188 | |||
189 | // Update the galaxy ID |
||
190 | // NOTE: this must be done before SmrGalaxy::getSectors is called |
||
191 | foreach ($galaxies as $galaxy) { |
||
192 | if ($galaxy->contains($newID)) { |
||
193 | $newSector->setGalaxyID($galaxy->getGalaxyID()); |
||
194 | } |
||
195 | } |
||
196 | |||
197 | // Update the sector connections |
||
198 | foreach (['Up', 'Down', 'Left', 'Right'] as $dir) { |
||
199 | if ($oldID === false) { |
||
200 | // No sector walls for newly added sectors |
||
201 | $newSector->enableLink($dir); |
||
202 | } else { |
||
203 | // Toggle links twice to reset them (since this internally handles |
||
204 | // the calculation of the neighboring sector IDs). |
||
205 | $newSector->toggleLink($dir); |
||
206 | $newSector->toggleLink($dir); |
||
207 | } |
||
208 | } |
||
209 | |||
210 | // Update the warp |
||
211 | if ($oldID !== false && isset($oldWarps[$oldID])) { |
||
212 | $oldWarpID = $oldWarps[$oldID]; |
||
213 | $newWarpID = array_search($oldWarpID, $sectorMap); |
||
214 | $newSector->setWarp(SmrSector::getSector($gameID, $newWarpID)); |
||
215 | } |
||
216 | } |
||
217 | |||
218 | SmrGalaxy::saveGalaxies(); |
||
219 | SmrSector::saveSectors(); |
||
220 | |||
221 | $message = '<span class="green">SUCCESS: </span>Edited galaxies (sizes have changed).'; |
||
222 | $container = new EditGalaxy($this->gameID, $this->galaxyID, $message); |
||
223 | $container->go(); |
||
224 | } |
||
227 |