fork download
  1. <?php
  2. class Damage {
  3. private $phisical;
  4. private $fire;
  5. private $frost;
  6. private $poison;
  7. private $chaos;
  8.  
  9. public function setPhisicalDamage($damage) {
  10. $this->phisical = $damage;
  11. }
  12.  
  13. public function setElementalDamage($element, $damage) {
  14. $this->$element = $damage;
  15. }
  16.  
  17. public function getPhisicalDamage() {
  18. return $this->phisical;
  19. }
  20.  
  21. public function getElementalDamage($element) {
  22. return $this->fire;
  23. }
  24.  
  25. public function getTotalDamage() {
  26. $total = $this->phisical + $this->fire + $this->frost + $this->poison + $this->chaos;
  27. return $total;
  28. }
  29.  
  30. }
  31.  
  32. class IncomingDamage extends Damage {
  33.  
  34. }
  35.  
  36. class FilteredDamage extends Damage {
  37.  
  38. }
  39.  
  40. class Armor {
  41.  
  42. private $armor = 0;
  43. private $fireResist = 0;
  44.  
  45. public function setArmor($armor) {
  46. $this->armor = $armor;
  47. }
  48.  
  49. public function getArmor() {
  50. return $this->armor;
  51. }
  52.  
  53. public function setElementalResist($elementResist, $resist) {
  54. $this->$elementResist = $resist;
  55. }
  56.  
  57. public function getElementalResist($elementResist) {
  58. return $this->$elementResist;
  59. }
  60.  
  61. private function getPhisicalDamageReduction() {
  62. $reduction = 1;
  63. $coeff = pow(0.99, $this->armor);
  64. $reduction *= $coeff;
  65. return $reduction;
  66. }
  67.  
  68. public function getElementDamageReduction($elementResist) {
  69. return 1 - ($this->$elementResist / 100);
  70. }
  71.  
  72. public function filterIncomeDamage(Damage $damage) {
  73. $filteredDamage = new FilteredDamage();
  74. $filteredDamage->setPhisicalDamage($damage->getPhisicalDamage() * $this->getPhisicalDamageReduction());
  75. $filteredDamage->setElementalDamage('fire', $damage->getElementalDamage('fire') * $this->getElementDamageReduction('fireResist'));
  76.  
  77.  
  78. return $filteredDamage;
  79. }
  80. }
  81.  
  82.  
  83.  
  84. $armorTest = new Armor();
  85. $damageTest = new IncomingDamage();
  86.  
  87. for ($i=0; $i<100; $i += 10) {
  88. $armorTest->setArmor($i);
  89. $armorTest->setElementalResist('fireResist', mt_rand(0,99)); //в тесте ставлю случайный резист огню
  90.  
  91. $damageTest->setPhisicalDamage(1000);
  92. $damageTest->setElementalDamage('fire', 500);
  93. echo $damageTest->getTotalDamage() . " в виде: " .
  94. $damageTest->getPhisicalDamage() . "физ и " .
  95. $damageTest->getElementalDamage('fire') . " огн.\n";
  96.  
  97. echo "сквозь:" . $armorTest->getArmor() . " брони и " . $armorTest->getElementalResist('fireResist') . " сопр. огню \n";
  98.  
  99. $filteredDamage = $armorTest->filterIncomeDamage($damageTest);
  100.  
  101. echo "становится: " . $filteredDamage->getTotalDamage() . " (" . $filteredDamage->getPhisicalDamage() . " физ, " . $filteredDamage->getElementalDamage('fire') . "огн.)\n";
  102.  
  103. echo "\n";
  104.  
  105.  
  106. }
  107.  
Success #stdin #stdout 0.01s 52488KB
stdin
Standard input is empty
stdout
1500 в виде: 1000физ и 500 огн.
сквозь:0 брони и 63 сопр. огню 
становится: 1185 (1000 физ, 185огн.)

1500 в виде: 1000физ и 500 огн.
сквозь:10 брони и 92 сопр. огню 
становится: 944.3820750088 (904.3820750088 физ, 40огн.)

1500 в виде: 1000физ и 500 огн.
сквозь:20 брони и 50 сопр. огню 
становится: 1067.9069375972 (817.90693759723 физ, 250огн.)

1500 в виде: 1000физ и 500 огн.
сквозь:30 брони и 57 сопр. огню 
становится: 954.70037338828 (739.70037338828 физ, 215огн.)

1500 в виде: 1000физ и 500 огн.
сквозь:40 брони и 5 сопр. огню 
становится: 1143.9717585697 (668.97175856968 физ, 475огн.)

1500 в виде: 1000физ и 500 огн.
сквозь:50 брони и 68 сопр. огню 
становится: 765.00606713754 (605.00606713754 физ, 160огн.)

1500 в виде: 1000физ и 500 огн.
сквозь:60 брони и 68 сопр. огню 
становится: 707.15664239076 (547.15664239076 физ, 160огн.)

1500 в виде: 1000физ и 500 огн.
сквозь:70 брони и 24 сопр. огню 
становится: 874.83865960021 (494.83865960021 физ, 380огн.)

1500 в виде: 1000физ и 500 огн.
сквозь:80 брони и 94 сопр. огню 
становится: 477.52321376381 (447.52321376381 физ, 30огн.)

1500 в виде: 1000физ и 500 огн.
сквозь:90 брони и 23 сопр. огню 
становится: 789.73197267832 (404.73197267832 физ, 385огн.)