Les timers (minuteurs) et leur utilisation
Les timers fournissent un mécanisme pour déclencher une ou plusieurs règles après un certain temps. Les timers ont une portée limitée au JGO. Chaque JGO possède 10 timers.
Exemple 1 :
Voici une manière de traiter une demande de tribut en utilisant les timers.
Après 10 minutes de jeu, le JGO demande un tribut et attend 5 minutes pour
l'obtenir.
; Après 10 minutes de jeu, demander un tribut sous 5 minutes
(defrule
(game-time greater-than 600) ; 10 minutes = 600 secondes
=>
(chat-to-player 1 "Donne moi 500 unités d'or dans les 5 prochaine
minutes.") ; Adresser le message au joueur concerné
(clear-tribute-memory 1 gold) ; Remettre à zéro la compteur de tribut d'or
versé par le joueur 1
(enable-timer 1 300) ; Activer le timer N° 1 dans 5 minutes = 300 secondes
(disable-self) ; Désactiver cette règle
)
; Si le tribut n'a pas été reçu à temps, considérer le joueur 1 comme un
ennemi.
(defrule
(timer-triggered 1) ; si le timer N° 1 est déclenché (c'est-à-dire si les 5
minutes sont écoulées)
=>
(disable-timer 1) ; Désactiver le timer N° 1
(chat-to-player 1 "Le temps est écoulé. Tu es désormais mon
ennemi.") ; Informer le joueur 1 de la nouvelle stratégie diplomatique à
son égard
(set-stance 1 enemy) ; Considérer le joueur 1 comme un ennemi
)
; Si le tribut est versé à temps
(defrule
(players-tribute-memory 1 gold greater-or-equal 500) ; Vérifier que le joueur 1
a versé son tribut
=>
(disable-timer 1) ; Désactiver le timer N° 1
(clear-tribute-memory 1 gold) ; Remettre à zéro la compteur de tribut d'or
versé par le joueur 1
(chat-to-player 1 "Merci bien mon brave") ; Remercier le joueur 1
)
Exemple 2
Voici un exemple encore meilleur qui utilise 2 timers. Toutes les 15 minutes
durant la partie, le JGO demande un tibut et attend 5 minutes pour l'obtenir.
; Planifier la première fois le timer à 15 minutes
(defrule
(true)
=>
(enable-timer 2 900) ; Activer le timer 2 après 15 minutes = 900 secondes
(disable-self) ; Désactiver cette règle
)
; Toutes les 15 minutes demander un tribut et laisser 5 minutes au joueur cible
pour apporter le tribut
(defrule
(timer-triggered 2) ; Si le timer 2 est actif alors
=>
(disable-timer 2) ; Désactiver le timer 2
(enable-timer 2 900) ; Réactiver le timer 2 dans 15 minutes
(chat-to-player 1 "Donne moi 500 unités d'or dans 5 minutes.") ;
Informer le joueur 1 qu'il doit verser un tribut dans les 5 prochaines minutes
(clear-tribute-memory 1 gold) ; Remettre à zéro le compteur de tribut d'or du
joueur 1
(enable-timer 1 300) ; Activer le timer 1 dans 5 minutes = 300 secondes
)
; Si le tribut n'a pas été versé par le joueur 1 dans les temps, changer la
politique diplomatique envers ce joueur.
; Il est inutile alors de redemander au joueur de verser un tribut
(defrule
(timer-triggered 1) ; si le timer 1 est actif alors cela signifie que les 5
minutes sont écoulées
=>
(disable-timer 1) ; désactiver le timer 1
(disable-timer 2) ; désactiver le timer 2 (inutile de redemander un tribut)
(chat-to-player 1 "Le temps est écoulé, nous sommes ennemis
maintenant.") ; Avertir le joueur 1 du changement de diplomatie à son
égard
(set-stance 1 enemy) ; Déclarer que le joueur 1 est un ennemi
)
; Si le tribut a été versé dans les temps
(defrule
(players-tribute-memory 1 gold greater-or-equal 500) ; Vérifier que le tribut
correspond bien à la somme demandée
=>
(disable-timer 1) ; désactiver le timer 1
(clear-tribute-memory 1 gold) ; Remettre à zéro le compteur de tribut d'or du
joueur 1
(chat-to-player 1 "C'est très bien d'obéir à mes ordres.") ;
Remercier le joueur 1
)