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