Skip to content
This repository has been archived by the owner on Jul 24, 2020. It is now read-only.

Un mini système multi agents

Ulis edited this page May 8, 2015 · 2 revisions

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é.

Présentation

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.

Structure générale

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.

Invocation des évènements

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.

Comportement des tourelles

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 (meré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 :

ma

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 :

ma

Clone this wiki locally