Ejemplo n.º 1
0
 public static function generatePage(&$tpl, &$session, &$account, &$perso)
 {
     $dbMgr = DbManager::getInstance();
     //Instancier le gestionnaire
     $db = $dbMgr->getConn('game');
     //Demander la connexion existante
     $errorUrl = '?popup=1&m=Action_Perso_Attaquer';
     // ### VALIDATIONS
     //Vérifier l'état du perso
     if (!$perso->isAutonome()) {
         return fctErrorMSG('Vous n\'êtes pas en état d\'effectuer cette action.', $errorUrl);
     }
     //Vérifier si un personnage à été sélectionné
     if (!isset($_POST['perso_id'])) {
         return fctErrorMSG('Vous devez sélectionner la personne que vous désirez attaquer.', $errorUrl);
     }
     //Vérifier si un nombre de tours à été sélectionné
     if (!isset($_POST['tours']) || !is_numeric($_POST['tours'])) {
         return fctErrorMSG('Vous devez sélectionner le nombre de tour(s) à effectuer.', $errorUrl);
     }
     //Vérifier si nous avons assez de PA pour attaquer
     $cout_pa = Member_Action_Perso_Attaquer::coutPaTotal($perso, $_POST['tours']);
     if ($_POST['type_att'] == 'cible') {
         $cout_pa += 15;
     }
     if (isset($_POST['furtif'])) {
         $cout_pa += 15;
     }
     if ($perso->getPa() <= $cout_pa) {
         return fctErrorMSG('Vous n\'avez pas assez de PA pour effectuer cette action.', $errorUrl);
     }
     //Vérifier si le perso sélectionné est bien présent dans le lieu actuel
     $i = 0;
     while ($tmp = $perso->getLieu()->getPerso($perso, $i++)) {
         if ($tmp->getId() == $_POST['perso_id']) {
             $victime = $tmp;
             break;
         }
     }
     if (!isset($victime)) {
         return fctErrorMSG('Le personnage sélectionné n\'est pas présent dans le lieu actuel.', $errorUrl);
     }
     //ATTAQUE CIBLÉE: Vérifier si une zone à été sélectionnée
     if ($_POST['type_att'] == 'cible' && !isset($_POST['zones'])) {
         return fctErrorMSG('Une attaque ciblée doit avoir une zone à cibler.', $errorUrl);
     }
     //CHEAT+HACK: Vérifier l'état innitial de la  victime
     if (!$perso->isVivant()) {
         return fctErrorMSG('Vous ne pouvez pas attaquer une personne déjà morte.', $errorUrl);
     }
     //CHEAT+HACK: ATTAQUE CIBLÉE: Valider qu'une attaque ciblé n'a qu'un seul tour
     if ($_POST['type_att'] == 'cible' && $_POST['tours'] > 1) {
         return fctErrorMSG('Une attaque ciblée ne peut avoir qu\'un seul tour.', $errorUrl);
     }
     //CHEAT+HACK: Vérifier si la portée est valide
     $porteeSelectionnee = $_POST['portee'];
     $porteeArme = $perso->getArme()->getPortee();
     $dimensionLieu = $perso->getLieu()->getDimension();
     //Trouver la distance la plus courte entre la portée de l'arme et la dimension de la piece.
     $porteeAutoriseeMax = Member_Action_Perso_Attaquer::porteePlusPetite($dimensionLieu, $porteeArme) ? $dimensionLieu : $porteeArme;
     if (!Member_Action_Perso_Attaquer::porteePlusPetite($porteeSelectionnee, $porteeAutoriseeMax)) {
         return fctErrorMSG('La portée ne peut dépasser la capacité de l\'arme ou la taille du lieu.', $errorUrl);
     }
     // ### DÉBUT DU MOTEUR D'ATTAQUE
     $tour = 0;
     $persoEsq = 0;
     //Nombre d'esquive effectuées
     $victimeEsq = 0;
     //Nombre d'esquive effectuées
     //Messages d'intro
     $msgPerso = 'Vous tentez une attaque';
     $msgVictime = 'Une personne tente une attaque';
     $msgLieu = 'Vous voyez une personne tenter une attaque';
     if (isset($_POST['furtif'])) {
         $msgPerso .= ' furtive';
         $att_furtive = true;
     }
     if ($_POST['type_att'] == 'cible') {
         $msgPerso .= " ciblée (Zone visée: " . $_POST['zones'] . "):";
     } else {
         $msgPerso .= " par tours (tour(s) tentés: " . $_POST['tours'] . "):";
     }
     $noticeInconscient = true;
     $noticeVivant = true;
     $noticeParalyse = true;
     $noticeInconscientAtt = true;
     $noticeVivantAtt = true;
     $noticeParalyseAtt = true;
     $attStop = false;
     do {
         $tour++;
         if (DEBUG_MODE) {
             echo "<hr />Tour #{$tour}<br />";
         }
         $msgPerso .= "\n\nTour #" . $tour . ' (' . $perso->getArme()->getNom() . ')';
         $msgVictime .= "\n\nTour #" . $tour . ' (' . $perso->getArme()->getNom() . ')';
         $msgLieu .= "\n\nTour #" . $tour . ' (' . $perso->getArme()->getNom() . ')';
         //Lancer le tour d'attaque en fonction du type d'arme utilisé
         switch (get_class($perso->getArme())) {
             case 'Member_ItemArmeMainsnues':
                 $riposte = Member_Action_Perso_Attaquer2ArmeMainsnues::attaquer($perso, $victime, $porteeSelectionnee, $msgPerso, $msgVictime, $msgLieu, $tour, $victimeEsq, false);
                 break;
             case 'Member_ItemArmeBlanche':
                 $riposte = Member_Action_Perso_Attaquer2ArmeBlanche::attaquer($perso, $victime, $porteeSelectionnee, $msgPerso, $msgVictime, $msgLieu, $tour, $victimeEsq, false);
                 break;
             case 'Member_ItemArmeFeu':
                 $riposte = Member_Action_Perso_Attaquer2ArmeFeu::attaquer($perso, $victime, $porteeSelectionnee, $msgPerso, $msgVictime, $msgLieu, $tour, $victimeEsq, false);
                 break;
                 //case 'Member_ItemArmeExplosive':
                 //	$riposte = Member_Action_Perso_Attaquer2ArmeExplosive::attaquer($perso, $victime, $porteeSelectionnee, $msgPerso, $msgVictime, $msgLieu, $tour, $victimeEsq, false);
                 //	break;
                 //case 'Member_ItemArmeLourde':
                 //	$riposte = Member_Action_Perso_Attaquer2ArmeLourde::attaquer($perso, $victime, $porteeSelectionnee, $msgPerso, $msgVictime, $msgLieu, $tour, $victimeEsq, false);
                 //	break;
             //case 'Member_ItemArmeExplosive':
             //	$riposte = Member_Action_Perso_Attaquer2ArmeExplosive::attaquer($perso, $victime, $porteeSelectionnee, $msgPerso, $msgVictime, $msgLieu, $tour, $victimeEsq, false);
             //	break;
             //case 'Member_ItemArmeLourde':
             //	$riposte = Member_Action_Perso_Attaquer2ArmeLourde::attaquer($perso, $victime, $porteeSelectionnee, $msgPerso, $msgVictime, $msgLieu, $tour, $victimeEsq, false);
             //	break;
             case 'Member_ItemArmeParalysante':
                 $riposte = Member_Action_Perso_Attaquer2ArmeParalysante::attaquer($perso, $victime, $porteeSelectionnee, $msgPerso, $msgVictime, $msgLieu, $tour, $victimeEsq, false);
                 break;
             default:
                 fctBugReport('Type d\'arme innexistant (' . get_class($perso->getArme()) . ')', array($perso, $perso->getArme()), __FILE__, __LINE__);
                 break;
         }
         if ($victime->getPa() == 0 && $noticeParalyse) {
             $msgPerso .= "\nVotre opposant est paralysé.";
             $msgVictime .= "\nVous êtes paralysé.";
             $msgLieu .= "\nLa victime est paralysée.";
             $noticeParalyse = false;
             //Pour ne pas repetter à chaque tour
         }
         //Vérifier l'état de la victime et afficher si elle tombe inconsciente ou meurt
         if (!$victime->isConscient() && $noticeInconscient) {
             $msgPerso .= "\nVotre opposant est inconscient.";
             $msgVictime .= "\nVous êtes inconscient.";
             $msgLieu .= "\nLa victime est inconsciente.";
             $noticeInconscient = false;
             //Pour ne pas repetter à chaque tour
         }
         if (!$victime->isVivant() && $noticeVivant) {
             $msgVictime .= "\nVous êtes mort.";
             $noticeVivant = false;
             //Pour ne pas repetter à chaque tour
         }
         if (isset($_POST['furtif'])) {
             unset($_POST['furtif']);
         }
         //De cette facon, la furtivité est uniquement tenté au premier tour.
         //Au besoin, lancer la riposte de la part de la victime
         if ($riposte && $victime->isAutonome() && $victime->getPa() > 0 && $victime->getReaction() == 'riposte') {
             if (DEBUG_MODE) {
                 echo "<br /><br />Riposte:";
             }
             //Vérifier si la porté est plus distante que le nombre de tour (TC(1)=0 tour d'attente, C(2)=1 tour d'attente, M(3)=2 tours d'attente, etc..)
             if ($tour < Member_Action_Perso_Attaquer::porteeVersInt($porteeSelectionnee)) {
                 $msgPerso .= "\nVotre opposant aimerait riposter, mais il est trop loin pour le moment.";
                 $msgVictime .= "\nVous aimeriez riposter, mais vous êtes trop loin pour le moment.";
                 $msgLieu .= "\nLa victime est trop éloignée de son agresseur pour pouvoir riposter.";
             } else {
                 $msgPerso .= "\nVotre opposant tente de riposter (" . $victime->getArme()->getNom() . '): ';
                 $msgVictime .= "\nVous tentez de riposter (" . $victime->getArme()->getNom() . '): ';
                 $msgLieu .= "\nLa victime tente de riposter (" . $victime->getArme()->getNom() . '): ';
                 switch (get_class($victime->getArme())) {
                     case 'Member_ItemArmeMainsnues':
                         $riposte = Member_Action_Perso_Attaquer2ArmeMainsnues::attaquer($victime, $perso, $porteeSelectionnee, $msgPerso, $msgVictime, $msgLieu, $tour, $persoEsq, true);
                         break;
                     case 'Member_ItemArmeBlanche':
                         $riposte = Member_Action_Perso_Attaquer2ArmeBlanche::attaquer($victime, $perso, $porteeSelectionnee, $msgPerso, $msgVictime, $msgLieu, $tour, $persoEsq, true);
                         break;
                     case 'Member_ItemArmeFeu':
                         $riposte = Member_Action_Perso_Attaquer2ArmeFeu::attaquer($victime, $perso, $porteeSelectionnee, $msgPerso, $msgVictime, $msgLieu, $tour, $persoEsq, true);
                         break;
                         //case 'Member_ItemArmeExplosive':
                         //	$riposte = Member_Action_Perso_Attaquer2ArmeExplosive::attaquer($victime, $perso, $porteeSelectionnee, $msgPerso, $msgVictime, $msgLieu, $tour, $persoEsq, true);
                         //	break;
                         //case 'Member_ItemArmeLourde':
                         //	$riposte = Member_Action_Perso_Attaquer2ArmeLourde::attaquer($victime, $perso, $porteeSelectionnee, $msgPerso, $msgVictime, $msgLieu, $tour, $persoEsq, true);
                         //	break;
                     //case 'Member_ItemArmeExplosive':
                     //	$riposte = Member_Action_Perso_Attaquer2ArmeExplosive::attaquer($victime, $perso, $porteeSelectionnee, $msgPerso, $msgVictime, $msgLieu, $tour, $persoEsq, true);
                     //	break;
                     //case 'Member_ItemArmeLourde':
                     //	$riposte = Member_Action_Perso_Attaquer2ArmeLourde::attaquer($victime, $perso, $porteeSelectionnee, $msgPerso, $msgVictime, $msgLieu, $tour, $persoEsq, true);
                     //	break;
                     case 'Member_ItemArmeParalysante':
                         $riposte = Member_Action_Perso_Attaquer2ArmeParalysante::attaquer($victime, $perso, $porteeSelectionnee, $msgPerso, $msgVictime, $msgLieu, $tour, $persoEsq, true);
                         break;
                     default:
                         fctBugReport('Type d\'arme innexistant (' . get_class($victime->getArme()) . ')', array($victime, $victime->getArme()), __FILE__, __LINE__);
                         break;
                 }
                 //On vérifie l'état de l'agresseur et on affiche dnas le HE en cas de changement d'état
                 if ($perso->getPa() == 0 && $noticeParalyseAtt) {
                     $msgPerso .= "\nVous êtes paralysé.";
                     $msgVictime .= "\nVotre agresseur est paralysé.";
                     $msgLieu .= "\nL'agresseur est paralysée.";
                     $noticeParalyseAtt = false;
                     //Pour ne pas repetter à chaque tour
                 }
                 if (!$perso->isConscient() && $noticeInconscientAtt) {
                     $msgPerso .= "\nVous êtes inconscient.";
                     $msgVictime .= "\nVotre agresseur est inconscient.";
                     $msgLieu .= "\nL'agresseur est inconsciente.";
                     $noticeInconscientAtt = false;
                     //Pour ne pas repetter à chaque tour
                 }
                 if (!$perso->isVivant() && $noticeVivantAtt) {
                     $msgPerso .= "\nVous êtes mort.";
                     $noticeVivantAtt = false;
                     //Pour ne pas repetter à chaque tour
                 }
             }
         }
         //Vérifier les options d'arrêt
         if ($_POST['att_stop'] == 'normal' && !$victime->isNormal()) {
             $attStop = true;
         }
         if ($_POST['att_stop'] == 'autonome' && !$victime->isAutonome()) {
             $attStop = true;
         }
         if ($_POST['att_stop'] == 'conscient' && !$victime->isConscient()) {
             $attStop = true;
         }
         //Si il faut arrêter, vérifier si l'arrêt réussit ou échoue
         if ($attStop) {
             $reussite_arret = 85 + $perso->getStatRealLevel('PER') * 3;
             $de = rand(1, 100);
             if ($de >= $reussite_arret) {
                 //ÉCHEC de l'arrêt
                 $attStop = false;
             }
         }
         if ($attStop) {
             $msgPerso .= "\n\nVous décidez de vous en tenir là, son compte est bon.";
             $msgVictime .= "\n\nL'aggresseur arrête soudainement son attaque: votre compte est bon.";
             $msgLieu .= "\n\nL'aggresseur arrête soudainement son attaque.";
         }
         if ($riposte && $victime->isAutonome() && $victime->getPa() > 0 && $victime->getReaction() == 'fuir') {
             //Lister tout les lieux en libre accès accessibles de l'emplacement actuel
             $i = 0;
             while ($lien = $perso->getLieu()->getLink($i++)) {
                 if ($lien->getProtection() == '0') {
                     $lieuFuite[] = $lien;
                 }
             }
             if ($e > 0) {
                 $choix = rand(0, $e - 1);
                 $query = 'UPDATE ' . DB_PREFIX . 'perso' . ' SET lieu=:lieuTech' . ' WHERE id =:persoId' . ' LIMIT 1;';
                 $prep = $db->prepare($query);
                 $prep->bindValue(':lieuTech', $lieuFuite[$choix]->getNomTech(), PDO::PARAM_STR);
                 $prep->bindValue(':persoId', $victime->getId(), PDO::PARAM_INT);
                 $prep->executePlus($db, __FILE__, __LINE__);
                 $arr = $prep->fetch();
                 $prep->closeCursor();
                 $prep = NULL;
                 $msgPerso .= "\n\nLa victime arrive à prendre la fuite vers [i]" . $lieuFuite[$choix]->getNom() . "[/i].";
                 $msgVictime .= "\n\nVous arrivez à prendre la fuite vers [i]" . $lieuFuite[$choix]->getNom() . "[/i].";
                 $msgLieu .= "\n\nLa victime arrive à prendre la fuite vers [i]" . $lieuFuite[$choix]->getNom() . "[/i].";
                 $attStop = true;
             } else {
                 $msgPerso .= "\n\nLa victime tente de fuir mais ne trouve aucune issue.";
                 $msgVictime .= "\n\nVous tentez de fuir mais vous ne trouvez aucune issue.";
                 $msgLieu .= "\n\nLa victime tente de fuir mais ne trouve aucune issue.";
             }
         }
         //Vérifier si le nombre de tours maximum est atteind (ou dépassé)
         if ($tour >= $_POST['tours']) {
             $attStop = true;
         }
         //Vérifier que l'agresseur est encore en état de se battre
         if (!$perso->isAutonome()) {
             $msgPerso .= "\nVous n'êtes plus en état de vous battre.";
             $msgVictime .= "\nVotre agresseur n'est plus en état de se battre.";
             $msgLieu .= "\nL'agresseur n'est plus en état de se battre.";
             $attStop = true;
         }
     } while (!$attStop);
     //Fin de la boucle des tours
     //### FIN DU MOTEUR D'ATTAQUE
     //Retirer les PA de l'attaquant
     $perso->changePa('-', $cout_pa);
     $perso->setPa();
     $perso->setPv($victime, 'Attaque');
     $victime->setPv($perso, 'Attaque');
     $victime->setPa();
     if (!$perso->getArme() instanceof Member_ItemArmeMainsnues) {
         $resistance = $perso->getArme()->getResistance() < 0 ? 0 : $perso->getArme()->getResistance();
         $perso->getArme()->setResistance($resistance);
         //Vérifier si l'arme tombe à 0
         if ($perso->getArme()->getResistance() == 0) {
             $perso->getArme()->desequiper();
             $msgPerso .= "\n\nVotre arme s'est trop endommagée pendant l'attaque et elle est maintenant inutilisable.";
         }
     }
     if (!$victime->getArme() instanceof Member_ItemArmeMainsnues) {
         $resistance = $victime->getArme()->getResistance() < 0 ? 0 : $victime->getArme()->getResistance();
         $victime->getArme()->setResistance($resistance);
         //Vérifier si l'arme tombe à 0
         if ($victime->getArme()->getResistance() == 0) {
             $victime->getArme()->desequiper();
             $msgVictime .= "\n\nVotre arme s'est trop endommagée pendant l'attaque et elle est maintenant inutilisable.";
         }
     }
     //Gain en STAT+COMP
     $msgPerso .= self::gainXP($perso, $perso->getArme(), $_POST['type_att'] == 'cible', isset($att_furtive), $tour, $persoEsq);
     $msgVictime .= self::gainXP($victime, $victime->getArme(), false, false, $tour, $victimeEsq);
     //Envoyer le message aux 2 personnes impliqués
     Member_He::add($perso->getId(), $victime->getId(), 'attaque', $msgPerso, HE_TOUS, HE_AUCUN);
     Member_He::add($perso->getId(), $victime->getId(), 'attaque', $msgVictime, HE_AUCUN, HE_TOUS);
     //Envoyer le message à tout les gens présent sur le lieu
     $i = 0;
     $arrPersoLieu = array();
     while ($tmp = $perso->getLieu()->getPerso($perso, $i++)) {
         if ($tmp->getId() != $perso->getId() && $tmp->getId() != $victime->getId()) {
             $arrPersoLieu[count($arrPersoLieu)] = $tmp->getId();
         }
     }
     if (count($arrPersoLieu) > 0) {
         Member_He::add(array($perso->getId(), $victime->getId()), $arrPersoLieu, 'attaque', $msgLieu, HE_AUCUN, HE_TOUS);
     }
     //Rafraichir le HE
     if (!DEBUG_MODE) {
         return $tpl->fetch($account->getSkinRemotePhysicalPath() . 'html/Member/herefresh.htm', __FILE__, __LINE__);
     }
 }
