Ivaldir m'a demandé de faire un article sur les attaques de ver, puisque c'est moi qui suis chargé de leur programmation. Plutôt que de décrire uniquement le fonctionnement du ver dans nos dernières cartes, il m'a paru intéressant de rappeller d'où nous sommes partis :
Au début du projet de campagne Dune, les Atréides et les Harkonnens n'étaient pas différenciés, ils pouvaient tous deux produire les mêmes unités et les protoss paraissaient adaptés pour faire les Fremen mais sans certitudes. Après de nombreuses réflexions, les Maisons ont été remaniées comme elles le sont actuellement, et à mesure que le projet prenait de l'ambition, il devenait de plus en plus urgent de trouver un moyen de faire le ver, sans qui Dune n'est plus tout à fait Dune...
La première idée fut d'utiliser les doodads. Malheureusement, à part les doodads "portes" et quelques pièges du type des terrains "installation", ces dessins ne peuvent pas prendre plusieurs états. Et le doodad qui ressemble à la grande bouche de starwars ne pouvait, avec une programmation simpliste du type "tu passe dessus je te mange" donner une image crédible du puissant Shai-Hulud.

Après une nouvelle recherche nous sommes tombé sur le reaver qui nous est apparu alors comme une évidence : quelle autre unité de starcraft pouvait mieux symboliser le ver ?
Nous avons donc commencé à programmer les attaques de ver de la carte 2. Il n'y avait qu'un seul champ d'épice et l'une des attaques se déroulait pendant une cinématique pré-programmée. La programmation était la suivante :

(Création du ver Joueur neutre) Condition : Le joueur amène une unité dans le champ d'épice Action : attendre x ms créer un ver des sables plein de scarab donner ordre au ver d'attaquer vers le milieu du champ d'épice attendre x ms retirer le ver des sables.

Cela fonctionnait plutôt bien contre le joueur humain mais le ver des sables refusait désespérément d'attaquer le joueur neutre pendant la cinématique (même en le définissant "ennemi").
En plus, nous venions de décider d'ajouter un orni
qui puisse détecter le ver. Nous avons donc ajouté une
transmition d'un orni pendant l'attaque, et pour la cinématique,
ajouté une commande pour détruire les batiments "comme
si" le ver récalcitrant l'avait attaqué.
Problème : l'orni détectait le ver même si le joueur
l'avait envoyé en exploration à l'autre bout de la carte...
En panne d'inspiration, nous avons recherché des solutions tout azimut avant de tomber sur un article qui parlait des interrupteurs... mais c'est bien sûr ! j'ai donc pu programmer la première véritable attaque de ver en boucle de Dune :
(Configurer Attaque de ver) Condition : Le joueur amène une unité dans le champ d'épice Action : configurer "attaque de ver"

(Attaque de ver) Condition : "attaque de ver" est configuré Action : attendre x ms créer un ver donner ordre au ver d'aller au milieu du champ d'épice attendre x ms détruire toutes les unités pour le joueur dans le champ d'épice donner ordre au ver de retourner d'où il vient attendre x ms retirer le ver attendre x ms effacer "signe du ver" préserver le trigger.
NOTE : la location qui définit le champ d'épice est au sol uniquement, les cases dans propriété pour les trois niveaux aériens sont décochées. Ainsi, si une unité terrestre est dans la zone elle est détruite, si elle est aérienne, rien ne se passe.
(Detection du ver si orni) Condition : "attaque de ver" configuré "signe du ver" effacé le joueur amène au moins un orni dans la zone d'épice. Action : configurer "signe du ver" transmission blablabla nous avons détecté un ver blabla minimap ping vers le champ d'épice centrer la vue sur le champ d'épice préserver le trigger.
Ainsi, si le joueur n'avait pas d'orni, il n'était pas prévenu du passage du ver et voyait généralement sa base et ses moisonneuses réduites en miettes. L'interrupteur "signe du ver" sert à ce que l'orni ne donne l'alerte qu'une seule fois par passage du ver. Sans cet interrupteur, il lançait l'alerte en continu tant que le ver était présent...
Cette programmation-là avait le mérite de fonctionner, pourtant divers problèmes apparurent : d'abord le ver ne détruisait les choses que dans la location prévue, si elle était trop vaste c'était assez peu réaliste et si elle était trop petite, il suffisait de pousser ses troupes que le ver ne poursuivait pas bien entendu...
En plus, il semblait que les délais du trigger n'étaient respectés que d'une manière plutôt aléatoire. Et le ver pouvait passer juste à côté de troupes qui, non comprise dans la zone de destruction, pouvaient le regarder passer tranquillement : inconcevable !

