Scrutinizer GitHub App not installed

We could not synchronize checks via GitHub's checks API since Scrutinizer's GitHub App is not installed for this repository.

Install GitHub App

Failed Conditions
Pull Request — main (#1494)
by Dan
10:59 queued 05:29
created

SaveProcessor::build()   F

Complexity

Conditions 36
Paths 9

Size

Total Lines 154
Code Lines 102

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 36
eloc 102
nc 9
nop 1
dl 0
loc 154
rs 3.3333
c 1
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 declare(strict_types=1);
2
3
namespace Smr\Pages\Admin\UniGen;
4
5
use Exception;
6
use Smr\Exceptions\UserError;
7
use Smr\Page\AccountPageProcessor;
8
use Smr\PlanetTypes\PlanetType;
9
use Smr\Race;
10
use Smr\Request;
11
use SmrAccount;
12
use SmrGalaxy;
13
use SmrLocation;
14
use SmrPort;
15
use SmrSector;
16
17
/**
18
 * @param array<int, SmrSector> $sectors
19
 * @param callable $condition True if sector is valid
20
 */
21
function findValidSector(array $sectors, callable $condition): SmrSector {
22
	if (count($sectors) == 0) {
23
		throw new UserError('There are no eligible sectors for this action!');
24
	}
25
	$key = array_rand($sectors);
26
	$sector = $sectors[$key];
27
	if ($condition($sector) !== true) {
28
		unset($sectors[$key]);
29
		return findValidSector($sectors, $condition);
30
	}
31
	return $sector;
32
}
33
34
function checkSectorAllowedForLoc(SmrSector $sector, SmrLocation $location): bool {
35
	if ($location->isHQ()) {
36
		// Only add HQs to empty sectors
37
		return !$sector->hasLocation();
38
	}
39
	// Otherwise, sector must meet these conditions:
40
	// 1. Does not already have this location
41
	// 2. Has fewer than 4 other locations
42
	// 3. Does not offer Fed protection
43
	return count($sector->getLocations()) < 4 && !$sector->offersFederalProtection() && !$sector->hasLocation($location->getTypeID());
44
}
45
46
function addLocationToSector(SmrLocation $location, SmrSector $sector): void {
47
	$sector->addLocation($location); //insert the location
48
	if ($location->isHQ()) {
49
		//only playable races have extra locations to add
50
		//Racial/Fed
51
		foreach ($location->getLinkedLocations() as $linkedLocation) {
52
			if (!$sector->hasLocation($linkedLocation->getTypeID())) {
53
				$sector->addLocation($linkedLocation);
54
			}
55
			if ($linkedLocation->isFed()) {
56
				$fedBeacon = $linkedLocation;
57
			}
58
		}
59
60
		//add Beacons to all surrounding areas (up to 2 sectors out)
61
		$visitedSectors = [];
62
		$links = ['Up', 'Right', 'Down', 'Left'];
63
		$fedSectors = [$sector];
64
		$tempFedSectors = [];
65
		for ($i = 0; $i < DEFAULT_FED_RADIUS; $i++) {
66
			foreach ($fedSectors as $fedSector) {
67
				foreach ($links as $link) {
68
					if ($fedSector->hasLink($link) && !isset($visitedSectors[$fedSector->getLink($link)])) {
69
						$linkSector = $sector->getLinkSector($link);
70
						if (isset($fedBeacon) && !$linkSector->hasLocation($fedBeacon->getTypeID())) {
71
							$linkSector->addLocation($fedBeacon); //add beacon to this sector
72
						}
73
						$tempFedSectors[] = $linkSector;
74
						$visitedSectors[$fedSector->getLink($link)] = true;
75
					}
76
				}
77
			}
78
			$fedSectors = $tempFedSectors;
79
			$tempFedSectors = [];
80
		}
81
	}
82
}
83
84
85
class SaveProcessor extends AccountPageProcessor {
86
87
	public function __construct(
88
		private readonly int $gameID,
89
		private readonly int $galaxyID
90
	) {}
91
92
	public function build(SmrAccount $account): never {
93
		$submit = Request::get('submit');
94
95
		if ($submit == 'Redo Connections') {
96
			$galaxy = SmrGalaxy::getGalaxy($this->gameID, $this->galaxyID);
97
			$connectivity = Request::getFloat('connect');
98
			if (!$galaxy->setConnectivity($connectivity)) {
99
				$message = '<span class="red">Error</span> : Regenerating connections failed.';
100
			} else {
101
				$message = '<span class="green">Success</span> : Regenerated connectivity with ' . $connectivity . '% target.';
102
			}
103
			SmrSector::saveSectors();
104
		} elseif ($submit == 'Create Locations') {
105
			$galSectors = SmrSector::getGalaxySectors($this->gameID, $this->galaxyID);
106
			foreach ($galSectors as $galSector) {
107
				$galSector->removeAllLocations();
108
			}
109
			foreach (SmrLocation::getAllLocations($this->gameID) as $location) {
110
				if (Request::has('loc' . $location->getTypeID())) {
111
					$numLoc = Request::getInt('loc' . $location->getTypeID());
112
					for ($i = 0; $i < $numLoc; $i++) {
113
						//4 per sector max locs and no locations inside fed
114
						$randSector = findValidSector(
115
							$galSectors,
116
							fn(SmrSector $sector): bool => checkSectorAllowedForLoc($sector, $location)
117
						);
118
						addLocationToSector($location, $randSector);
119
					}
120
				}
121
			}
122
			$message = '<span class="green">Success</span> : Succesfully added locations.';
123
		} elseif ($submit == 'Create Warps') {
124
			//get all warp info from all gals, some need to be removed, some need to be added
125
			$galaxy = SmrGalaxy::getGalaxy($this->gameID, $this->galaxyID);
126
			$galSectors = $galaxy->getSectors();
127
			//get totals
128
			foreach ($galSectors as $galSector) {
129
				if ($galSector->hasWarp()) {
130
					$galSector->removeWarp();
131
				}
132
			}
133
			//iterate over all the galaxies
134
			$galaxies = SmrGalaxy::getGameGalaxies($this->gameID);
135
			foreach ($galaxies as $eachGalaxy) {
136
				//do we have a warp to this gal?
137
				if (Request::has('warp' . $eachGalaxy->getGalaxyID())) {
138
					// Sanity check the number
139
					$numWarps = Request::getInt('warp' . $eachGalaxy->getGalaxyID());
140
					if ($numWarps > 10) {
141
						create_error('Specify no more than 10 warps between two galaxies!');
142
					}
143
					//iterate for each warp to this gal
144
					for ($i = 1; $i <= $numWarps; $i++) {
145
						//only 1 warp per sector
146
						$galSector = findValidSector(
147
							$galSectors,
148
							fn(SmrSector $sector): bool => !$sector->hasWarp() && !$sector->offersFederalProtection()
149
						);
150
						//get other side
151
						//make sure it does not go to itself
152
						$otherSector = findValidSector(
153
							$eachGalaxy->getSectors(),
154
							fn(SmrSector $sector): bool => !$sector->hasWarp() && !$sector->offersFederalProtection() && !$sector->equals($galSector)
155
						);
156
						$galSector->setWarp($otherSector);
157
					}
158
				}
159
			}
160
			SmrSector::saveSectors();
161
			$message = '<span class="green">Success</span> : Succesfully added warps.';
162
			(new CreateWarps($this->gameID, $this->galaxyID, $message))->go();
163
		} elseif ($submit == 'Create Planets') {
164
			$galaxy = SmrGalaxy::getGalaxy($this->gameID, $this->galaxyID);
165
			$galSectors = $galaxy->getSectors();
166
			foreach ($galSectors as $galSector) {
167
				if ($galSector->hasPlanet()) {
168
					$galSector->removePlanet();
169
				}
170
			}
171
172
			foreach (array_keys(PlanetType::PLANET_TYPES) as $planetTypeID) {
173
				$numberOfPlanets = Request::getInt('type' . $planetTypeID);
174
				for ($i = 1; $i <= $numberOfPlanets; $i++) {
175
					$galSector = findValidSector(
176
						$galSectors,
177
						fn(SmrSector $sector): bool => !$sector->hasPlanet() // 1 per sector
178
					);
179
					$galSector->createPlanet($planetTypeID);
180
				}
181
			}
182
			$message = '<span class="green">Success</span> : Succesfully added planets.';
183
		} elseif ($submit == 'Create Ports') {
184
			$numLevelPorts = [];
185
			$maxPortLevel = SmrPort::getMaxLevelByGame($this->gameID);
186
			for ($i = 1; $i <= $maxPortLevel; $i++) {
187
				$numLevelPorts[$i] = Request::getInt('port' . $i);
188
			}
189
			$totalPorts = array_sum($numLevelPorts);
190
191
			$totalRaceDist = 0;
192
			$numRacePorts = [];
193
			foreach (Race::getAllIDs() as $raceID) {
194
				$racePercent = Request::getInt('race' . $raceID);
195
				if (!empty($racePercent)) {
196
					$totalRaceDist += $racePercent;
197
					$numRacePorts[$raceID] = ceil($racePercent / 100 * $totalPorts);
198
				}
199
			}
200
			$assignedPorts = array_sum($numRacePorts);
201
			if ($totalRaceDist == 100 || $totalPorts == 0) {
202
				$galaxy = SmrGalaxy::getGalaxy($this->gameID, $this->galaxyID);
203
				$galSectors = $galaxy->getSectors();
204
				foreach ($galSectors as $galSector) {
205
					if ($galSector->hasPort()) {
206
						$galSector->removePort();
207
					}
208
				}
209
				//get race for all ports
210
				while ($totalPorts > $assignedPorts) {
211
					//this adds extra ports until we reach the requested #
212
					$numRacePorts[array_rand($numRacePorts)]++;
213
					$assignedPorts++;
214
				}
215
				//iterate through levels 1-9 port
216
				foreach ($numLevelPorts as $portLevel => $numLevel) {
217
					//iterate once for each port of this level
218
					for ($j = 0; $j < $numLevel; $j++) {
219
						//get a sector for this port
220
						$galSector = findValidSector(
221
							$galSectors,
222
							fn(SmrSector $sector): bool => !$sector->hasPort() && !$sector->offersFederalProtection()
223
						);
224
225
						$raceID = array_rand($numRacePorts);
226
						$numRacePorts[$raceID]--;
227
						if ($numRacePorts[$raceID] == 0) {
228
							unset($numRacePorts[$raceID]);
229
						}
230
						$port = $galSector->createPort();
231
						$port->setRaceID($raceID);
232
						$port->upgradeToLevel($portLevel);
233
						$port->setCreditsToDefault();
234
					}
235
				}
236
				SmrPort::savePorts();
237
				$message = '<span class="green">Success</span> : Succesfully added ports.';
238
			} else {
239
				$message = '<span class="red">Error: Your port race distribution must equal 100!</span>';
240
			}
241
		} else {
242
			throw new Exception('Unknown submit: ' . $submit);
243
		}
244
245
		(new EditGalaxy($this->gameID, $this->galaxyID, $message))->go();
246
	}
247
248
}
249