Ejemplo n.º 2
0
 public static function generatePage(&$tpl, &$session, &$account, &$perso)
 {
     $dbMgr = DbManager::getInstance();
     //Instancier le gestionnaire
     $db = $dbMgr->getConn('game');
     //Demander la connexion existante
     //Vérifier l'état du perso
     if (!$perso->isAutonome()) {
         return fctErrorMSG('Vous n\'êtes pas en état de pouvoir effectuer cette action.');
     }
     //Générer la liste des personnages présent dans le lieu actuel
     $i = 0;
     $e = 0;
     $arrPersos = array();
     while ($tmp = $perso->getLieu()->getPerso($perso, $i++)) {
         if ($tmp->getId() != $perso->getId()) {
             //Info sur le perso
             $arrPersos[$e]['perso'] = $tmp;
             $arrPersos[$e]['disabled'] = '';
             //Info sur l'arme
             $arme = $tmp->getArme();
             if ($arme instanceof Member_Arme) {
                 $arrPersos[$e]['arme'] = $arme->getNom();
             } else {
                 $arrPersos[$e]['arme'] = '- n/a -';
             }
             //Info TXT sur l'état du perso
             if ($tmp->isNormal()) {
                 $arrPersos[$e]['etat'] = "En santé";
             } elseif ($tmp->isAutonome()) {
                 $arrPersos[$e]['etat'] = "Légèrement blessé";
             } elseif ($tmp->isConscient()) {
                 $arrPersos[$e]['etat'] = "Blessé gravement";
             } elseif ($tmp->isVivant()) {
                 $arrPersos[$e]['etat'] = "Inconscient";
             } else {
                 $arrPersos[$e]['etat'] = "Mort";
                 $arrPersos[$e]['disabled'] = 'DISABLED';
             }
             $e++;
         }
     }
     $tpl->set('PERSOS', $arrPersos);
     //Afficher l'arme utilisée
     if ($perso->getMenotte()) {
         $tpl->set('ARME_NOM', "Mains menottées");
     } elseif ($perso->getArme() instanceof Member_ItemArme) {
         $tpl->set('ARME_NOM', $perso->getArme()->getNom());
     } else {
         $tpl->set('ARME_NOM', "Mains nues");
     }
     //Créer la liste des tours possibles
     $i = 0;
     while ((self::coutPaTotal($perso, $i + 1) < $perso->getPa() || $i < 9) && $i < 10) {
         $totalPa = self::coutPaTotal($perso, $i + 1);
         $tours[$i] = array('no' => $i + 1, 'pa' => $totalPa, 'statut' => $totalPa < $perso->getPa() ? '' : 'DISABLED');
         $i++;
     }
     $tpl->set('TOURS', $tours);
     //Déterminer la porté maximale possible d'utiliser (la plus petite entre le lieu et l'arme)
     $porteeArme = $perso->getArme()->getPortee();
     $dimensionLieu = $perso->getLieu()->getDimension();
     $porteeAutoriseeMax = Member_Action_Perso_Attaquer::porteePlusPetite($dimensionLieu, $porteeArme) ? $dimensionLieu : $porteeArme;
     //Créer la liste des portées possibles
     $arr = array();
     $arr[0]['code'] = 'TC';
     $arr[0]['txt'] = 'Contact direct (Bout portant)';
     if ($perso->getArme() instanceof Member_ItemArmeFeu) {
         //Permettre les portées non-directes
         if (self::porteePlusPetite('C', $porteeAutoriseeMax)) {
             $arr[1] = array('code' => 'C', 'txt' => 'Courte portée');
         }
         if (self::porteePlusPetite('M', $porteeAutoriseeMax)) {
             $arr[2] = array('code' => 'M', 'txt' => 'Moyenne');
         }
         if (self::porteePlusPetite('L', $porteeAutoriseeMax)) {
             $arr[3] = array('code' => 'L', 'txt' => 'Longue distance');
         }
         if (self::porteePlusPetite('TL', $porteeAutoriseeMax)) {
             $arr[4] = array('code' => 'TL', 'txt' => 'Très longue distance');
         }
     }
     $tpl->set('PORTEE', $arr);
     //Créer la liste des zones ciblables
     $tour_cible['pa'] = self::coutPaPourUnTour($perso, 1) + 15;
     $tpl->set('tour_cible', $tour_cible);
     $zones[0] = array('tech' => 'Tete', 'nom' => 'Tête');
     $zones[1] = array('tech' => 'Torse', 'nom' => 'Torse');
     $zones[2] = array('tech' => 'Bras', 'nom' => 'Bras');
     $zones[3] = array('tech' => 'Main', 'nom' => 'Main');
     $zones[4] = array('tech' => 'Jambe', 'nom' => 'Jambe');
     $zones[5] = array('tech' => 'Pied', 'nom' => 'Pied');
     $tpl->set('ZONES', $zones);
     //Retourner le template complété/rempli
     return $tpl->fetch($account->getSkinRemotePhysicalPath() . 'html/Member/Action/Perso/Attaquer.htm', __FILE__, __LINE__);
 }