Après vérification il s'avéra que le moteur interne de Starcraft régénère les triggers toutes les 2 secondes et qu'il donne un ordre de priorité incertain pour les délais dans des triggers en boucle (ceux qui sont "préservés") qui fait que les délais deviennent imprévisibles. Il fallait donc trouver le moyen de mettre des délais sans utiliser la commande "attendre" !
J'ai donc eu l'idée de mettre dans la carte une unité invincible qui irait d'une location à une autre, il suffisait alors de coordonner la vitesse de l'unité et l'éloignement des locations pour obtenir un délai parfaitement sûr et régulier, quel que soit l'ordinateur, quel que soit la vitesse de la partie (en plus une unité renommée qui se balade dans la carte ça donne une bonne ambiance).
Les frégates de la guilde qui débarquent des troupes dans Arrakeen dans la mission 2 ne sont donc pas uniquement là pour faire joli, elle sont aussi "l'horloge" de la carte et déclenchent à chaque passage les interrupteurs qui lancent les vers, mais aussi les attaques harkonnen, et les patrouilles atréides.
exemple :
Carte 2 : Arrivée à
Arrakis
x1, début : Frégate Guilde débarque troupes,
aller à 2
x2, frégate à 2 : Retirer frégate guilde, Donner
ordre troupes aller 3
x3, troupes à 3 : Retirer troupes, créer frégate
1
x4, Retour au point de départ

(Création frégate de la guilde) Condition : temps écoulé au moins 2 s. Action : créer une frégate de la guilde invincible à "départ frégate" donner ordre à la frégate aller à "arrivée frégate".
(Déclenchement x1)
Condition :
joueur neutre amène exactement une frégate à "arrivée frégate"
Action :
configurer "attaque de ver"
définir aléatoirement "attaque harko nord"
définir aléatoirement "attaque harko sud"
donner ordre à troupes d'arrakeen aller à l'autre bout de la carte
retirer frégate de la guilde
créer une frégate de la guilde invincible à "départ frégate"
préserver le trigger.
(Déclenchement x2)
Condition :
joueur neutre amène exactement une frégate à "départ frégate"
Action :
donner ordre frégate aller à "arrivée frégate"
préserver le trigger.
Et voilà, la frégate va maintenant parcourir la carte en boucle, quoi qu'il se passe. En plus, les interrupteurs ont le bon goût de se déclencher instantanément non pas avec plus ou moins 2 s de décalage... Chaque interrupteur pour les différentes attaques est bien entendu effacé au début de l'attaque concernée, exemple pour le ver :

(Apparition du ver) Condition : "attaque de ver" configuré Action : effacer "attaque de ver" créer un ver de sable donner ordre d'aller au milieu du champ d'épice préserver le trigger.
(Attaque de ver)
Condition :
joueur neutre amène un ver des sables au milieu du champ d'épice
Action :
détruire les unités du joueur
donner ordre au ver de continuer sa route
préserver le trigger.
(Retirer le ver)
Condition :
joueur neutre amène un ver à "arrivé du ver"
Action :
retirer le ver
effacer "signe du ver"
préserver le trigger.
Vous constatez qu'il y a maintenant 3 triggers au lieu d'un pour l'attaque du ver mais qu'ils sont tous dépourvus du moindre délai.
Ainsi, l'attaque fonctionne quoi qu'il arrive : le ver est invincible, et rien ne peut changer son ordre, il finira donc par faire son trajet même s'il rencontre des obstacles en cours de route.

Cette carte a permis des innovations pour les attaques de ver. D'abord parce qu'ils étaient plus nombreux, mais surtout parce qu'ils n'étaient pas forcement sur un champ d'épice et donc il fallait gérer leurs destructions différemment.
L'absence d'orni pour le joueur m'a évité aussi de programmer les alertes d'orni et donc d'enrichir les triggers consacrés aux vers. Il fallait que le ver détruise tout sur son passage et non plus juste au milieu du champ d'épice : j'ai donc fait entre 2 et 7 locations pour chaque ver, et chaque location fonctionne comme suit :
(Apparition du ver) Condition : joueur neutre amène un ver des sable à "ver1-1" Action : donner l'ordre au ver aller vers "ver1-2" détruire toutes les unités du joueur à "ver1-1" préserver trigger.
Et ainsi de suite. Vous constaterez en jouant la mission que la destruction est soumise au "plus ou moins 2s" qui se trouve dans ce cas particulièrement visible : les unités ne sont pas instantanément détruites dès qu'elles se trouvent dans la location du ver.

