<!doctype metacosm system>

<article>
<title>RFC sur les dialogues
<author>&frAuthor;
<date>v0.3, 20 mars 2000
      
<abstract>
Ce document spécifie le système de perceptions.
</abstract>

<toc>

&frLicense;

&frProject;

<sect>Historique
<p>
<itemize>
<item>Version 0.3~: Ajouts dans la section 'descriptions'. Création de la section 'Comment faire... ?'. Passage en Metacosm-DTD
<item>Version 0.2~: suppression de la section 'Implantation' remplacée par la 
section 'StimuliDispatcher'. Rajout d'un paragraphe sur la mémoire sensitive 
dans la section 'Sens'. Rajouts dans la section 'Réflexion'
<item>Version 0.1~: première version reprenant les idées la liste de diffusion utopie
et les premières ébauches de documents.
</itemize>

<sect>Notations
<p>
Certains termes sont définis dans le Vocabulary-RFC, disponible sur le site officiel.

<sect>Les Stimuli
<p>
Le système de perceptions est entièrement basé sur l'émission de stimuli par les
entités et la réception de ces stimuli par d'autres entités.

<p>
Les stimuli sont de deux sortes. On distingue~:
<itemize>
<item>Les stimuli descriptifs (ou d'état) qui décrivent l'état de l'entité associée. Ces 
stimuli ont une durée dans le temps qui peut être infinie.

Ex.~:
<tscreen>
La torche émet de la lumière~: durée 6 heures
Le drapeau est rouge~: durée infinie
</tscreen>

<item>Les stimuli d'actions décrivent les actions des entités associées.
Leur durée est instantanée.

Ex.~:
<tscreen>
Janselmeer allume la torche.
La torche s'éteint.
Le dragon émet un grondement assourdissant.
</tscreen>
</itemize>

<p>
Les stimuli peuvent aussi varier en forme et en intensité.
Un stimulus peut ainsi emprunter les média suivants~:
<itemize>
<item>Lumière
<item>Infrarouges
<item>Ultra-violets
<item>Son
<item>Infrason
<item>Ultra-son
<item>Mécanique (toucher)
<item>Saveur (goût)
<item>Odeur
<item>Champ magnétique 
<item>Champ électrique
<item>Vie
<item>Magie
<item>Invisible
<item>Télépathie
<item>... <!-- on ne peut pas penser a tout -->
</itemize>

Son intensité est donnée par un nombre réel positif.
La valeur 1 correspond à une intensité normale (ou moyenne).
En dessous de 1, l'intensité est faible.
Au dessus de 1, l'intensité est forte.
Un échelle peut être construite en appliquant un logarithme décimal (base 10)~:
<tscreen><verb>
<0.001 -> <-3 : intensité exceptionnellement faible
0.001  -> -3 : intensité très faible.
0.01   -> -2 : intensité faible.
0.1    -> -1 : intensité basse.
1      -> 0 : intensité moyenne.
10     -> 1 : intensité élevée.
100    -> 2 : intensité forte.
1000   -> 3 : intensité très forte.
>1000  -> >3 : intensité exceptionnellement forte.
</verb></tscreen>



<sect>Les sens

<p>
Pour pouvoir recevoir des stimuli, les entités possèdent des sens. 
Chaque sens est spécialisé dans la réception de stimuli dans un médium 
spécifique.
Par exemple un humain normal possède 5 sens~:
<itemize>
<item>La vue -> lumière
<item>L'ouïe -> son
<item>Le toucher -> stimulus mécanique
<item>Le goût -> aliment
<item>L'odorat -> odeur
</itemize>

Chaque sens possède aussi une puissance intrinsèque. Plus un sens est 
fort et plus il sera capable de recevoir des stimuli faibles.
Comme pour les stimuli, la capacité d'un sens est donnée par des valeurs 
réelles positives. Une échelle logarithmique identique à celle des stimuli 
peut être construite~:
<tscreen><verb>
<0.001 -> <-3 : puissance exceptionnellement faible
0.001  -> -3 : puissance très faible.
0.01   -> -2 : puissance faible.
0.1    -> -1 : puissance basse.
1      -> 0 : puissance moyenne.
10     -> 1 : puissance élevée.
100    -> 2 : puissance forte.
1000   -> 3 : puissance très forte.
>1000  -> >3 : puissance exceptionnellement forte.
</verb></tscreen>

<p>
Pour savoir si un stimulus a été bien reçu par un sens, il faut multiplier 
les deux puissances (ou ajouter les 2 valeurs sur l'échelle logarithmique).
Pour une valeur de 1, le stimulus est normalement reçu.
En dessous de 1, le stimulus est mal reçu.
Au-dessus de 1, le stimulus est très bien reçu.

Ex.~:
<tscreen><verb>
Stimulus | Sens | réception
----------------------------
   1        1        1       -> reçu
   1       0.1      0.1      -> non reçu
   1       10       10       -> bien reçu
  0.1       1       0.1      -> non reçu
  0.1      0.1      0.01     -> non reçu
  0.1      10       1        -> reçu
  10        1       10       -> bien reçu
  10       0.1      1        -> reçu
  10       10       100      -> très bien reçu
</verb></tscreen>

Suivant le niveau de réception, la description du stimulus peut varier.


<p>
Une fois reçu, le stimulus est conservé temporairement dans une mémoire 
sensitive. Ainsi l'entité peut consulter les stimuli reçus 
à tout moment sans devoir pour autant demander leur réémission à la source.
Cette mémoire est tout à fait indépendante de la mémoire de l'entité et 
est géré de manière totalement autonome.
Elle fonctionne en fait de la même manière qu'une mémoire cache, en 
conservant les derniers stimuli reçus ou les plus consultés tandis que 
les autres seront effacés (ou oubliés) lorsqu'il y aura besoin de libérer 
de la place.
La durée de séjour des stimuli dans cette mémoire sera de toute façon 
limitée. Il est en effet assez naturel de ne plus ressentir un stimulus 
lorsqu'il n'évolue pas au bout d'un certain temps. Par exemple, lorsque 
l'on rencontre une odeur inhabituelle, on la remarque immédiatement et on 
finit par ne plus y faire attention quelques minutes plus tard..


<sect>Focalisation
<p>
En tant normal, une entité reçoit tous les stimuli de manière égale. 
Cependant, il lui est possible en se concentrant de se focaliser sur 
des stimuli particuliers. Sa perception en est alors accrue, tandis que 
celle des autres stimuli s'en trouve diminuée. 
<!-- JANSELMEER -->
<!-- Quel est le % de modification des sens ? -->
<!-- Une compétence pourrait-elle permettre d'améliorer cette capacité ? -->

Il est possible de se focaliser~:
<itemize>
<item>Soit sur tous les stimuli provenant d'une entité en particulier,
<item>Soit sur tous les stimuli d'un médium particulier.
</itemize>

<p>
La commande 'focus' permet de réaliser cela de la façon suivante~:
<itemize>
<item>focus &lt;sens&gt;   -&gt; l'entité se focalise sur les stimuli associés à &lt;sens&gt;
<item>focus &lt;entité&gt; -&gt; l'entité se focalise sur les stimuli provenant de &lt;entité&gt; 
<item>focus          -&gt; l'entité reprend une perception normale.
</itemize>


<sect>Le phénomène d'éblouissement
<p>
Le phénomène d'éblouissement apparaît lorsque un stimulus très fort 
cache des stimuli plus faibles. Le système proposé dans cette section 
doit permettre de simuler ce phénomène.

Il s'agit de réduire ponctuellement la puissance d'un sens en fonction 
de la puissance du stimulus le plus puissant reçu. Ce stimulus est 
forcément d'une durée positive, c'est-à-dire qu'il n'est pas instantané.
La règle est la suivante~:
<p>
Puissance effective du sens~= puissance intrinsèque du sens~/ intensité du stimulus reçu le plus fort
<p>
ou
<p>
Puissance effective du sens~= puissance intrinsèque du sens~- intensité du stimulus reçu le plus fort
en prenant les valeurs sur l'échelle logarithmique.
<p>
Dans tous les cas le stimulus reçu le plus intense doit avoir une intensité 
supérieure à la moyenne (soit 1 ou 0 sur l'échelle logarithmique). Sinon 
la puissance du sens serait accrue et non pas diminuée.

Il est à noter que ce système privilégie les sens les plus puissants 
qui sont éblouis moins facilement que les sens plus faibles.
Ex.~:
<tscreen><verb>
Stimulus    | Stimulus |      |
éblouissant |     reçu | Sens | réception
----------------------------
   10            1        1       0.1 -> non reçu
   10            1       10       1-> reçu
   10            1       100      10-> bien reçu
</verb></tscreen>

<sect>La réflexion
<p>
Cette section s'appuie sur le phénomène physique du même nom.
Voici un exemple simple concernant la lumière~: imaginons un objet 
de forme quelconque (un cube par exemple) de couleur blanche (c'est à dire 
qu'il réfléchit la lumière sur l'ensemble du spectre lumineux). 
Si on plonge cet objet dans le noir, on ne verra rien~: il n'émet pas 
de lumière. Si on allume une lumière rouge, il prend la couleur rouge. 
Si on allume une lumière bleu, il devient bleu et ainsi de suite. Il 
s'agit en fait d'une réflexion~: l'objet renvoie une lumière de la 
couleur reçue.

<p>
Les entités du jeu seront tout à fait capable de réfléchir les stimuli 
reçus de la même façon. En fait chaque stimulus reçu peut influer sur 
l'état de certaines entités et modifier leur émission de stimuli. 
Cependant il faut bien faire attention qu'une entité qui reçoit de la 
lumière bleue et de la lumière jaune ne renverra pas deux stimuli des 
deux couleurs mais un seul de couleur verte. En fait chacun des stimuli 
à modifié l'état de l'entité et c'est à partir de cet état modifié que 
l'entité émet un nouveau stimulus.

<p>
Élargissons maintenant le concept~: supposons qu'une entité renvoie un 
stimulus d'un type différent. Prenons l'exemple du téléphone. On peut 
considérer qu'il s'agit d'une entité qui est capable de recevoir ou 
d'émettre des stimuli électromagnétiques ou sonores. Cependant, s'il est 
plongé dans un système isolé il ne fera rien. Il ne fait en fait que 
transformer des ondes sonores en ondes électromagnétiques et vice-versa.
Le téléphone est donc en quelque sorte un miroir sur lequel nous pouvons 
appliquer le principe de la réflexion.
On peut aussi imaginer une entité d'un type spécial constituée de plusieurs 
parties réparties à différents lieux géographiques. Cela reste hypothétique, 
mais cela pourrait donner un émetteur/récepteur à distance pouvant recevoir 
des stimuli dans un lieu et les réémettre dans un autre. Les perspectives 
données par de telles entités sont très intéressantes, comme des relais de 
stimuli d'un conteneur vers un autre (voir la section "StimuliDispatcher").


<sect>Les descriptions
<p>
Une entité reçoit toutes les informations sur son environnement grâce aux 
stimuli. Par exemple, elle pourra obtenir en recevant un stimulus visuel 
provenant d'une créature, son identité, sa taille, sa race, son âge approximatif, son poids 
approximatif... Un stimulus sonore pourra aussi la renseigner sur d'autres 
informations. Ces données brutes suffiront à un bot mais pour un joueur 
humain, il faut mettre en forme ces données de manière textuelle, 
graphique, sonore ou autre... Ceci est l'objectif du mécanisme de description 
dynamique. La suite traite uniquement des descriptions textuelles mais cela s'adapte dans la plupart des cas aux autres types de descriptions.


Voici un exemple d'une entité avec quelques attributs et les descriptions qui 
pourraient être générées~:

<tscreen><verb>
identité : EntityID
race : loup
taille : 2 m
couleur : gris
position : x y z (coordonnées 3D)
</verb></tscreen>


La description générée au vol est~:
"Un énorme loup gris se trouve à quelques mètres devant vous.".
Si le loup était déjà connu sous le nom de "Médor" par le personnage 
(c'est-à-dire si l'entité EntityID était dans la mémoire du personnage),
elle pourrait devenir~:
"Médor se trouve à quelques mètres devant vous.".

<p>
Un stimulus transporte donc un certain nombre d'informations qui peuvent 
ensuite être utilisées par les entités qui les reçoivent. Cependant, on 
a vu dans les sections précédentes qu'un stimulus pouvait être plus ou 
moins bien perçu. Ces informations ne seront donc pas toujours accessibles 
et pourront aussi être déformées. Certaines informations peuvent aussi 
nécessiter une perception excellente tandis que d'autres seront facilement 
obtenues.


Voici un autre exemple concernant cette fois-ci une action~:

<tscreen><verb>
Entité sujet~: EntityID (Raoul)
Action~: ActionID (manger)
Entité objet~: EntityID (du pain)
...
</verb></tscreen>

La description sera~: 
<tscreen><verb>
"Raoul mange du pain"
</verb></tscreen>

<bf>
Si le stimulus est mal reçu, cette description pourrait être remplacée 
par l'une des suivantes~:
</bf>

<tscreen><verb>
"Quelqu'un mange du pain"
"Raoul fait quelque chose avec du pain"
"Raoul mange quelque chose"
"Quelqu'un fait quelque chose avec quelque chose"
...
</verb></tscreen>

<bf>
Ou bien la description pourrait même être tout à fait fausse~:
</bf>

<tscreen><verb>
"Raoul vous menace avec du pain"
"Raoul mange du bois"
</verb></tscreen>


<p>
<bf>
Le problème qui se pose alors est de savoir quelle partie des descriptions 
sera altérée. Le problème se pose non seulement pour les joueurs mais 
aussi pour les bots puisque cela concerne les attributs à la source. Nous 
associons pour cela un indice de réception minimal à chaque attribut. 
Le niveau de réception du stimulus doit être supérieur à la valeur de cet 
indice pour une lecture optimale de l'attribut.
Pour mieux comprendre, reprenons l'exemple précédent~:
</bf>

<tscreen><verb>
Entité sujet~: EntityID (Raoul) : 0.01
Action~: ActionID (manger) : 7
Entité objet~: EntityID (du pain) : 1

réception 10 : "Raoul mange du pain"
           1 : "Raoul mange quelque chose"
         0.1 : "Raoul vous menace avec du pain"
        0.01 : "Raoul mange du bois"
</verb></tscreen>

<bf>
Cependant, contrairement à l'exemple, il ne sera pas aussi simple en pratique 
de donner une valeur fausse aux attributs sauf pour le cas où ils sont 
numériques (taille, longueur, poids...). On pourra alors déterminer 
aléatoirement la valeur fictive dans un intervalle centré sur la valeur 
réelle et de diamètre croissant lorsque le niveau de réception diminue. 
</bf>


<p>
Changeons de sujet pour la fin de cette section. 
Dans les exemples précédents, les informations sont réduites et les 
descriptions sont donc courtes. Cependant, pour des stimuli d'état les 
descriptions (au moins textuelles) risquent d'être trop longues. Par 
conséquent, il faudra pouvoir générer une description détaillée (longue) 
et une description plus courte. La description courte est celle proposée 
par défaut mais l'utilisateur peut à loisir consulter la description 
longue. Ceci peut s'appliquer aussi bien à des textes ou d'autres types 
de descriptions. Par exemple, on peut imaginer un interface graphique 
dans laquelle les entités apparaissent sous forme d'images (la description 
courte) et le fait de cliquer dessus fait apparaître une fenêtre 
comportant des informations supplémentaires sur l'entité.

Ex.~:
<tscreen>
description courte: "Raoul est derrière son comptoir"
<p>
description longue: "Raoul est derrière son comptoir. 
<p>
C'est un homme corpulent de taille moyenne. Il porte un marcel et un pantalon 
blanc tenu par des bretelles."  <!-- Pas trop cliché comme description pour un boulanger ! -->
</tscreen>

<sect>StimuliDispatcher

<p>
En français cela signifie "répartisseur de stimuli". Le StimuliDispatcher 
est en fait le grand intermédiaire entre les entités émettrices de stimuli 
et celles qui les reçoivent. Il existe un StimuliDispatcher associé à 
chaque conteneur y compris bien sûr les scènes puisque c'est là que les 
échanges de stimuli sont les plus nombreux. 


<p>
Le fonctionnement est le suivant~: 
lorsque une entité entre dans un nouveau conteneur, celle-ci est enregistrée 
auprès du StimuliDispatcher local en tant que nouvelle entité pouvant 
émettre des stimuli (on considère que toute entité peut potentiellement 
en émettre même si cela pourrait ne pas être toujours le cas), et 
pour la réception sur chacun de ses sens. Le StimuliDispatcher demande 
alors la réémission des stimuli pour toutes les entités enregistrées 
de sorte que la nouvelle entité puisse avoir un aperçu de son environnement.
Par la suite, lorsque un stimulus est émis par n'importe quelle entité, 
le StimuliDispatcher l'achemine vers tous les sens enregistrés qui 
peuvent le recevoir. Le rôle du StimuliDispatcher est donc seulement 
limité à la livraison des stimuli; en aucun cas il ne doit les modifier.


<sect>Comment Faire... ?

<p>Cette section a pour but de montrer comment le système de perceptions défini 
dans les sections précédentes peut s'appliquer dans des cas inhabituels. 
Il s'agit de cas de figure qui ne peuvent pas apparaître dans le monde 
réel et qui seront notamment créés avec des effets magiques.


<itemize>
<item><bf>Comment réaliser un stimulus ambiant ?</bf>
<p>
Il suffit de définir le lieu comme la source du stimulus.

<item><bf>Comment réaliser un stimulus délocalisé ?</bf>
<p>
Par exemple, on peut vouloir émettre un stimulus dans un ville A alors 
que l'on est dans une ville B. Il suffit pour cela que l'entité émettrice 
s'enregistre auprès du StimuliDispatcher associé à B, émette son stimulus, 
et se désenregistre.

<item><bf>Comment faire de la ventriloquie ?</bf>
<p>
Il suffit d'émettre un stimulus sonore en spécifiant que la source est 
l'entité visée au lieu de celle qui crée le stimulus.

<item><bf>Comment faire un stimulus mondial ?</bf>
<p>
Il suffit de relayer un stimulus diffus sur tous les StimuliDispatcher.

<item><bf>Comment modifier par une illusion l'apparence d'une entité ?</bf>
<p>
Par exemple, Il peut s'agir de donner l'apparence d'un lingot d'or à 
un lingot de plomb ou donner l'apparence d'une souris à un éléphant.
Pour cela, l'entité visée doit émettre un stimulus qui ne correspond pas 
à son état interne réel (le lingot de plomb a toujours le même poids 
et non pas celui d'un lingot d'or). 
Pour cela, on peut imaginer qu'un sort puisse en faire en sorte que l'entité 
visée modifie les stimuli avant de les envoyer, ou bien intercepter les 
stimuli émis et les modifier ensuite (voire les remplacer par d'autres). 

<item><bf>Comment créer l'illusion da la présence d'une entité ?</bf>
<p>
C'est plus compliqué que le cas précédent puisqu'il faudra créer spécialement 
une entité possédant l'apparence souhaitée (mais uniquement l'apparence, 
cette entité pouvant n'avoir aucune existence physique). 

</itemize>



<sect>Résumé

<p>
Un Stimulus, c'est:
<itemize>
<item>Une entité source
<item>Une intensité intrinsèque
<item>Un médium
<item>Une action le cas échéant
<item>Des attributs pour décrire la source ou l'action.
</itemize>

Un sens, c'est:
<itemize>
<item>Un médium
<item>Une sensibilité (puissance)
<item>Une mémoire des derniers stimuli reçus.
</itemize>

Un StimuliDispatcher, c'est:
<itemize>
<item>Un ensemble d'entités sources.
<item>Un ensemble de sens récepteurs par médium différent.
</itemize>

<p>
Nouvelles commandes:
<itemize>
<item>focus~: permet de se concentrer sur des stimuli particuliers
</itemize>

</article>