-
Notifications
You must be signed in to change notification settings - Fork 10
Un mini système multi agents
Ce tutoriel m'a été +- demandé par Ibiky avec l'Event-Extender 4. Voici une suggestion avec RME, l'énoncé a tout de même été simplifié.
L'idée générale est que sur une carte, on peut avoir des tourelles, et des PNJ. Les tourelles visent les PNJ et le héros si ces derniers sont dans un périmètre de visibilité des tourelles. On part du principe que ce périmètre vaut 2 cases. La problématique générale est que les tourelles et les PNJ sont invoqués dynamiquement et que l'on ne peut pas savoir combien de tourelles ou de PNJ seront présents sur la carte.
L'évènement 1 sera nommé allied
et l'évènement 2 sera nommé tower
.
Les évènements tourelles et Pnj seront en fait des clones de deux évènements stockés sur une autre carte. Sur cette autre carte, mon évènement 1 sera un PNJ par défaut, dont le simple comportement sera de marcher dans des directions aléatoire (ou en suivant le héros :) ), et l'évènement 2 sera une tourelle. Nous nous occuperons de son code plus tard.
Une fois arrivé sur la carte, il faut invoquer les évènements. On va invoquer, par exemple 4 ou 5 alliés et 2 tourelles. Pour ce faire, on fait un évènement automatique (car on ne peut pas invoquer d'évènement dans un processus parallèle qui boucle) et on crée les commandes suivantes :
Appeler Script : invoke_event(33, 1, fresh_event_id, 1, 1)
invoke_event(33, 1, fresh_event_id, 1, 2)
invoke_event(33, 1, fresh_event_id, 1, 3)
invoke_event(33, 1, fresh_event_id, 1, 4)
invoke_event(33, 1, fresh_event_id, 1, 5)
invoke_event(33, 1, fresh_event_id, 1, 6)
invoke_event(33, 2, fresh_event_id, 5, 6)
invoke_event(33, 2, fresh_event_id, 11, 4)
Effacer l'évènement
La commande fresh_event_id
garantit qu'aucun évènement n'ait le même ID. On place les 6 alliés et les deux tourelles. Et la map sur laquelle se trouvent mes deux évènements est la map 33
.
Maintenant nous allons pouvoir programmer le comportement de nos tourelles. Pour cela je me rends sur la map 33 et j'édite le code des évènements de la tourelle. D'abord je le mets en processus parallèle.
Premièrement, il faut trouver un évènement attaquable. Pour ça on se sert du sélecteur once_event
(référencé ici) :
SV[1] =
once_event{|id|
squares_between(me, id) <= 2 and
(event_name(id) == "allied" or id == 0)
}
A ce sélecteur, on lui demande typiquement de trouver un évènement à une distance inférieure ou égale à 2 cases (me
référence "cet évènement, l'évènement courant), et dont le nom est soit "allied" soit son ID est 0 (pour le cas du héros).
Ce qui nous donne comme code évènement :
Et voila, c'est tout ! A chaque fois qu'un évènement est dans le périmètre de la tour et qu'il s'agit d'un allié ou du héros, un message sera affiché de la console :
Introduction
Syntaxe revisitée
- Variables et interrupteurs
- Interrupteurs locaux et variables locales
- Labels et labels locaux
- Affichage dans les messages
Commandes
Valeurs constantes
Evènements enrichis
- Evènements relatifs aux cartes
- Déclencheurs personnalisés
- Déclencheurs en combat
- Sélecteurs
- Boucles évènementielles
- Micro Evènements
Outillage avancé
- Bases de données extensibles
- Définitions de profils et couleurs pour l'afficheur de textes à l'écran
Tutoriels
- Créer des jauges simples
- Créer un QuickTime Event facilement
- Un système d'infiltration
- Un mini système multi-agent
- Un système de saisie de nom custom
- Le passeur d'écran titre
- Créer des jauges en combat
Pour les scripteurs