Docs Extensions de jeu

Canal JASS

Les 1291 fonctions JASS dont disposent les créateurs de cartes s’appellent désormais par leur nom depuis l’extérieur du jeu : créer des unités, modifier des attributs, effets, panneaux, boîtes de dialogue, sons, caméra, brouillard… Quatre usages : console Farsight, ligne de commande, HTTP, Python.

Les 1291 natives JASS que les créateurs de cartes peuvent utiliser dans leurs scripts s’appellent désormais toutes par leur nom depuis l’extérieur du jeu : créer des unités, modifier des attributs, afficher des effets, ouvrir des panneaux et des boîtes de dialogue, jouer des sons, déplacer la caméra, modifier le brouillard… De quoi personnaliser le jeu plus avant — assistance pour RPG, compagnon IA, mini-jeux maison, outils de débogage.

UsageIdéal pourPoint d’entrée
Page « Console JASS » de FarsightEssayer à la main, modifier en voyant le résultatBarre latérale « Système → Console JASS » : écrivez un script et cliquez sur Exécuter ; à droite, parcourez les fonctions par catégorie, un clic en insère une dans le script
Ligne de commandeEssayer à la main, ou en faire un fichier de script à relancerpython -m openwar3 jass --inst 20 (interactif), -e "code", my_script.j, --list mot-clé
HTTPProgrammes externes, dans n’importe quel langagePOST /api/instances/{n}/jass, etc. (voir plus bas) ; le serveur de Farsight n’écoute qu’en local
PythonÉcrire des schémas, des compagnons, des outilsg.jass.NomDeFonction(...) ; les effets visuels et interactions courants sont regroupés dans openwar3.visual

Trois limites, toutes dictées par le mécanisme :

  • Seules les parties solo (contre l’ordinateur, sur votre machine) peuvent modifier le monde. Créer des objets ou modifier des unités unilatéralement depuis votre machine désynchroniserait les autres joueurs d’une partie multijoueur — en multijoueur, seules les fonctions en lecture seule sont autorisées (Get*, Is*, Count*…).
  • Réservé aux outils locaux : les appels passés via une connexion en tant que joueur (Game(player=N)) ou en mode équitable sont rejetés.
  • Uniquement pour les parties en solo ou hébergées vous-même en réseau local.

Pour ajouter des éléments à l’écran en multijoueur, utilisez le canevas : c’est le runtime qui le dessine lui-même, sans modifier l’état du jeu.

Écrire un script