Il y a 4 vers sauvages dans la carte et 3 vers de champs d'épice (qui fonctionnent "à l'ancienne" comme dans la mission 2), en comptant entre 5 et 10 triggers par ver, vous imaginez un peu le temps passé ! (sans compter que dans cette carte il y a aussi le déplacement des contrebandiers, la gestion de l'eau et des objectifs de missions, et tout ça fonctionne par interrupteurs...)
Cette mission est et restera certainement la pire de toutes en matière de programmation de ver. D'abord par le nombre : 7 vers sauvages avec des trajets longs sont présents.
Ensuite par les innovations : il me semblait trop simple que les vers arrivent toujours dans le même sens, régulièrement, et soient par conséquent désespérément prévisibles, cela ne reproduisait pas l'atmosphère périlleuse du rammassage de l'épice sur Dune. J'ai donc décidé de faire 2 sens pour chaque ver, un sens a, et un sens b. Le sens b étant l'exact inverse du sens a pour ne pas multiplier trop les locations (quand même !). Le déclenchement des vers se fait aléatoirement au moyen de 2 interrupteurs chacun :
ver1a et ver1b, l'arbitre qui sert à gérer les temps dans cette carte génère aléatoirement ver1a et ver1b en même temps, il y a ensuite 4 possibilités :
ver1a OUI, ver1b NON ->
lancement de l'attaque du ver n°1 sens a
ver1a OUI, ver1b OUI -> rien ne se passe
ver1a NON, ver1b OUI -> lancement de l'attaque du ver n°1 sens
b
ver1a NON, ver1b NON -> rien ne se passe
Il y a donc une chance sur deux pour qu'un ver apparaisse à chaque cycle et une chance sur deux pour qu'il soit dans un sens ou dans l'autre. En théorie. En pratique je suis tombé sur un nouveau problème : l'arbitre met plus de 2 secondes pour sortir de la zone où il génère les interrupteurs...
Comme le trigger est à préserver, il relance plusieurs fois le calcul, et fatalement, les chances qu'une attaque se déclenche ou qu'un ver apparraisse sont plus grandes.
En plus, dans le cas des attaques harkonnen, la même pouvait se déclencher plusieurs fois de suite, de 2 secondes en 2 secondes... Misère ! le trigger de l'arbitre se trouve donc comme suit :
(Apparition du ver) Condition : joueur neutre amène un arbiter à "départ arbiter" "arbiter1" configuré Action : effacer "arbiter1" configurer "arbiter7" définir aléatoirement "ver1a" "ver1b" "attaqueHmassive" "attaqueHest" donner ordre à arbiter aller vers "arbiter position 2" préserver le trigger.
Où l'on voit que l'interrupteur "arbiter1" empêche ce trigger de se produire plusieurs fois par cycle. La carte 6 contient également l'alerte des ornis : j'ai été obligé de trouver une nouvelle manière de la faire fonctionner car, souvenez-vous, le trigger fonctionnait seulement avec un "orni" et pas avec un "orni d'assaut" ou une "aile portante" par exemple...
ça n'était ni crédible ni jouable dans une mission telle que la 6. J'ai donc défini la zone du champ d'épice uniquement aérienne (contrairement à la zone de destruction du ver qui est uniquement terrestre), ainsi n'importe quel objet volant au dessus du champ d'épice est capable de détecter le ver (même un batiment en transit).
Cette même carte contient également des routines programmées au moyens d'interrupteurs avec des méthodes similaires au ver pour simuler une IA, en effet, les restriction que Dune impose à chaque Maison et notament aux harkonnen empêchent l'ordinateur de les jouer d'une manière censée... des attaques aux patrouilles en passant par la défense de la base tout est ainsi programmé par trigger et interrupteurs. Les cartes 4 et 6 étant les "must" des triggers en boucles et la carte 7 le meilleur exemple de ce qu'il est possible de faire en cinématique (la mission étant linéaire, les boucles de triggers sont moins nombreuses et moins dense).

