diff --git a/skill-mh/TP.md b/skill-mh/TP.md index d27f8ec..0f16b2f 100644 --- a/skill-mh/TP.md +++ b/skill-mh/TP.md @@ -166,6 +166,65 @@ changeant N coûtant 1 PA de plus. --- +## 4. Skill "Lancer un sort/attaque spéciale sur une cible" (ex: Vampirisme) + +Fichier additionnel : `mh_action_target.py`. + +Certaines actions (sorts, attaques spéciales) ne sont pas de simples boutons +sur la page "Lieu" : elles redirigent vers une page intermédiaire qui affiche +un ` + des cibles sur la case. + 2. Filtre les cibles par un sous-texte de leur libellé (insensible a la casse). + 3. Lit le token anti-CSRF `cp` (change a chaque chargement, jamais reutiliser + un ancien token). + 4. Si --execute : POST Play_a_ActionResult.php avec id_target + cp (consomme + des PA reellement). Sinon (dry-run par defaut) : affiche juste ce qui + serait fait, ne soumet rien. + +Usage: + python3 mh_action_target.py "" [--execute] + +Exemple (Vampirisme = ai_ToDo 203, sur un monstre "sphynx") : + python3 mh_action_target.py 203 "sphynx" --dry-run + python3 mh_action_target.py 203 "sphynx" --execute + +REGLE ABSOLUE : ne jamais appeler avec --execute sans un "oui" explicite et +recent de Perco pour CETTE cible precise. --execute consomme reellement des +PA en jeu (irreversible). +""" +import json +import sys + +from bs4 import BeautifulSoup + +from mh_common import BASE, get_session + + +def load_target_page(session, ai_todo): + r = session.get( + f"{BASE}/Play_action.php", + params={"as_Action": "ACTION!", "ai_ToDo": str(ai_todo)}, + allow_redirects=True, + ) + soup = BeautifulSoup(r.text, "html.parser") + + cp_input = soup.find("input", {"name": "cp"}) + type_input = soup.find("input", {"name": "type"}) + id_input = soup.find("input", {"name": "id"}) + select = soup.find("select", {"name": "id_target"}) + + if not select: + return {"erreur": "Aucun