<?php
class Damage {
	private $phisical;
	private $fire;
	private $frost;
	private $poison;
	private $chaos;
	
	public function setPhisicalDamage($damage) {
		$this->phisical = $damage;
	}

	public function setElementalDamage($element, $damage) {
		$this->$element = $damage;
	}

	public function getPhisicalDamage() {
		return $this->phisical;
	}

	public function getElementalDamage($element) {
		return $this->fire;
	}

	public function getTotalDamage() {
		$total = $this->phisical + $this->fire + $this->frost + $this->poison + $this->chaos;
		return $total;
	}

}

class IncomingDamage extends Damage {

}

class FilteredDamage extends Damage {

}

class Armor {
	
	private $armor = 0;
	private $fireResist = 0;

	public function setArmor($armor) {
		$this->armor = $armor;
	}

	public function getArmor() {
		return $this->armor;
	}
	
	public function setElementalResist($elementResist, $resist) {
		$this->$elementResist = $resist;
 	}

 	public function getElementalResist($elementResist) {
 		return $this->$elementResist;
 	}

	private function getPhisicalDamageReduction() {
		$reduction = 1;
		$coeff = pow(0.99, $this->armor);
		$reduction *= $coeff;
		return $reduction;
	}

	public function getElementDamageReduction($elementResist) {
		return 1 - ($this->$elementResist / 100);
	}
	
	public function filterIncomeDamage(Damage $damage) {
		$filteredDamage = new FilteredDamage();
		$filteredDamage->setPhisicalDamage($damage->getPhisicalDamage() * $this->getPhisicalDamageReduction()); 
		$filteredDamage->setElementalDamage('fire', $damage->getElementalDamage('fire') * $this->getElementDamageReduction('fireResist'));


		return $filteredDamage;
	}
}



$armorTest = new Armor();
$damageTest = new IncomingDamage();

for ($i=0; $i<100; $i += 10) {
	$armorTest->setArmor($i);
	$armorTest->setElementalResist('fireResist', mt_rand(0,99)); //в тесте ставлю случайный резист огню

	$damageTest->setPhisicalDamage(1000);
	$damageTest->setElementalDamage('fire', 500);
	echo $damageTest->getTotalDamage() . " в виде: " .
		$damageTest->getPhisicalDamage() . "физ и " .
		$damageTest->getElementalDamage('fire') . " огн.\n";

	echo "сквозь:" . $armorTest->getArmor() . " брони и " . $armorTest->getElementalResist('fireResist') . " сопр. огню \n"; 

	$filteredDamage = $armorTest->filterIncomeDamage($damageTest);

	echo "становится: " . $filteredDamage->getTotalDamage() . " (" . $filteredDamage->getPhisicalDamage() . " физ, " . $filteredDamage->getElementalDamage('fire') . "огн.)\n";

	echo "\n";


}