Voici maintenant rien que pour vos yeux et votre soif de tout savoir (si vous avez tout lu jusqu'ici !) les triggers, tous les triggers qui font fonctionner les vers des sables dans les cartes Dune Mulitjoueur.
Une innovation est encore venue compléter (et simplifier !) les routines décrites précédemment. J'ai découvert le potentiel inexploité d'une commande peu utilisée : move location, et bien sûr encore une innovation : les masses d'épices en gestation. Et maintenant ouvrez grand vos yeux !
trajet du ver : z1 ver1,
z1 ver2, z1 ver3, z1 ver4, et z1 ver5.
Le sens a va de 1 à 5 et le sens b de 5 vers 1.
Une location au dessus de l'épice
pour les alertes de ver : zone epice 1.
Dans propriété, toutes les cases terrestres sont décochées.
Une location pour la zone de
destruction du ver : z1 destruct.
Dans propriété, toutes les cases aériennes sont
décochées.
Une location pour toute la zone : zone epice 1 shai-hulud
Deux locations pour les masses d'épice en gestation : zone epice 1 renouv et zone epice 1 renouv2
Et enfin 8 locations pour les tas d'épices : z1+1, z1+2 ... z1+8.
Les cartes multijoueurs étant programmées
à deux, nous sauvons les triggers et les importons dans l'autre
carte : pour que ça fonctionne il faut que dans une carte
comme dans l'autre, les interrupteurs soient à la même
position (starcraft se fiche de leur nom). Donc le ver prend les interrupteurs
de 28 à 92.
Il y a pour chaque ver : ver a zone 1, ver b zone 1, ver1a présent,
ver1b présent, alerteJ1Z1, alerte J2Z1, alerte J3Z1, alerte J4Z1.
(Ver zone 1 sens a) Condition : ver a zone 1 configuré ver b zone 1 effacé ver1a présent effacé ver1b présent effacé. Action : configurer ver1a présent créer un ver sauvage pour joueur 8 à z1 ver1 appliquer propriété invincible donner ordre à tous ver sauvage pour joueur 8 à z1 ver1 aller vers z1 ver2 préserver le trigger.

-> ce trigger fait apparaître le ver 1 sens a et commence le parcours. Il configure un interrupteur "ver1a présent" qui empêche qu'il y ai plus de 1 ver dans le champ en même temps et qui sert pour l'alerte des ornis.
(Passage du ver 1a) Condition : ver1a présent configuré. Action : centrer endroit nommé z1 destruct sur ver sauvage pour joueur 8 dans zone epice 1 shai-hulud détruire toute unité pour player 1 à z1 destruct détruire toute unité pour player 2 à z1 destruct détruire toute unité pour player 4 à z1 destruct préserver le trigger.

Ce trigger créé dont une zone qui "suit" le ver et détruit toutes les unités au sol pour les joueur 1, 2 et 4. Le joueur 3 étant les fremens, qui ne sont pas affectés par la proximité d'un ver des sables.
L'utilisation de ce trigger permet d'éviter de définir une bonne quinzaine de zones et de faire un trigger par zone pour faire les destructions comme dans la carte 6 : gain inapréciable. Ceci dit, la commande "move location" doit certainement pouvoir servir à faire d'autres choses...

(ver 2->3)
Condition : ver1a présent configuré joueur 8 amène exactement 1 ver sauvage à z1 ver2. Action : donner l'ordre à ver sauvage appartennant à joueur 8 à z1 ver2 aller vers z1 ver3 préserver le trigger.

(ver 3->4)
identique avec les locations
z1 ver3 et z1 ver4

ver 4->5 :
identique avec les locations
z1 ver4 et z1 ver5
fin ver 1a
Condition : ver1a présent configuré joueur 8 amène exactement 1 ver sauvage à z1 ver5. Action : retirer tous ver sauvage pour joueur 8 à zone epice 1 shai-hulud effacer les interrupteurs : ver1a présent, alerteJ1Z1, alerteJ2Z1, alerteJ3Z1, alerteJ4Z1, ver a zone1, ver b zone1

éliminer toutes les unités pour tous joueurs à z1 ver3 créer 1 cielago pour joueur 8 à z1 ver3 créer 2 archons noirs pour joueur 8 à z1 ver3 éliminer toutes les unités pour tous joueurs à z1 ver3 attendre 500 ms

créer 2 archons noirs pour joueur 8 à z1 ver3 éliminer toutes les unités pour tous joueurs à zone epice 1 renouv attendre 150ms créer 1 orni d'assaut pour joueur 8 à z1+1 éliminer tous unités pour tous joueurs à z1+1 créer un tas d'épice pour joueur 8 à z1+1 appliquer propriété 750 cristaux ...

les trois dernières commandes se reproduisent avec diverses ms d'attente sur les zones z1+2, z1+3, z1+4 et z1+5 ..., préserver le trigger.
-> ce dernier trigger contient au début la disparition du ver et la réinitialisation des interrupteurs pour un nouveau cycle et ensuite, tout l'enchainement nécessaire aux effets spéciaux représentant l'explosion de la masse d'épice et la disperssion des nouveaux tas. Vous noterez que les commandes "détruire toutes unités pour tous joueurs" sont ici utilisées et sur des locations terrestres et aériennes, ainsi, toutes les unités de tous les joueurs, fremens compris, ont intérêt à ne pas rester dans les parages.
NOTE : Il convient de vérifier très attentivement que les unités invincibles qui patrouillent dans la carte et servent d'horloge ne passent JAMAIS au-dessus de telles locations : invincibles ou pas elles seraient détruite et gèleraient tous les évènements de la carte...
Vous avez remarqué peut-être que les interrupteur "alerteJxZx" n'ont pas servi ? bien vu. Voici l'alerte des joueurs 1, 2 et 4 :
(alerte ver1a (pour le joueur 1)) Condition : joueur 1 amène au moins 1 n'importe quelle unité à zone epice 1 ver1a présent configuré alerteJ1Z1 effacé. Action : configurer alerteJ1Z1 montrer un minimap ping pour le joueur actuel à z1 ver3 transmition pour joueur actuel d'un orni dans zone epice 1 jouer alerte1.vaw modifier temps de transmition set to 5000 ms afficher le texte "ORNITHOPTERE : Signe du ver ! Je répète : singe du ver !" show minmap ping pour le joueur actuel à z1 ver3 préserver le trigger.
Avec un trigger identique avec la condition ver1b présent pour le ver sens b, tous les joueurs ont donc 2 triggers comme celui-ci pour chaque ver.
Les fremen (joueur 3) n'ont pas la condition d'avoir quelqu'un de présent dans le champ d'épice : ils reçoivent un message un peu différent et le reçoivent à chaque fois qu'un ver apparaît n'importe où dans la carte.
-> l'interrupteur alerteJ1Z1, pour Joueur 1 Zone 1, sert à ce que le détecteur ne donne qu'une seule fois le message par ver. la détection fonctionne à n'importe que moment dès qu'une unité est dans la location aérienne, donc on peut détecter un ver qui soit en train de finir son trajet. Il y a deux minimap ping, un avant, que je joueur n'a probablement pas le temps de voir et un après : en effet, la transmission devrait faire un minimap ping mais il faut pour cela que ce soit l'unité sélectionnée qui soit dans le champ d'épice, dans notre cas, un orni. Le joueur n'ayant pas forcément un orni, il ne verrait pas l'echo radar sans lequel l'avertissement ne sert plus à rien. Le minimap ping qui se trouve après la transmission a lieu en outre à la fin de celle-ci, donc 5000 ms, le joueur aura donc les yeux fixés sur le radar et localisera sans difficulté le danger.
Cette programmation pour les vers reproduit tous les différents
aspects de Dune, et je crois que si on nous avait dit cet été
qu'on en arriverait là, on ne l'aurait pas cru ! Toujours est-il
qu'il faut toujours une incroyable dose de patience et une grande concentration
pour régler tous les triggers nécessaires aux 8 vers présents
sur les cartes multijoueurs Dune :
en tout 64 interrupteurs, 128 triggers et 144 locations...
Mais il vous suffira je pense de mettre un pied dans les sables de Dune
en menant vos troupes à la victoire pour constater que ce travail
n'a pas été vain.
Fait par des joueurs pour des joueurs
Le Bashar : 05/12/2002
© Copyright 2002 Aeriesguard.com
Aerie's Guard V 6.0 réalisé par IvaldaCreations
- hébergé par Celeonet