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
Push — master ( 9b048e...fe1ddb )
by Dan
23s queued 16s
created

SmrMines::getModifiedAccuracy()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 2
dl 0
loc 3
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