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 — master (#1078)
by Dan
05:25
created

SmrMines::getNumberOfMines()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 2
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 1
dl 0
loc 2
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 0
1
<?php declare(strict_types=1);
2
3
class SmrMines extends AbstractSmrCombatWeapon {
4
	use Traits\CombatWeaponForce;
5
6
	const TOTAL_ENEMY_MINES_MODIFIER = 25;
7
	const FED_SHIP_DAMAGE_MODIFIER = .5;
8
	const DCS_DAMAGE_MODIFIER = .75;
9
10
	public function __construct(int $numberOfMines) {
11
		$this->amount = $numberOfMines;
12
		$this->name = 'Mines';
13
		$this->shieldDamage = 20;
14
		$this->armourDamage = 20;
15
		$this->accuracy = 100;
16
		$this->damageRollover = false;
17
	}
18
19
	public function getModifiedAccuracy() : float {
20
		$modifiedAccuracy = $this->getBaseAccuracy();
21
		return $modifiedAccuracy;
22
	}
23
24
	public function getModifiedForceAccuracyAgainstPlayer(SmrForce $forces, AbstractSmrPlayer $targetPlayer, bool $minesAreAttacker) : float {
25
		return $this->getModifiedForceAccuracyAgainstPlayerUsingRandom($forces, $targetPlayer, rand(1, 7) * rand(1, 7), $minesAreAttacker);
26
	}
27
28
	protected function getModifiedForceAccuracyAgainstPlayerUsingRandom(SmrForce $forces, AbstractSmrPlayer $targetPlayer, int $random, bool $minesAreAttacker) : float {
29
		$modifiedAccuracy = $this->getModifiedAccuracy();
30
		$modifiedAccuracy -= $targetPlayer->getLevelID() + $random;
31
		if ($minesAreAttacker) {
32
			$modifiedAccuracy /= pow(SmrSector::getSector($forces->getGameID(), $forces->getSectorID())->getNumberOfConnections(), 0.6);
33
		}
34
35
		if (self::TOTAL_ENEMY_MINES_MODIFIER > 0) {
36
			$enemyMines = 0;
37
			$enemyForces = $forces->getSector()->getEnemyForces($targetPlayer);
38
			foreach ($enemyForces as $enemyForce) {
39
				$enemyMines += $enemyForce->getMines();
40
			}
41
			$modifiedAccuracy += $enemyMines / self::TOTAL_ENEMY_MINES_MODIFIER;
42
		}
43
		return max(0, min(100, $modifiedAccuracy));
44
	}
45
46
	public function getModifiedDamageAgainstForces(AbstractSmrPlayer $weaponPlayer, SmrForce $forces) : array {
47
		$return = array('MaxDamage' => 0, 'Shield' => 0, 'Armour' => 0, 'Rollover' => $this->isDamageRollover());
48
		return $return;
49
	}
50
51
	public function getModifiedDamageAgainstPort(AbstractSmrPlayer $weaponPlayer, SmrPort $port) : array {
52
		$return = array('MaxDamage' => 0, 'Shield' => 0, 'Armour' => 0, 'Rollover' => $this->isDamageRollover());
53
		return $return;
54
	}
55
56
	public function getModifiedDamageAgainstPlanet(AbstractSmrPlayer $weaponPlayer, SmrPlanet $planet) : array {
57
		$return = array('MaxDamage' => 0, 'Shield' => 0, 'Armour' => 0, 'Rollover' => $this->isDamageRollover());
58
		return $return;
59
	}
60
61
	public function getModifiedDamageAgainstPlayer(AbstractSmrPlayer $weaponPlayer, AbstractSmrPlayer $targetPlayer) : array {
62
		$return = array('MaxDamage' => 0, 'Shield' => 0, 'Armour' => 0, 'Rollover' => $this->isDamageRollover());
63
		return $return;
64
	}
65
66
	public function getModifiedPortDamageAgainstPlayer(SmrPort $port, AbstractSmrPlayer $targetPlayer) : array {
67
		$return = array('MaxDamage' => 0, 'Shield' => 0, 'Armour' => 0, 'Rollover' => $this->isDamageRollover());
68
		return $return;
69
	}
70
71
	public function getModifiedPlanetDamageAgainstPlayer(SmrPlanet $planet, AbstractSmrPlayer $targetPlayer) : array {
72
		$return = array('MaxDamage' => 0, 'Shield' => 0, 'Armour' => 0, 'Rollover' => $this->isDamageRollover());
73
		return $return;
74
	}
75
76
	public function getModifiedForceDamageAgainstPlayer(SmrForce $forces, AbstractSmrPlayer $targetPlayer, bool $minesAreAttacker = false) : array {
77
		if (!$this->canShootTraders()) { // If we can't shoot traders then just return a damageless array and don't waste resources calculated any damage mods.
78
			$return = array('MaxDamage' => 0, 'Shield' => 0, 'Armour' => 0, 'Rollover' => $this->isDamageRollover());
79
			return $return;
80
		}
81
		$damage = $this->getDamage();
82
		if ($targetPlayer->getShip()->isFederal()) { // do less damage to fed ships
83
			$damage['MaxDamage'] = IRound($damage['MaxDamage'] * self::FED_SHIP_DAMAGE_MODIFIER);
84
			$damage['Shield'] = IRound($damage['Shield'] * self::FED_SHIP_DAMAGE_MODIFIER);
85
			$damage['Armour'] = IRound($damage['Armour'] * self::FED_SHIP_DAMAGE_MODIFIER);
86
		}
87
88
		if ($targetPlayer->getShip()->hasDCS()) { // do less damage to DCS (Drone Scrambler)
89
			$damage['MaxDamage'] = IRound($damage['MaxDamage'] * self::DCS_DAMAGE_MODIFIER);
90
			$damage['Shield'] = IRound($damage['Shield'] * self::DCS_DAMAGE_MODIFIER);
91
			$damage['Armour'] = IRound($damage['Armour'] * self::DCS_DAMAGE_MODIFIER);
92
		}
93
		$damage['Launched'] = ICeil($this->getAmount() * $this->getModifiedForceAccuracyAgainstPlayer($forces, $targetPlayer, $minesAreAttacker) / 100);
94
		$damage['MaxDamage'] = ICeil($damage['Launched'] * $damage['MaxDamage']);
95
		$damage['Shield'] = ICeil($damage['Launched'] * $damage['Shield']);
96
		$damage['Armour'] = ICeil($damage['Launched'] * $damage['Armour']);
97
		return $damage;
98
	}
99
100
	public function shootForces(AbstractSmrPlayer $weaponPlayer, SmrForce $forces) : array {
101
		$return = array('Weapon' => $this, 'TargetForces' => $forces);
102
		return $return;
103
	}
104
105
	public function shootPlayer(AbstractSmrPlayer $weaponPlayer, AbstractSmrPlayer $targetPlayer) : array {
106
		$return = array('Weapon' => $this, 'TargetPlayer' => $targetPlayer, 'Hit' => false);
107
		return $return;
108
	}
109
110
	public function shootPlayerAsForce(SmrForce $forces, AbstractSmrPlayer $targetPlayer, bool $minesAreAttacker = false) : array {
111
		$return = array('Weapon' => $this, 'TargetPlayer' => $targetPlayer, 'Hit' => true);
112
		$return = $this->doForceDamageToPlayer($return, $forces, $targetPlayer, $minesAreAttacker);
113
		$forces->takeMines($return['ActualDamage']['Launched']);
114
		return $return;
115
	}
116
117
	protected function doForceDamageToPlayer(array $return, SmrForce $forces, AbstractSmrPlayer $targetPlayer, bool $minesAreAttacker = false) : array {
118
		$return['WeaponDamage'] = $this->getModifiedForceDamageAgainstPlayer($forces, $targetPlayer, $minesAreAttacker);
119
		$return['ActualDamage'] = $targetPlayer->getShip()->doMinesDamage($return['WeaponDamage']);
120
		$return['ActualDamage']['Launched'] = ICeil($return['WeaponDamage']['Launched'] * $return['ActualDamage']['TotalDamage'] / $return['WeaponDamage']['MaxDamage']);
121
122
		if ($return['ActualDamage']['KillingShot']) {
123
			$return['KillResults'] = $targetPlayer->killPlayerByForces($forces);
124
		}
125
		return $return;
126
	}
127
}
128