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__); } }
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__); }