La console, la ligne de commande et HTTP utilisent le même format de script. Une instruction par ligne ; vous pouvez coller du JASS tel quel (call / set / local, true / false / null, codes à quatre caractères 'Hpal', commentaires //), ou écrire à la manière de Python :

set h = hero()                                   // intégré : héros principal de notre camp
local texttag t = CreateTextTag()
call SetTextTagText(t, "|cffffcc00+128 critique !|r", 0.024)
call SetTextTagPosUnit(t, h, 60)
call SetTextTagVelocity(t, 0, 0.03)
call SetTextTagPermanent(t, false)
call SetTextTagLifespan(t, 4)
call SetTextTagVisibility(t, true)
call PingMinimapEx(h.x, h.y + 300, 3, 255, 0, 0, false)
set u = CreateUnit(Player(0), 'hfoo', h.x + 200, h.y, 270)
print("créé", u, "niveau du héros", GetHeroLevel(h))
  • Les variables sont mémorisées : pour une même instance et une même partie, les variables définies par set dans un bloc restent utilisables dans le suivant ; elles sont effacées automatiquement à chaque nouvelle partie, et peuvent aussi l’être à la main.
  • Fonctions intégrées : hero() héros principal de notre camp, me() joueur local, unit('hfoo') trouve une unité, unit_at(x, y), wait(secondes), print(...). Sur une unité, on peut lire .x, .y, .hp, .hp_max, .mana, .type, .owner, .level ; les quatre opérations arithmétiques et les comparaisons sont prises en charge.
  • Pas de if, loop ni function — pour écrire de la logique, utilisez g.jass en Python (ce sont de simples appels de fonction), ou écrivez un schéma.
  • En cas d’erreur, vous saurez à quelle ligne et pourquoi (fonction inexistante, mauvais nombre d’arguments, variable non définie…) ; les instructions qui précèdent l’erreur ont déjà pris effet.

Arguments et valeurs de retour :

Dans la signatureQuoi passerRemarques
EntierUn nombre ; les codes à quatre caractères 'Hpal' sont convertis automatiquement
RéelUn nombreLe runtime le convertit au format attendu par le moteur
Booléentrue / false
Chaîne"..."Le chinois et les codes couleur du jeu sont pris en charge ; les chaînes que le jeu conserve (texte flottant, panneaux, boutons, commandes de chat) sont copiées sur le moment : aucun risque
HandleUn handle stocké dans une variable, ou une unité (ce que renvoie hero() est converti automatiquement en handle)
Fonction (code)Uniquement nullImpossible de fournir une fonction JASS depuis l’extérieur ; TimerStart(t, 60, false, null) fonctionne
Retour de type chaîne—Le moteur renvoie un index dans la table des chaînes : le texte ne peut pas être relu. Pour les noms d’unités, utilisez g.map_data.name_of

Catégories

Les fonctions sont classées d’après leur nom ; la partie droite de la console et --list suivent ce classement :

CatégorieNombreExemples
Effets visuels80Texte flottant, éclairs reliant deux points, effets spéciaux, images au sol, marques au sol, couleur / taille / animation des unités
Panneaux d’interface146Panneaux multilignes, classements, fenêtres de compte à rebours, boîtes de dialogue, quêtes, texte à l’écran, signaux sur la mini-carte, dialogue avec portrait, filtres plein écran
Caméra44Champs de caméra, panoramique, tremblement de caméra
Sons et musique50Créer et jouer des sons, lancer une musique
Brouillard et vision25Zones visibles, activer / désactiver le brouillard
Objets / héros / unités63 / 32 / 161Créer des objets, définir le niveau d’un héros, changer de propriétaire, ajouter des compétences
Joueurs / alliances / ressources71Définir les alliances, modifier l’or et le bois
Déclencheurs / événements / minuteries62Créer des déclencheurs, enregistrer des événements, minuteries
Terrain / météo / destructibles45Effets météo, modifier le terrain, créer des destructibles
Déroulement de la partie57Vitesse de jeu, pause, heure du jour
Autres…Groupes d’unités et régions, stockage, scripts d’IA de l’ordinateur, conversions de types et maths, réponses aux événements…

Le 2026-09-24, 94 d’entre elles ont été appelées une par une en partie réelle, avec vérification visuelle de l’effet ; les autres passent par le même chemin, simplement sans vérification individuelle de leur effet.

Les fonctions de la catégorie « réponses aux événements » (GetTriggerUnit, GetClickedButton…) n’ont de valeur qu’à l’instant où un déclencheur s’exécute ; appelées depuis l’extérieur, elles renvoient 0 ou une valeur vide. Pour savoir « si c’est arrivé », utilisez les compteurs d’événements décrits plus bas.

HTTP

Serveur de Farsight (127.0.0.1:8866 par défaut, écoute uniquement en local) :

GET  /api/jass/natives?q=TextTag&cat=visual
POST /api/instances/20/jass        {"code": "set h = hero()\ncall PingMinimapEx(h.x, h.y, 3, 255, 0, 0, false)"}
     -> {"ok": true, "rows": [...], "printed": [...], "vars": {...}}
     -> en cas d'erreur : {"ok": false, "error": "第 2 行:...", "line": 2}
POST /api/instances/20/jass/call   {"name": "SetUnitScale", "args": [{"unit": 599669636}, 1.4, 1.4, 1.4]}
POST /api/instances/20/jass/reset  efface les variables mémorisées

Un argument unité s’écrit {"unit": adresse}, l’adresse étant le addr de l’unité dans l’instantané. Mesuré : 60 à 90 ms par requête.

Python : g.jass et openwar3.visual

j = g.jass
t = j.CreateTextTag()
j.SetTextTagText(t, "Bonjour", 0.024)  # mêmes règles d'arguments que dans les scripts ; les unités et objets de l'instantané se passent directement
j.signature("CreateImage")             # consulter la signature

openwar3.visual.Visual(g) regroupe les effets visuels courants déjà testés, une ligne par effet (appelez v.tick() à chaque tick : ce qui a expiré est supprimé, les liens et cercles qui suivent des unités sont déplacés ; v.clear() supprime tout) :

MéthodeEffet
float_text(texte, unité ou point, ...)Texte flottant : chiffres de dégâts, indications au-dessus de la tête, chinois et couleurs acceptés
link(a, b, kind)Un lien entre deux unités, qui les suit : traction / lien spirituel / drain de vie / vague de soins
effect(modèle, unité ou point, ...)Modèle d’effet spécial : au-dessus de la tête, sous les pieds, ou joué une seule fois (explosion, colonne de lumière)
ring(unité ou point, rayon, color)Cercle au sol : portée d’un sort, zone dangereuse, point de ralliement ; peut suivre une unité
ping(point, color)Signal sur la mini-carte
board(titre, lignes...)Panneau multiligne en haut à droite (avec icônes), modifiable case par case
countdown(titre, secondes)Fenêtre de compte à rebours en haut à droite, décomptée par le jeu lui-même
scene(nom, texte, portrait)Dialogue avec portrait : le portrait du bas devient une unité qui parle, et un sous-titre « nom : texte » s’affiche à l’écran
screen_tint(color, alpha)Filtre plein écran (par défaut, bords rougis : alerte de vie basse)
sound(chemin) / reveal(point, rayon, secondes) / look(unité, ...)Jouer un son / dissiper le brouillard sur une zone / changer la couleur d’une unité, l’agrandir, lui faire jouer une animation, la faire clignoter

Interactions : savoir ce que fait le joueur sans écrire de fonction JASS

En JASS, réagir aux actions du joueur exige d’écrire une fonction de déclencheur, et on ne peut pas fournir de fonction depuis l’extérieur. La solution : créer un déclencheur vide, sans condition ni action, y enregistrer seulement l’événement, puis compter combien de fois il s’exécute. En test, un déclencheur vide compte bel et bien.

MéthodeUsage
chat_commands(["-follow", "-stay"]) → .poll()Commandes tapées par le joueur dans le chat (correspondance exacte, ou sur le début)
menu(titre, [boutons...]) → .clicked()Menu de boutons au centre de l’écran : lequel a été cliqué
hotkeys(("left", "right", "up", "down", "esc")) → .poll()Nombre d’appuis sur les flèches et sur Échap
on("TriggerRegister...Event", arguments...) → .poll()Nombre d’occurrences de n’importe quel événement JASS : mort d’une unité, entrée dans une région, dégâts subis, minuterie…

La limite : on sait seulement « combien de fois », pas « qui, ni quel texte ». Pour distinguer les auteurs, créez un compteur par objet. C’est ainsi que sont branchées les commandes de chat du compagnon IA.

Précautions

  • Supprimez vous-même ce que vous créez : textes flottants, liens, images, panneaux, déclencheurs… sinon ils restent indéfiniment (Visual.clear() supprime ce qu’il a lui-même créé). Le jeu affiche au maximum environ 100 textes flottants simultanés.
  • Les fonctions BJ ne sont pas des natives : CreateTextTagUnitBJ et consorts sont assemblées à partir de natives dans le script de la carte, et ne sont pas disponibles ici — reproduisez leur implémentation avec des natives.
  • Certaines constantes doivent d’abord être converties : par exemple ConvertPlayerColor(1), ConvertFogState(4) (valeurs possibles dans common.j).
  • Environ 13 ms par appel (conversion des handles comprise) ; au niveau du protocole, ce sont les opcodes W3P 70 à 72, voir Protocole W3P.