public function danoDeGolpe(Golpe $golpe, $fulminante = false)
 {
     $golpe->setAcertou(true);
     $inimigo = $golpe->getChar();
     $corpo = Sessao::listarCorpoParte();
     $posicao = $golpe->getPosicao();
     $danoOriginal = $inimigo->calcularDanoBasico($golpe->getMao(), $golpe->getGolpe());
     $danoOriginal += $golpe->getDanoExtra();
     if ($golpe instanceof GolpeArremesso) {
         $meioAlcance = $golpe->getArma()->getAlcanceMeio();
         if ($golpe->getDistancia() > $meioAlcance) {
             $danoOriginal = floor($danoOriginal / 2);
         }
     }
     $danoBasico = $danoOriginal;
     $rd = $this->getRD($posicao);
     $mensagem = '';
     if ($fulminante) {
         $cabeca = array(CORPO_CABECA, CORPO_CEREBRO, CORPO_OLHOS);
         if (in_array($posicao, $cabeca)) {
             $this->golpeFulminanteCabeca($golpe, $danoBasico, $rd, $mensagem);
         } else {
             $this->golpeFulminante($posicao, $danoBasico, $rd, $mensagem);
         }
     }
     $mensagem .= ' ' . $inimigo->getNome() . ' causou ' . $danoBasico . " de dano por " . $this->descreverTipoGolpe($golpe->getGolpe()) . ' na ' . $corpo[$posicao]['nome'] . ' em ' . $this->getNome() . '.';
     if ($rd > 0) {
         $danoBasico -= $rd;
         if ($danoBasico <= 0) {
             $danoBasico = 0;
             $mensagem .= " O dano foi totalmente absorvido pela RD ({$rd}).";
             $mensagem = trim($mensagem);
             Sessao::escreverlog($mensagem, $inimigo->getIdOriginal(), LOG_FALHA);
             if ($golpe->getGolpe() == CORTE || $golpe->getGolpe() == CONTUSAO) {
                 $this->projetar($golpe, $danoOriginal);
             }
             if ($golpe instanceof GolpeArremesso) {
                 $this->derrubarArmaArremesso($golpe);
             }
             return;
         } else {
             $mensagem .= " {$rd} de dano foi absorvido pela RD.";
         }
     }
     if ($golpe->getGolpe() == PERFURACAO) {
         $danoBasico = $danoBasico * 2;
         $mensagem .= " O dano por perfuração restante é {$danoBasico}.";
     } elseif ($golpe->getGolpe() == CORTE) {
         $danoBasico = floor($danoBasico * 1.5);
         $mensagem .= " O dano por corte restante é {$danoBasico}.";
     } else {
         $mensagem .= " O dano por contusão restante é {$danoBasico}.";
     }
     $mensagem = trim($mensagem);
     Sessao::escreverlog($mensagem, $inimigo->getIdOriginal(), LOG_ATAQUE);
     if ($golpe->getGolpe() == CONTUSAO) {
         $this->projetar($golpe, $danoOriginal);
     }
     $this->sofreDano($danoBasico, $posicao, $golpe->getGolpe());
     if ($golpe instanceof GolpeArremesso) {
         $this->derrubarArmaArremesso($golpe);
     }
 }
 public function __construct($char, $mao, $arma, $golpe, $posicao, $sentido, $dano_extra, $distancia)
 {
     parent::__construct($char, $mao, $arma, $golpe, $posicao, $sentido, $dano_extra);
     $this->distancia = $distancia;
 }