/** Lancer une attaque * * Exemple d'utilisation - Attaquer une victime avec une arme blanche * <code> * Member_Action_Perso_Attaquer2ArmeBlanche::attaquer($perso, $victime, 'TC', $log1, $log2, $log3, true); * </code> * <br> * * @param object &$perso Quel est le perso qui attaque * @param object &$victime Qui est le perso attaqué * @param string $portee Portee désirée par le joueur * * @return bool Retourne TRUE si la victime doit riposter à la fin du tour d'attaque */ public static function attaquer(&$perso, &$victime, $portee, &$msgPerso, &$msgVictime, &$msgLieu, $tour, &$esquiveNbr, $estUneRiposte = false) { if (DEBUG_MODE) { echo "<br />ID Vict.:" . $victime->getId(); } $ripostePossible = true; //Les attaques à mains nues sont toutes ripostable car la porté est TC $bonus1 = 1.0; $bonus2 = 1.0; $bonus3 = 1.0; $dommagesBonus = 1.0; //Vérifier si la furtivité réussie if (isset($_POST['furtif']) && $tour == 1) { $tauxReussite = $perso->getChancesReussite("FRTV"); $de = rand(1, 100); if (DEBUG_MODE) { echo "<br /> Test furtivité [Dé={$de}, TauxRéussite={$tauxReussite}]"; } if ($de < $tauxReussite || !$victime->getEsquive()) { $msgPerso .= "\nVous arrivez à vous approcher furtivement de votre victime."; $msgVictime .= "\nUne personne s'approche furtivement de vous sans que vous ne vous vous en rendiez compte."; $msgLieu .= "\nUne personne s'approche discrètement d'une autre."; $bonus1 = 1.3; // + 30% de chances de réussir l'attaque $ripostePossible = false; } else { $msgPerso .= "\nVous essayez de vous approcher furtivement de votre victime, mais vous vous faite repérer."; $msgVictime .= "\nUne personne tente de s'approcher furtivement de vous avec une démarche suspecte."; $msgLieu .= "\nUne personne s'approche discrètement d'une autre, mais cette dernière l'appercoit."; $bonus1 = 0.9; // -10% de chances de réussir l'attaque } } //Vérifier si l'attaque est ciblée if ($_POST['type_att'] == 'cible') { $bonus2 = 0.75; //-25% de chances de réussir l'attaque $dommagesBonus = 1.15; //15% de dommages en plus } $persoArme = $perso->getArme(); //Calcul du taux de réussite $tauxReussiteATT = $perso->getChancesReussite("ARMB"); if ($victime->getEsquive()) { $tauxReussiteESQ = $victime->getChancesReussite("ESQV"); } else { $tauxReussiteESQ = 0; } $tauxReussite = ($tauxReussiteATT + (100 - $tauxReussiteESQ)) / 2 * $bonus1 * $bonus2 * $bonus3; $de = rand(1, 100); if (DEBUG_MODE) { echo "<br /> Test réussite [Dé={$de}, TauxRéussite={$tauxReussite}]"; } if ($de >= $tauxReussite && $victime->getEsquive()) { if ($victime->isConscient()) { $esquiveNbr++; if (!$estUneRiposte) { $msgPerso .= "\nVotre attaque échoue, votre victime esquive."; $msgVictime .= "\nVous arrivez à esquiver l'attaque."; $msgLieu .= "\nLa victime arrive à esquiver l'attaque."; } else { $msgPerso .= "\nVotre victime tente une riposte mais vous esquivez."; $msgVictime .= "\nVous tentez une riposte mais votre opposant esquive."; $msgLieu .= "\nLa victime tente une attaque mais se fait esquiver."; } } else { if (!$estUneRiposte) { $msgPerso .= "\nVotre attaque échoue."; $msgVictime .= "\nL'attaque ne vous atteint pas."; $msgLieu .= "\nL'aggresseur rate la victime inconsciente."; } else { $msgPerso .= "\nL'attaque ne vous atteint pas."; $msgVictime .= "\nVotre attaque échoue."; $msgLieu .= "\nLa victime rate l'aggresseur inconscient."; } } } else { //Trouver la localisation du coup porté if ($_POST['type_att'] == 'cible') { //$localisationDuCoup['nom'] = $_POST['zones']; $localisationDuCoup = Member_Action_Perso_Attaquer2::infoDuCoupCible($_POST['zones']); } else { $localisationDuCoup = Member_Action_Perso_Attaquer2::localisationDuCoup($tauxReussite); } $txtLoc = Member_Action_Perso_Attaquer2::getTxtLoc($localisationDuCoup['nom'], true); //Calculer les dégats infligés à la victime $armbId = $perso->convCompCodeToId('ARMB'); $degats = ($perso->getCompRealLevel($armbId) + 2) / 2 * $dommagesBonus; //Prendre en compte l'arme $degats += $persoArme->getForce() * (rand(1, 100) / 100); //Modifier les dégats non-absorbé en fonction de la zone touchée. $degats *= $localisationDuCoup['multiplicateur']; $degats = round($degats); //Vérifier si la victime a une armure à l'endroit du coup $i = 0; $classe = 'Member_ItemDefense' . $localisationDuCoup['nom']; while ($item = $victime->getInventaire($i++)) { if ($item instanceof $classe) { if ($item->isEquip()) { $victimeDefense = $item; break; } } } // La victime possède une armure if (isset($victimeDefense)) { //Calculer les dégats absorbées par l'armure, et mettre à jours les messages //$degats = $victimeDefense->absorbDamage($degats, $msgPerso, $msgVictime, $estUneRiposte); //Vérifier si l'arme s'endommage en frappant sur l'armure if ($persoArme->getResistance() < $victimeDefense->getResistance()) { //Calculer la différence entre l'armure et la force de frape. On ne peux pas se faire plus mal que notre propre force. $dif = $victimeDefense->getResistance() - $persoArme->getResistance(); if ($dif > $persoArme->getResistance()) { $dif = $persoArme->getResistance(); } if ($dif < 1) { $dif = 1; } $dif = round($dif); $persoArme->changeResistance('-', $dif); if (!$estUneRiposte) { $msgPerso .= " et vous endommagez votre arme de {$dif}."; $msgVictime .= "."; $msgLieu .= "\nL'aggresseur frappe sur l'armure {$txtLoc} de son opposant."; } else { $msgPerso .= "."; $msgVictime .= " et vous endommagez votre arme de {$dif}."; $msgLieu .= "\nLa victime frappe sur l'armure {$txtLoc} de son opposant."; } } else { $msgPerso .= "."; $msgVictime .= "."; } } //Mettre à jour les PA de la victime $victime->changePa('-', $degats); if (!$estUneRiposte) { $msgPerso .= "\nVous arrivez à blesser votre victime {$txtLoc} de {$degats} PA."; $msgVictime .= "\nVotre aggresseur arrive à vous blesser {$txtLoc} de {$degats} PA."; $msgLieu .= "\nL'aggresseur arrive à porter un coup {$txtLoc}."; } else { $msgPerso .= "\nVotre victime arrive à vous infliger {$degats} PA de dégat {$txtLoc}."; $msgVictime .= "\nVous arrivez à blesser votre aggresseur {$txtLoc} de {$degats} PA."; $msgLieu .= "\nLa victime arrive à porter un coup {$txtLoc}."; } } return $ripostePossible; }
/** Lancer une attaque * * Exemple d'utilisation - Attaquer une victime avec une arme à feu * <code> * Member_Action_Perso_Attaquer2ArmeFeu::attaquer($perso, $victime, 'TC', $log1, $log2, $log3, true); * </code> * <br> * * @param object &$perso Quel est le perso qui attaque * @param object &$victime Qui est le perso attaqué * @param string $portee Portee désirée par le joueur * * @return bool Retourne TRUE si la victime doit riposter à la fin du tour d'attaque */ public static function attaquer(&$perso, &$victime, $portee, &$msgPerso, &$msgVictime, &$msgLieu, $tour, &$esquiveNbr, $estUneRiposte = false) { if (DEBUG_MODE) { echo "<br />ID Vict.:" . $victime->getId(); } $ripostePossible = true; //Les attaques à mains nues sont toutes ripostable car la porté est TC $bonus1 = 1.0; $bonus2 = 1.0; $bonus3 = 1.0; $dommagesBonus = 1.0; //Vérifier si la furtivité réussie //var_dump($_POST['furtif']); //var_dump($_POST['type_att']); if (isset($_POST['furtif']) && $tour == 1) { $tauxReussite = $perso->getChancesReussite("FRTV"); $de = rand(1, 100); if (DEBUG_MODE) { echo "<br /> Test furtivité [Dé={$de}, TauxRéussite={$tauxReussite}]"; } if ($de < $tauxReussite) { $msgPerso .= "\nVous arrivez à vous approcher furtivement de votre victime."; $msgVictime .= "\nUne personne s'approche furtivement de vous sans que vous ne vous vous en rendiez compte."; $msgLieu .= "\nUne personne s'approche discrètement d'une autre."; $bonus1 = 1.3; // + 30% de chances de réussir l'attaque $ripostePossible = false; } else { $msgPerso .= "\nVous essayez de vous approcher furtivement de votre victime, mais vous vous faite repérer."; $msgVictime .= "\nUne personne tente de s'approcher furtivement de vous avec une démarche suspecte."; $msgLieu .= "\nUne personne s'approche discrètement d'une autre, mais cette dernière l'appercoit."; $bonus1 = 0.9; // -10% de chances de réussir l'attaque } } //Vérifier si l'attaque est ciblée if ($_POST['type_att'] == 'cible') { $bonus2 = 0.75; //-25% de chances de réussir l'attaque $dommagesBonus = 1.15; //15% de dommages en plus } $persoArme = $perso->getArme(); $bonus3 = self::tblDistance($portee); //Effectuer X attaques, selon la cadence de l'arme (tir par tour) for ($tir = 1; $tir <= $persoArme->getTirParTour(); $tir++) { //Tester la fiabilité de l'arme $de = rand(1, 100); if (DEBUG_MODE) { echo "<br /> Tir #{$tir}"; } if (DEBUG_MODE) { echo "<br /> Test fiabilité [Dé={$de}, ArmeFiabilite=" . $perso->getArme()->getFiabilite() . "]"; } if ($persoArme->getMunition() == 0) { if (!$estUneRiposte) { $msgPerso .= "\nVous êtes à court de munition."; $msgVictime .= "\nVotre aggresseur est à court de munition."; } else { $msgPerso .= "\nVotre victime est à court de munition."; $msgVictime .= "\nVous êtes à court de munition."; } break; //Fin de l'attaque } if ($de >= $persoArme->getFiabilite()) { if (!$estUneRiposte) { $msgPerso .= "\nL'arme semble mal fonctionner, l'attaque échoue."; $msgVictime .= "\nL'arme de votre aggresseur semble mal fonctionner, son attaque échoue."; } else { $msgPerso .= "\nL'arme de votre victime semble mal fonctionner, l'attaque échoue."; $msgVictime .= "\nVotre arme semble mal fonctionner et l'attaque échoue."; } //Test critique : l'arme s'endommage if ($de > 90) { //Valeur arbitraire pour la dégradation des armes $degArme = 3; $persoArme->changeResistance('-', $degArme); if (!$estUneRiposte) { $msgPerso .= " Votre arme s'endommage de {$degArme}."; } else { $msgVictime .= " Votre arme s'endommage de {$degArme}."; } } break; //Fin de l'attaque } //Rabaisser les munitions de l'arme $persoArme->useMunition(1); // Munition -=1 //Calcul du taux de réussite $tauxReussiteARM = $perso->getChancesReussite("ARMF"); if ($victime->getEsquive()) { $tauxReussiteESQ = $victime->getChancesReussite("ESQV"); } else { $tauxReussiteESQ = 0; } $tauxReussite = ($tauxReussiteARM + (100 - $tauxReussiteESQ)) / 2 * $bonus1 * $bonus2 * $bonus3; $de = rand(1, 100); if (DEBUG_MODE) { echo "<br /> Test réussite [Dé={$de}, TauxRéussite={$tauxReussite}]"; } if ($de >= $tauxReussite && $victime->getEsquive()) { if ($victime->isConscient()) { $esquiveNbr++; if (!$estUneRiposte) { $msgPerso .= "\nVotre attaque échoue, votre victime esquive."; $msgVictime .= "\nVous arrivez à esquiver l'attaque."; $msgLieu .= "\nLa victime arrive à esquiver l'attaque."; } else { $msgPerso .= "\nVotre victime tente une riposte mais vous esquivez."; $msgVictime .= "\nVous tentez une riposte mais votre opposant esquive."; $msgLieu .= "\nLa victime tente une attaque mais se fait esquiver."; } } else { if (!$estUneRiposte) { $msgPerso .= "\nVotre attaque échoue."; $msgVictime .= "\nL'attaque ne vous atteint pas."; $msgLieu .= "\nL'aggresseur rate la victime inconsciente."; } else { $msgPerso .= "\nL'attaque ne vous atteint pas."; $msgVictime .= "\nVotre attaque échoue."; $msgLieu .= "\nLa victime rate l'aggresseur inconscient."; } } } else { //Trouver la localisation du coup porté if ($_POST['type_att'] == 'cible') { //$localisationDuCoup['nom'] = $_POST['zones']; $localisationDuCoup = Member_Action_Perso_Attaquer2::infoDuCoupCible($_POST['zones']); } else { $localisationDuCoup = Member_Action_Perso_Attaquer2::localisationDuCoup($tauxReussite); } $txtLoc = Member_Action_Perso_Attaquer2::getTxtLoc($localisationDuCoup['nom'], true); //Calculer les dégats infligés à la victime $armfId = $perso->convCompCodeToId('ARMF'); $effMin = 0.5; //L'arme affectera au minimum de 50% de sa force $eff100 = $perso->getCompRealLevel($armfId) / 12; //F5 = 0.46 $efficacite = $effMin + $effMin * $eff100; //F5 = 0.70 if (DEBUG_MODE) { echo 'Eff.: ' . $efficacite; } $degats = $persoArme->getForce() * $efficacite; $degats *= $localisationDuCoup['multiplicateur']; //Modifier les dégats non-absorbé en fonction de la zone touchée. $degats *= $dommagesBonus; $degats = round($degats); //Vérifier si la victime a une armure à l'endroit du coup $i = 0; $classe = 'Member_ItemDefense' . $localisationDuCoup['nom']; while ($item = $victime->getInventaire($i++)) { if ($item instanceof $classe) { if ($item->isEquip()) { $victimeDefense = $item; break; } } } // La victime possède une armure if (isset($victimeDefense)) { //Calculer les dégats absorbées par l'armure, et mettre à jours les messages $degats = $victimeDefense->absorbDamage($degats, $msgPerso, $msgVictime, $txtLoc, $estUneRiposte); $msgPerso .= "."; $msgVictime .= "."; } //Mettre à jour les PV de la victime $victime->changePv('-', $degats); if (!$estUneRiposte) { $msgPerso .= "\nVous arrivez à blesser votre victime {$txtLoc} de {$degats} PV."; $msgVictime .= "\nVotre aggresseur arrive à vous blesser {$txtLoc} de {$degats} PV."; $msgLieu .= "\nL'aggresseur arrive à porter un coup {$txtLoc}."; } else { $msgPerso .= "\nVotre victime arrive à vous infliger {$degats} PV de dégat {$txtLoc}."; $msgVictime .= "\nVous arrivez à blesser votre aggresseur {$txtLoc} de {$degats} PV."; $msgLieu .= "\nLa victime arrive à porter un coup {$txtLoc}."; } } } // Fin de la boucle des tirs/tour $persoArme->setMunition($persoArme->getMunition()); return $ripostePossible; }