<?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";
}