home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Fujiology Archive
/
fujiology_archive_v1_0.iso
/
!FALCON
/
!BONUS
/
GAMES
/
TETR141.ZIP
/
HELP
/
TETRHELP.FRA
< prev
Wrap
Text File
|
1996-01-29
|
87KB
|
1,549 lines
TETRHEX, version 1.40 (24/01/1996)
¯¯¯¯¯¯¯
Ce texte contient toute la documentation de TETRHEX. Il peut être obtenu de
3 manières différentes: en allant lire directement le fichier TETRHELP.FRA,
en choisissant l'item "Aide sur TETRHEX" (touche Help) dans TETRHEX, ou en
tapant "tetrhex -h" dans un shell. Au cas où il s'agirait de la deuxième
manière, voici les touches utilisées: flèches haut et bas (1 ligne), avec
Ctrl (4 lignes), avec Shift (1 page), avec Ctrl-Shift (4 pages), Clr-Home
(début du document), Shift-Clr-Home (fin du document), Esc (sortir).
TETRHEX est un jeu SHAREWARE. Si vous voulez avoir la version complète
(sans limitation), vous devez vous faire enregistrer en m'envoyant 50 FF ou
20 DM (ou plus si vous voulez) à l'adresse suivante:
Vincent Lefèvre
24 rue Louis Blanc
31400 Toulouse
FRANCE
N'oubliez pas de me donner votre nom et votre adresse!
Si vous avez accès à Internet, il est préférable de me contacter d'abord
par e-mail:
vlefevre@ens.ens-lyon.fr
La dernière version non enregistrée est disponible à:
http://www.ens-lyon.fr/~vlefevre/tetrhex/index_fra.html
Table des matières
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
0. Disclaimer standard
1. Introduction
2. Configuration requise
3. Compatibilité
3.1. Disquette ou disque dur amovible
3.2. Carte Screen Blaster
3.3. Blow-Up
3.4. Let 'em Fly
3.5. Winx (version 2.2)
3.6. NVDI (versions 2.5 et 3)
3.7. SpeedoGDOS (version 4.xx)
3.8. Outside (mémoire virtuelle)
3.9. LED Panel
3.10. Idle (protecteur d'écran)
3.11. Système autre que le TOS
4. Lancement et configuration
5. Jeu TETRHEX
5.1. Menu principal
5.2. Aide
5.3. Nom du joueur
5.4. Jeu
5.5. Affichage des meilleurs scores
6. Fichiers de règle
6.1. Données utilisées lors du jeu
6.2. Actions
6.3. Signaux
6.4. Phases du jeu
6.5. Variables spéciales
6.6. Code des couleurs
6.7. Modes pause
6.8. Structure d'un fichier de règle
6.9. Langage RUL
7. Messages
8. Notes techniques
8.1. Flags du programme
8.2. Codes d'erreur
8.3. Déplacement de la fenêtre
8.4. Modification de la palette
9. Limitations de la version non enregistrée
0. Disclaimer standard
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Je ne suis pas responsable d'éventuels dommages causés par ce logiciel.
Son utilisation est entièrement à vos risques.
1. Introduction
¯¯¯¯¯¯¯¯¯¯¯¯
TETRHEX est un jeu, ou plutôt un ensemble de jeux, de type Tetris ou
Columns se jouant sur un tableau hexagonal, avec des cases hexagonales. Ses
principales caractéristiques sont:
_ Possibilité de modifier les règles existantes et de définir ses
propres règles dans un langage spécifique à TETRHEX. 3 règles sont
fournies avec TETRHEX: Tetrhex, Hexcolumns et Tet'light.
_ Pièces spéciales, qui augmentent l'intérêt du jeu.
_ TETRHEX utilise les fonctions du GEM, sauf pour certains affichages.
Il est donc compatible avec de nombreux programmes système (se
trouvant dans le dossier AUTO): NVDI, SpeedoGDOS, carte Screen
Blaster, Outside, MiNT/MultiTOS, ...
_ TETRHEX peut afficher des fontes vectorielles si SpeedoGDOS ou
NVDI 3 est présent. On peut choisir ses fontes. TETRHEX sélectionne
automatiquement la hauteur de fonte la plus adaptée, en fonction de
la fonte et du texte à afficher.
_ Nombreuses options; configuration sur 2 niveaux sous forme d'options
style Unix: permanente (sauvegarde dans un fichier) et au lancement.
_ Possibilité de jouer en mode plein écran ou dans une fenêtre GEM
(l'AES 4.1 est supporté: la fenêtre peut être iconifiée).
_ Possibilité de mettre TETRHEX en accessoire.
_ Liste de langues à utiliser par ordre de préférence, utile notamment
à cause de l'aide située dans les fichiers de règle. Par défaut, la
langue du système est utilisée de préférence.
_ Tableau hexagonal de taille variable (4 tailles différentes).
_ TETRHEX peut sauvegarder jusqu'à 255 scores pour chaque règle et
chaque taille du tableau hexagonal.
_ Possibilité de donner à TETRHEX des routines relogeables permettant
de communiquer avec l'extérieur. Applications possibles (certaines
routines n'existent pas encore): possibilité de jouer au Joypad (au
lieu du clavier) ou peut-être même par la voix (grâce au DSP), faire
jouer des modules .MOD en arrière-plan à certains moments donnés,
afficher des images de fond, faire jouer l'ordinateur, débuggeurs de
fichiers de règle, ...
2. Configuration requise
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
TETRHEX a été écrit pour Falcon, mais devrait pouvoir tourner sur tout
Atari (ou autre machine à base de TOS) muni d'un 680x0 avec x ≥ 2, ayant un
mode graphique 256 couleurs ≥ 640 * 480 compatible Falcon (i.e. dont les
plans sont entrelacés), éventuellement avec un système d'exploitation de
remplacement comptatible TOS/GEM.
Sur Falcon, TETRHEX peut tourner avec n'importe quel type d'écran couleur.
Cependant un moniteur VGA est conseillé; car sur RGB, TETRHEX doit tourner
en mode entrelacé.
TETRHEX a besoin d'environ 300 Ko de mémoire libre (ST RAM ou TT RAM) pour
tourner. Un des deux timers A et D est utilisé (cf section "Lancement"); par
défaut, c'est le timer D qui est choisi.
3. Compatibilité
¯¯¯¯¯¯¯¯¯¯¯¯¯
Contrairement à la plupart des jeux, TETRHEX est généralement compatible
avec les programmes situés dans le dossier AUTO. Cependant il peut parfois y
avoir quelques problèmes. Il en est de même du point de vue hardware. La
liste des programmes/matériels testés et des problèmes rencontrés est donnée
ci-dessous.
En mode plein écran, si vous n'êtes pas dans une bonne résolution, TETRHEX
essaie automatiquement de changer de résolution. Le principal problème est
que certains programmes du dossier AUTO ne le permettent pas. Soit vous
devez désactiver ces programmes, soit vous devez vous mettre dans une bonne
résolution avant de lancer TETRHEX. Note: l'ordre des programmes dans le
dossier AUTO est très important; il est possible que certaines indications
données ci-dessous soient plus ou moins correctes, suivant tel ou tel ordre.
3.1. Disquette ou disque dur amovible
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Si le fichier de règle a été chargé à partir d'une disquette ou d'un
disque dur amovible (SyQuest), il ne faut pas changer de disque si la liste
des scores peut être modifiée (ce qui est généralement le cas), surtout si
le nouveau disque contient un fichier de même nom et de même chemin.
3.2. Carte Screen Blaster
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Il n'y a jamais de tentative de changement de résolution, sinon ça plante.
Pour savoir si la carte Screen Blaster est présente, on recherche le cookie
OSBL. Note: ce cookie ne peut être enlevé qu'après un redémarrage complet
(ctrl-alt-Rshift-delete); par conséquent, il se peut que le changement de
résolution soit refusé bien que la carte soit totalement désactivée (après
un redémarrage partiel).
Comme avec les autres logiciels / cartes augmentant la résolution, en mode
plein écran, seule la partie de l'écran faisant 640 * 480 et centrée est
utilisée.
3.3. Blow-Up
¯¯¯¯¯¯¯
En mode plein écran, TETRHEX plante quand la résolution verticale n'est
pas un multiple de 16. Je ne sais pas pourquoi.
3.4. Let 'em Fly
¯¯¯¯¯¯¯¯¯¯¯
Si l'option "Send Redraw" est active, il y a un problème d'affichage après
appel du sélecteur de fichiers: en mode fenêtre GEM, un message de redraw
est envoyé (cela fait juste perdre un peu de temps); en mode plein écran, la
partie située sous le sélecteur de fichiers est effacée (c'est beaucoup plus
gênant). Il est donc recommandé de désactiver l'option "Send Redraw" si vous
avez besoin de charger différents fichiers de règle, surtout si vous êtes en
mode plein écran.
3.5. Winx (version 2.2)
¯¯¯¯
Il n'y a aucun problème. En mode fenêtre GEM, il est possible de mettre la
fenêtre en arrière-plan en cliquant sur la barre de titre.
3.6. NVDI (versions 2.5 et 3)
¯¯¯¯
Le changement de résolution est impossible, mais il n'y a généralement pas
de plantage (il y a plantage si LED Panel est présent).
Il est recommandé d'activer l'option "TOS compatibility" si vous avez
besoin de charger différents fichiers de règle. Sinon, on a le même problème
qu'avec Let 'em Fly avec option "Send Redraw" active (cf ci-dessus).
Avec la version 3 de NVDI, vous pouvez utiliser des fontes vectorielles.
Mais ne les utilisez pas dans l'aide: ça bugge complètement.
3.7. SpeedoGDOS (version 4.xx)
¯¯¯¯¯¯¯¯¯¯
Si SpeedoGDOS est installé (ce qui est recommandé, sauf si vous avez
NVDI 3 d'installé), vous pouvez utiliser des fontes vectorielles.
Le changement de résolution est impossible, mais il n'y a pas de plantage.
Si au moins une chaîne écrite avec une fonte vectorielle a été soulignée
(dans l'aide), les rectangles pleins ne sont plus affichés: vous devez
quitter. Ceci semble provenir d'un bug de SpeedoGDOS.
3.8. Outside (mémoire virtuelle)
¯¯¯¯¯¯¯
Il n'y a aucun problème. Les drapeaux concernant la TT-RAM peuvent être
mis à 1.
3.9. LED Panel
¯¯¯¯¯¯¯¯¯
Pour éviter des conflits d'affichage, on a la possibilité de désactiver
LED Panel lorsqu'on est en mode plein écran. LED Panel est réactivé lorsque
TETRHEX se termine.
3.10. Idle (protecteur d'écran)
¯¯¯¯
Lorsque la protection s'active, des blocs de mémoire de TETRHEX sont
parfois altérés (tests effectués avec la version 2.2 d'Idle).
3.11. Système autre que le TOS
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Il ne faut pas utiliser la protection mémoire si la mémoire vidéo est
protégée contre la lecture/écriture.
Il ne faut pas modifier un fichier de règle chargé par TETRHEX si la liste
des meilleurs scores peut être modifiée, car TETRHEX ne s'en rendrait pas
compte et la structure du fichier pourrait devenir mauvaise.
4. Lancement et configuration
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
TETRHEX peut être lancé soit en double-cliquant sur son icone à partir du
bureau, soit dans un shell (par exemple dans celui de Gemini). Dans les deux
cas, on peut lui donner des options style Unix. On forme une chaîne composée
du fichier de configuration TETRHEX.CFG (s'il existe), suivi des options de
la ligne de commandes (s'il y en a); un exemple sera donné après la liste
des options. Note: pour pouvoir entrer des options après avoir double-cliqué
sur l'icone, il faut remplacer l'extension .PRG par l'extension .GTP
(équivalent de .TTP pour un programme GEM). Les options commencent par le
caractère '-' et sont séparées par des blancs (espace et caractères de
contrôle, i.e. caractères de code ASCII ≤ 32). La ligne de commandes ne doit
pas contenir plus de 125 caractères; si les options sont trop nombreuses,
stockez-les dans un fichier et utilisez l'option -o. Si la syntaxe de la
chaîne entière est incorrecte, le programme se termine immédiatement (et
renvoie un code d'erreur non nul). Voici les options:
-b <Ir> <Iv> <Ib> <Dr> <Dv> <Db>
Couleur du tableau hexagonal. Cette option est suivie de 6 nombres,
tous compris entre 0 et 255. Les 3 premiers nombres sont les
intensités des composantes rouge, verte et bleue du cadre. Les 3
nombres suivants sont les valeurs à enlever à chacune des intensités
pour passer à la partie du cadre située un cran plus loin vers le
fond. Le triple de chacune de ces valeurs doit être ≤ à la valeur
correspondante de la partie située au premier plan, car il y a 3
autres plans. Les 6 nombres par défaut sont 240, 240, 240, 48, 48,
48. Si les conditions ne sont pas respectées, l'option n'est pas
prise en compte.
-cd <R> <V> <B>
[Color Date] Couleur de la date. Cette option est suivie de 3
nombres compris entre 0 et 255: intensité des composantes rouge,
verte et bleue. Si un nombre n'est pas compris entre 0 et 255,
l'intensité de la composante correspondante est inchangée. Si après
toutes les occurrences de "-cd" les 3 intensités sont nulles, alors
les 3 intensités sont mises à 255 (blanc).
-ch <R> <V> <B>
[Color Help] Couleur du texte d'aide. Cf option "-cd".
-ci <nombre>
[Color Icon] Index de la couleur de l'icone (à partir de l'AES 4.1),
entre 0 et 15.
-cp <nombre>
[Color Pause] Index de la couleur de "-- PAUSE --" (mode pause de la
fenêtre), entre 0 et 15.
-ct <R> <V> <B>
[Color Time] Couleur de l'heure. Cf option "-cd".
-da
[Display All] Affichage de la date et l'heure (comme "-dy -ds").
-dd
[Display Date] Affichage de la date sans l'année.
-dn
[Display Nothing] Ni la date, ni l'heure n'est affichée.
-ds
[Display Seconds] Affichage de l'heure avec les secondes.
-dt
[Display Time] Affichage de l'heure sans les secondes.
-dy
[Display Year] Affichage de la date avec l'année.
-e[+/-]
[Error display] Des messages d'erreur peuvent être envoyés sur la
sortie standard. Il est conseillé de n'utiliser cette option que
dans les cas suivants: vous êtes sous MultiTOS et vous avez une
console, et/ou TETRHEX ne marche pas comme vous voulez et vous
aimeriez savoir pourquoi.
-f+ <nombre>
Nombre qu'il faut ajouter aux numéros des fontes vectorielles pour
obtenir l'index (utilisé par la VDI). Valeur par défaut: 0. Suivant
la version de SpeedoGDOS, c'est habituellement 0 ou 5000. Dans les
options suivantes "-f? <nombre>", il faut faire précéder le nombre
d'un '+' pour indiquer que la fonte est vectorielle.
-fe <nombre>
[Font mEnu] Numéro de la fonte utilisée pour afficher "Menu".
-fg <nombre>
[Font Game] Numéro de la fonte utilisée dans le jeu lui-même.
-fh <nombre>
[Font Help] Numéro de la fonte utilisée pour afficher l'aide.
-fm <nombre>
[Font Menu] Numéro de la fonte utilisée dans les menus.
-fn <nombre>
[Font Name] Numéro de la fonte utilisée pour le nom de la règle.
-fo <nombre>
[Font game Over] Numéro de la fonte utilisée pour "game over".
-fp <nombre>
[Font Pause] Numéro de la fonte utilisée pour "-- PAUSE --".
-fr <nombre>
[Font Register] Numéro de la fonte utilisée pour afficher le texte
sous "Shareware".
-fs <nombre>
[Font Score] Numéro de la fonte utilisée pour les meilleurs scores.
-ft <nombre>
[Font Tetrhex] Numéro de la fonte utilisée pour "TETRHEX x.xx".
-fw <nombre>
[Font shareWare] Numéro de la fonte utilisée pour "Shareware".
-gdos
Fait comme si SpeedoGDOS était présent (utile si le flag GDOS n'est
pas correct).
-h ou -help
Aide: le fichier d'aide est envoyé sur la sortie standard.
-i off
Coupe le haut-parleur interne. L'état antérieur ne sera pas récupéré
à la fin du programme.
-i on
Branche le haut-parleur interne. L'état antérieur ne sera pas
récupéré à la fin du programme.
-l <param>
Préférences des langages. Il y a autant de paramètres que l'on veut
(éventuellement aucun). Chaque paramètre est soit un nombre positif
ou nul, indiquant le langage de manière absolue (cf ci-dessous),
soit le caractère '?', indiquant le langage donné par le cookie _AKP
(langage utilisé par le système), soit le caractère '*', indiquant
un ou plusieurs langages se rapprochant de celui du système (il n'y
a que 3 groupes de langages: {0,3}, {1,8} et {2,7}). La chaîne de
paramètres par défaut est "* 0 3".
Codes des pays: 0: Etats-Unis, 1: Allemagne, 2: France, 3: Royaume-
Uni, 4: Espagne, 5: Italie, 6: Suède, 7: Suisse française, 8: Suisse
allemande, 9: Turquie, 10: Finlande, 11: Norvège, 12: Danemark, 13:
Arabie Saoudite, 14: Pays-Bas, 15: Tchécoslovaquie, 16: Hongrie.
-ma
[Memory Allocate] La zone mémoire contenant l'image de fond ne sera
jamais libérée (sauf lorsque le programme se termine), ainsi l'image
de fond ne sera jamais recalculée.
-mf
[Memory Free] La zone mémoire contenant l'image de fond sera
toujours libérée après l'affichage, et l'image de fond sera toujours
recalculée quand elle devra être réaffichée.
-n <nombre>
Taille d'un côté du tableau hexagonal (entre 6 et 9).
-o <fichier>
[Options] La liste des options restantes est remplacée par le
fichier, ce qui permet d'avoir plusieurs fichiers de configuration.
-p <chaîne>
[Player] La chaîne contient le nom du joueur, mis entre guillemets
ou apostrophes. Si la chaîne est vide (valeur par défaut), le joueur
devra entrer son nom si son score est assez élevé pour entrer dans
la liste des meilleurs scores.
-r <fichier>
[Rule] Détermine le fichier de règle (extension .RUL) à charger par
défaut.
-s <fichier>
Fichier de messages (extension .MSG), permettant de communiquer avec
d'autres programmes (cf section "Messages").
-ta
[Timer A] C'est le timer A qui sera utilisé (indépendemment de
l'état de la touche Shift-gauche).
-td
[Timer D] C'est le timer D qui sera utilisé (indépendemment de
l'état de la touche Shift-gauche).
-u[+/-]
Laisse la liste des meilleurs scores inchangée.
-vhc <n0> <n1> <n2> <n3> <n4> <n5> <n6> <n7>
[Video Hex Color] Intensités des 8 niveaux pour l'affichage des
hexagones. Le premier nombre correspond au niveau le plus foncé, et
le dernier correspond au niveau le plus clair. Par exemple, pour un
hexagone jaune, les intensités en rouge et en vert auront la valeur
donnée par l'option, et l'intensité en bleu sera nulle. Les valeurs
par défaut sont: $30, $60, $78, $90, $A8, $C8, $D8, $F8.
-vhw <n0> <n1> <n2> <n3> <n4> <n5> <n6> <n7>
[Video Hex White] Intensités en blanc supplémentaires. L'intensité
indiquée est ajoutée à chacune des 3 composantes rouge, verte et
bleue. Si, pour une ou plusieurs composantes, la somme est > à 255,
alors elle est ramenée à 255. Les valeurs par défaut sont: $00, $00,
$00, $00, $10, $20, $50, $80.
-vl[+/-]
[Video LED Panel] Désactive LED Panel en mode plein écran (ne fait
rien en mode fenêtre GEM). LED Panel sera remis à son état initial à
la fin du programme.
-vr[+/-]
[Video Resolution] Interdit le changement de résolution; si celle-ci
est incorrecte, une erreur est renvoyée.
-vs[+/-]
[Video Synchro] Effectue une synchronisation avec l'interruption VBL
pour certains affichages, notamment pour l'affichage des fontes
vectorielles; dans ce dernier cas, cette option n'est utile que si
l'affichage est assez rapide. C'est le cas de NVDI 3, mais pas de
SpeedoGDOS 4.
-wp <x0> <y0>
[Window Position] Position du point supérieur gauche de la fenêtre
(en mode fenêtre GEM). Si cette position est incorrecte, la fenêtre
est placée à la position par défaut.
-wpc
[Window Position: Centered] Centre la fenêtre (en mode fenêtre GEM).
-ws
[Window Screen] Mode plein écran. C'est l'option par défaut lorsque
le cookie MiNT n'est pas présent. Il faut éviter d'utiliser cette
option lorsque l'on travaille en multitâches.
-wu[+/-]
[Window Update] En mode plein écran, le sémaphore d'écran est activé
en permanence. Ainsi les processus tournant en arrière plan (i.e.
généralement les accessoires) ne peuvent plus rien afficher.
-ww
[Window Window] Mode fenêtre GEM. C'est l'option par défaut lorsque
le cookie MiNT est présent.
Les nombres sont en décimal, sauf s'ils sont précédés d'un '$', auquel cas
ils sont en hexadécimal. Pour les options "-u", "-vl", "-vr", "-vs" et
"-wu", un '-' situé après signifie que l'option doit être désactivée; le '+'
(facultatif) signifie qu'elle doit être activée. Au lieu de donner des
options dans la ligne de commandes, on peut faire glisser un fichier
d'options, un fichier de règle ou un fichier de messages sur l'icone de
TETRHEX. Cette opération correspond respectivement aux options "-o", "-r" et
"-s". Certaines options ont des effets opposés (ta/td, -vr+/-vr-, -vs+/-vs-,
...); seule la dernière dans la chaîne d'options est prise en compte.
Par exemple, si le fichier TETRHEX.CFG contient la chaîne "-ww -wpc -n 6",
et les paramètres sont "-ws -vs", alors le jeu se déroulera en mode plein
écran, avec la synchronisation vidéo et un tableau hexagonal de 6 hexagones
de côté.
Au moment du lancement, si la touche Shift-gauche est enfoncée, c'est le
timer A qui sera utilisé (sauf si l'option "-td" est donnée) au lieu du D
(utile si le port série est utilisé pendant le jeu).
A l'aide d'un player de modules en accessoire ou/et à l'aide d'un fichier
de messages, on peut faire jouer des modules en arrière-plan; il faut alors
prendre le timer D pour TETRHEX (timer par défaut). Mais sur Falcon 030 sans
carte accélératrice, on a des parasites sur l'écran lors des changements de
palette de couleurs, i.e. pendant la présentation et quand on passe d'un
écran à un autre.
Il est possible de mettre TETRHEX en accessoire. Pour cela, il faut copier
l'exécutable TETRHEX.PRG/GTP dans la racine de la partition de boot (C:\ en
général) et le renommer en TETRHEX.ACC; recopier également les fichiers de
règle, TETRHEX.CFG et TETRHEX.LNG au même endroit. Attention! il subsiste
deux gros problèmes: d'une part un problème de gestion mémoire (l'ordinateur
peut planter, en particulier, ne lancez pas ou ne quittez pas un programme
pendant que vous être en train de faire une partie); d'autre part, TETRHEX
utilise un chemin courant pour les fichiers de règle, mais sous TOS, le
chemin courant n'est pas local à l'application, si bien que la sauvegarde
d'un score peut provoquer une erreur. Pour l'instant, lorsqu'il y a une
erreur, vous ne pouvez plus utiliser l'accessoire TETRHEX. Cette possibilité
de faire tourner TETRHEX en accessoire est nouvelle et pourra être améliorée
par la suite.
N.B.: le fichier de règle TETRHEX.RUL doit se trouver dans le même dossier
que l'application TETRHEX.PRG/GTP/ACC.
5. Jeu TETRHEX
¯¯¯¯¯¯¯¯¯¯¯
Après avoir lancé TETRHEX, une fenêtre s'affiche immédiatement si le jeu
doit se dérouler dans une fenêtre GEM. En mode plein écran, TETRHEX essaie
d'abord de changer de résolution si besoin est, sauf si l'option -vr est
activée, mais peut échouer à cause de certains programmes du dossier AUTO
(cf "Compatibilité"); ensuite une courte présentation commence, pendant
laquelle l'image de fond est calculée; appuyer sur une touche pour passer au
menu principal.
A tout moment, on peut libérer la mémoire prise par l'image de fond en
appuyant sur Ctrl-F, ou bien, si le jeu se déroule dans une fenêtre GEM, en
cliquant n'importe où avec le bouton droit de la souris.
En mode fenêtre GEM, on peut quitter à tout moment en fermant la fenêtre
(clic sur le closer). A partir de l'AES 4.1, on peut iconifier la fenêtre en
cliquant sur l'iconifier, ou faire passer la fenêtre en arrière-plan en
cliquant sur la barre de titre. On peut aussi déplacer la fenêtre, mais
celle-ci ne pourra pas sortir de l'écran, même partiellement. Note: pendant
le jeu, le déplacement n'est effectué qu'entre deux pièces. Si la fenêtre
passe en arrière-plan, son contenu est effacé, et la chaîne "-- PAUSE --"
est affichée au centre: on dit que la fenêtre est en mode pause (il y a 2
sortes de mode pause: le mode pause de la fenêtre et le mode pause du jeu;
cf sous-section "Jeu").
5.1. Menu principal
¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Chaque item du menu principal peut être choisi soit en appuyant sur la
touche correspondante, soit en cliquant l'item (possible seulement en mode
fenêtre GEM). La liste des items est donnée ci-dessous. En plus du menu, le
nom du fichier de règle est affiché, ainsi que le nom du joueur s'il y en a
un.
_ Item "aide sur TETRHEX" (touche Help): ce fichier est affiché. Si
rien ne s'affiche, il faut modifier le fichier TETRHEX.LNG: ajouter
(ou modifier) la ligne HELP correspondant à la bonne langue; à
droite de "HELP:", écrire le nom de ce fichier (chemin relatif à
l'exécutable + nom du fichier).
_ Item "aide sur la règle" (touche Shift-Help): aide sur le fichier de
règle chargé. Si rien ne s'affiche, cela signifie qu'il n'y a pas
d'aide.
_ Item "charger une règle" (touche Undo): un sélecteur de fichiers
s'affiche pour permettre de choisir le nouveau fichier de règle. Cet
item ne peut être sélectionné que s'il n'y a pas eu de changement de
résolution.
_ Item "nom du joueur" (touche N): cet item permet au joueur d'entrer
son nom (cf sous-section "Nom du joueur"). Il n'est affiché que si
l'option -u est désactivée.
_ Item "jouer" (touche Return): cf sous-section "Jeu".
_ Item "meilleurs scores" (touches F1 à F20): affichage des meilleurs
scores. Un clic sur cet item équivant à l'appui sur la touche F1. Cf
sous-section "Affichage des meilleurs scores".
_ Item "arrière-plan" (touche Ctrl-Tab): met la fenêtre en arrière-
plan, ce qui équivaut à cliquer sur la barre de titre. Cet item
n'est affiché qu'en mode fenêtre GEM.
_ Item "quitter" (touche Ctrl-Q): cet item permet de quitter TETRHEX.
Il équivaut à un clic sur le closer.
Le fait d'appuyer sur Ctrl et une des 4 touches du haut du pavé numérique
("(", ")", "/" et "*") permet de changer la taille du tableau hexagonal: la
k-ième touche correspond à un côté ayant k+5 hexagones.
5.2. Aide
¯¯¯¯
Qu'il s'agisse de l'aide générale ou de l'aide sur la règle, les touches
utilisées sont: flèches vers le haut et vers le bas pour faire défiler le
texte d'une ligne; avec la touche Shift (gauche ou droite), le défilement se
fait page par page. Si on appuie sur la touche Ctrl, on multiplie par 4. La
touche Clr-Home permet de se positionner au début du texte; Shift-Clr-Home
permet de se positionner à la fin. Pour sortir de l'aide et revenir au menu
principal, appuyer sur Esc.
5.3. Nom du joueur
¯¯¯¯¯¯¯¯¯¯¯¯¯
Le nom du joueur est utilisé lors de la sauvegarde des scores. Il peut
être entré de 3 manières différentes: en tant qu'option lors du lancement de
TETRHEX, à partir du menu principal, ou à la fin d'une partie si le score
doit être sauvegardé. S'il n'y a qu'un seul joueur, les deux premières
manières sont les plus pratiques. S'il y a plusieurs joueurs, c'est la
troisième manière qui est la plus pratique. On ne considèrera ici que les
deux dernières manières.
Un rectangle s'affiche en haut à gauche, pour que vouz puissiez y entrer
votre nom. Vous ne pouvez entrer que des caractères affichables. Vous pouvez
effacer le dernier caractère à l'aide de la touche Backspace. Pour effacer
tous les caractères, appuyer sur Esc. Avec la flèche droite, vous pouvez
récupérer le dernier caractère effacé (ou éventuellement un ancien caractère
qui avait la même position). Avec la flèche vers le haut, vous pouvez
récupérer tous les caractères effacés. Pour valider, appuyer sur Return ou
Enter. Vous pouvez mettre fin à l'entrée et renvoyer un nom vide en appuyant
sur Ctrl-C.
Une fois l'entrée validée (par Return ou Enter) ou interrompue (par
Ctrl-C), le mini-buffer utilisé pour la récupération des caractères n'est
pas effacé, excepté le premier caractère, si bien qu'on peut récupérer le
dernier nom entré à la prochaine demande (après avoir entré le premier
caractère).
Si le nom est entré à partir du menu principal et si un nom vide est
renvoyé, alors il n'y aura pas de nom de joueur: si un score doit être
sauvegardé, le joueur devra entrer son nom à la fin de la partie.
Si le nom est entré en fin de partie, il est impossible de valider un nom
vide (par Return ou Enter). En revanche, le joueur peut interrompre l'entrée
à l'aide de Ctrl-C, et le score ne sera pas sauvegardé.
5.4. Jeu
¯¯¯
Les règles dépendent du fichier de règle; pour les connaître, il faut lire
l'aide correspondante (touche Shift-Help à partir du menu principal). Mais
toutes les règles ont des points communs, qui sont donnés ci-dessous.
Le jeu se déroule dans un tableau hexagonal dont un côté peut contenir 6 à
9 cases. Les cases sont hexagonales. Soit une case est vide, soit elle
contient un hexagone ayant appartenu à une pièce. Un hexagone peut avoir une
des 6 couleurs suivantes: rouge, vert, bleu, cyan, magenta, jaune. De plus,
il peut contenir un motif, dont la signification dépend du fichier de règle.
Une pièce peut contenir 1 à 4 hexagones; la forme des pièces, leur fréquence
d'apparition, etc... dépendent du fichier de règle. Les pièces apparaissent
en haut, au centre. La vitesse à laquelle elles descendent est aussi fixée
par le fichier de règle. Lorsqu'une pièce ne peut plus descendre, elle
s'enfonce dans le tableau, et un certain nombre d'hexagones peuvent être
détruits (éventuellement en plusieurs étapes). Quand hexagone est détruit,
ceux situés au-dessus descendent d'une case. Généralement, la partie se
termine lorsque la prochaine pièce n'a pas la place d'apparaître.
A droite du tableau sont affichés un certain nombre de nombres (8 au
maximum): score, niveau, etc... Leur définition (texte, nombre de chiffres,
position, etc...) dépend entièrement du fichier de règle.
La pièce suivante peut ou non être affichée (radar): ceci dépend aussi du
fichier de règle. La place réservée à son affichage se situe en haut au
centre.
En mode pause du jeu, la chaîne "-- PAUSE --" est affichée en haut à
gauche. Si le jeu se déroule dans une fenêtre GEM et si la fenêtre passe en
arrière-plan, alors on se retrouve en mode pause de la fenêtre. Lorsque la
fenêtre repasse en premier plan, on se retrouve en mode pause du jeu, si le
fichier de règle l'accepte (plus précisément, un signal PAUS est envoyé, cf
section "Fichiers de règle"); cela évite que le jeu reprenne immédiatement.
5.5. Affichage des meilleurs scores
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Les meilleurs scores peuvent être affichés par groupes de 10. Lorsqu'on
appuie sur Fn (1 ≤ n ≤ 20, F(n+10) = Shift-Fn), les scores du rang 10n-9 au
rang 10n sont affichés. Pour revenir au menu principal, appuyer sur Esc.
Note 1: les scores dépendent évidemment de la taille du tableau hexagonal.
Pour afficher les scores correspondant à une taille donnée, il faut d'abord
sélectionner cette taille à partir du menu principal (cf sous-section "Menu
principal").
Note 2: bien qu'ils puissent être sauvegardés, les scores du rang 201 au
rang 255 ne peuvent pas être affichés dans TETRHEX.
6. Fichiers de règle
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
L'une des plus intéressantes caractéristiques de TETRHEX est de pouvoir
créer ses propres règles (et modifier les règles existantes). TETRHEX permet
donc d'avoir un ensemble de jeux variés et des jeux semblables ayant des
niveaux de difficulté différents. Les règles se trouvent dans des fichiers
séparés (extension .RUL), appelés fichiers de règle. Cette section décrit ce
que contiennent ces fichiers, et leur structure exacte.
6.1. Données utilisées lors du jeu
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Cette section décrit brièvement les données intervenant dans le jeu, i.e.
les données que contient un fichier de règle et celles utilisées seulement
à l'exécution. Elle décrit aussi les différentes phases du jeu (qui seront
reprises dans les autres sous-sections), en se plaçant à un niveau assez
général.
Un fichier de règle contient dans son en-tête certaines données relatives
à la règle, mais qui n'affectent pas la façon dont se déroule le jeu en
question, comme le nom de la règle, les fontes utilisées pour la règle, les
couleurs, le nombre de scores. Le fichier de règle contient aussi une aide
(éventuellement dans plusieurs langues), et à la fin, la liste des meilleurs
scores pour chaque taille du tableau hexagonal.
Une règle peut être définie de manière à tourner pour une taille fixe du
tableau ou bien pour une taille variable de 6 à 9 hexagones de côté. Il vaut
mieux avoir une taille variable, mais on peut avoir besoin d'une taille fixe
si certaines tailles ne conviennent pas.
Les règles ont certains points communs, donnés dans la sous-section "Jeu"
de la section "Jeu TETRHEX", qui n'ont évidemment pas à être définis dans un
fichier de règle. Il reste donc à déterminer la forme de la pièce, les
motifs sur les hexagones, les nombres à afficher, les signaux (cf plus loin)
et le comportement pendant le jeu. Une des sections du fichier de règle
contient l'ensemble des formes possibles, chaque forme étant identifiée dans
la partie "comportement" par un numéro. Idem pour les motifs. La définition
des nombres contient le texte à afficher près du nombre, la position de ce
texte par rapport au nombre, la taille et la couleur du texte et du nombre,
le nombre de chiffres du nombre; la modification de ces nombres, qui est
directement liée au comportement, est décrite plus loin.
Le comportement est décrit à l'aide du langage RUL, spécifique à TETRHEX.
C'est un langage interprété travaillant sur des expressions en notation
préfixée; il existe cependant quelques commandes de contrôle (branchements).
Une expression représente toujours un entier signé sur 32 bits. 2 structures
de données supplémentaires sont utilisées: un tableau de 64 variables et une
pile d'entiers 32 bits dont la taille est donnée dans l'en-tête du fichier
de règle. Certaines des variables ont une signification spéciale (cf sous-
section "Variables spéciales"), les autres peuvent être utilisées librement
par le programmeur; à chaque nombre à afficher est associé une variable
spéciale. Au début du jeu, toutes les variables sont initialisées à 0, et la
pile est vide.
Dans un jeu, on joue à l'aide d'un périphérique d'entrée (clavier, souris,
joystick, ...), et suivant ce que l'on fait avec ce périphérique (action du
joueur), il se passe telle ou telle chose dans le jeu (action de jeu). Dans
la plupart des jeux, il n'y a pas vraiment de différence entre les 2 types
d'actions: parfois il n'y en a aucune; parfois, si l'on joue au clavier, on
peut choisir ses touches; on peut parfois aussi choisir entre le clavier, la
souris et le joystick... mais tout ceci reste assez limité.
Dans TETRHEX, on passe par une donnée intermédiaire appelée signal, ce qui
donne 2 conversions, dans lesquelles on peut intervenir. Les données en
provenance des périphériques surveillés sont d'abord converties en signaux
par TETRHEX ou par un fichier de messages. Puis le signal est converti en
action de jeu par le fichier de règle. L'utilisateur peut intervenir dans la
première conversion en donnant un fichier de messages; si la conversion est
effectuée par TETRHEX, alors seul le clavier est surveillé, et les touches
sont définies dans le fichier de règle. Le programmeur du fichier de règle
intervient dans la seconde conversion.
Un signal est identifié de manière interne (i.e. dans les programmes RUL)
par un octet non nul, i.e. par un entier allant de 1 à 255, et de manière
externe (i.e. dans les fichiers de messages) par un mot long (32 bits). Une
action est identifiée par un entier 32 bits signé.
Le jeu se déroule en plusieurs phases. Il y a au tout début du jeu (après
l'initialisation des variables à 0) une phase d'initialisation (phase 0);
cette phase est utilisée pour initialiser certaines données: variables (en
particulier, certains nombres à afficher), vitesse de descente des pièces,
etc... Avant l'apparition d'une nouvelle pièce ou lors de l'activation du
radar (s'il n'a pas été activé deux fois de suite), une phase permettant de
déterminer cette pièce (phase A) est appelée: on doit définir la pièce en
mettant des valeurs dans certaines variables spéciales (cf sous-section
"Variables spéciales"). Pendant la descente de la pièce ou pendant une
pause, la phase B est appelée pour convertir les signaux en actions.
Lorsqu'une pièce ne peut plus descendre, elle s'enfonce dans le tableau et
la phase C est appelée; cette phase effectue la destruction éventuelle
d'hexagones (en une ou plusieurs étapes), et met à jour certaines données
(score, niveau, ...). Note: les données peuvent aussi être mises à jour
en la phase A. Enfin, lorsque le joueur a perdu, une phase de terminaison
(phase S) est appelée: elle renvoie le score du joueur. Il existe 2 autres
phases, relatives au mode pause de la fenêtre; ces phases sont décrites dans
la sous-section "Modes pause".
Il est possible de brancher une variable au timer. Cette variable est
alors décrémentée chaque seconde (fréquence de 1 Hz).
6.2. Actions
¯¯¯¯¯¯¯
On a 2 types d'actions: les actions simples, i.e. qui ne font pas changer
de pièce, qui sont identifiées par des valeurs positives, et les actions qui
font passer directement en phase C ou en phase S (abandon), identifiées par
des valeurs négatives. Lorsqu'une action n'est pas possible, elle n'est pas
effectuée. La liste des actions reconnues par cette version de TETRHEX est
donnée ci-dessous. Certaines des actions qui font passer directement en
phase C mettent une donnée supplémentaire dans V[18] (indiquée dans la liste
ci-dessous). Note: dans les futures versions de TETRHEX, il se peut qu'il y
ait de nouvelles actions.
_ 0: aucune action.
_ 1: une case vers le bas.
_ 2: une case en bas à gauche (i.e. 8h).
_ 3: une case en bas à droite (i.e. 4h).
_ 4: rotation gauche ou directe (sens trigonométrique).
_ 5: rotation droite ou indirecte (sens des aiguilles d'une montre).
_ 6: une case vers la gauche, à la même hauteur.
_ 7: une case vers la droite, à la même hauteur.
_ 8: pause / fin de pause.
_ 9: activation / désactivation du radar.
_ 10: envoi d'un message (cf section "Messages", message $0206).
_ -1: abandon. Passage en phase S (pas de phase C).
_ -2: drop: la pièce tombe. Le nombre de DOWN effectués est mis dans
V[18], ce qui correspond au nombre de cases descendues + 1, car le
dernier DOWN est utilisé pour l'arrêt de la pièce.
_ -3: explosion: tous les hexagones qui sont sur le tableau hexagonal
sont détruits. Le nombre d'hexagones détruits (y compris ceux de la
pièce courante) est mis dans V[18].
_ -4: destruction de la pièce courante.
Note: lorsque la pièce se trouve en haut du tableau, les actions 6 et 7 se
comportent comme les actions 2 et 3.
6.3. Signaux
¯¯¯¯¯¯¯
Les signaux sont entièrement définis dans le fichier de règle. Cependant
il y a des signaux standards, qu'il vaut mieux respecter, car ils peuvent
intervenir dans les fichiers de messages. Le fichier de règle donne en même
temps la correspondance identificateurs internes / identificateurs externes
et les touches par défaut, une touche étant identifiée par sa position sur
le clavier (scancode) et l'état des touches spéciales.
La liste des signaux standards, définis par les identificateurs externes,
mais classés suivant les identificateurs internes, est donnée ci-dessous. Il
est conseillé de prendre les mêmes identificateurs internes, même si cela
n'a pas d'importance pour le moment. Sont aussi données les touches choisies
dans les fichiers de règle fournis avec TETRHEX (il est conseillé de prendre
les mêmes), ainsi que les actions à réaliser. Il est important de réaliser
les mêmes actions. Note: ici, le terme "action" est différent de celui
considéré dans la section précédente; cependant il y a une correspondance
directe pour la plupart des actions.
$01 : DOWN : Q.............. une case vers le bas (action 1).
$02 : LFDN : Insert......... une case en bas à gauche (action 2).
$03 : RGDN : Clr-Home....... une case en bas à droite (action 3).
$04 : ROTL : Flèche bas..... rotation gauche (action 4).
$05 : ROTR : Flèche haut.... rotation droite (action 5).
$06 : LEFT : <--............ une case vers la gauche (action 6).
$07 : RGHT : -->............ une case vers la droite (action 7).
$08 : DROP : Barre espace... drop (action -2).
$09 : STOP : Ctrl-Esc....... abandon (action -1).
$0A : PAUS : Undo........... passage en mode pause (action 8).
$0B : CONT : Return......... retour du mode pause (action 8).
$0C : NEXT : + (pavé num.).. niveau suivant (code + action 0).
$0D : PREV : - (pavé num.).. niveau précédent (code + action 0).
$0E : RDAR : Help........... activation / désactivation radar (action 9).
Note: suivant la règle, on peut associer à certains signaux standards une
action 0 uniquement. Par exemple, on peut avoir envie d'interdir le passage
à un niveau précédent, ou au mode pause...
6.4. Phases du jeu
¯¯¯¯¯¯¯¯¯¯¯¯¯
Le jeu comporte 7 phases, chaque phase correspondant à un sous-programme
écrit en RUL:
_ Phase 0: phase d'initialisation, appelée au tout début du jeu.
_ Phase A: détermination de la prochaine pièce, en mettant des valeurs
dans certaines des variables V[0] à V[8] (cf sous-section "Variables
spéciales"). Cette phase peut être appelée alors qu'il y a déjà une
pièce en mouvement sur le tableau, en cas d'activation du radar; les
variables V[0] à V[8] sont alors sauvées par TETRHEX avant l'appel,
et récupérées après l'appel (car elles peuvent resservir): le
programmeur du fichier de règle n'a pas à s'en préoccuper.
_ Phase B: conversion des signaux en actions. L'identificateur interne
du signal se trouve dans V[9]. Le sous-programme doit renvoyer
l'identificateur de l'action. Note: on peut connaître les données
sur la pièce courante à l'aide de la commande $7C (cf sous-section
"Langage RUL").
_ Phase C: dans cette phase, certains hexagones peuvent être détruits;
le score est généralement mis à jour. V[9] contient l'identificateur
de la dernière action: utile si certaines actions (parmi les
négatives) rapportent des points... V[18] peut contenir une donnée
supplémentaire (cf sous-section "Actions").
_ Phase P (Pause): début du mode pause de la fenêtre (cf sous-section
"Modes pause").
_ Phase Q (Quit pause): fin du mode pause de la fenêtre (cf sous-
section "Modes pause").
_ Phase S (Score): phase de terminaison. Le score final doit être
renvoyé.
6.5. Variables spéciales
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
V[0] contient le numéro de la forme courante (de 1 à 255). Soit h le
nombre d'hexagones de cette forme. Pour 1 ≤ k ≤ h, V[k] contient la couleur
du k-ième hexagone (cf sous-section "Code des couleurs"), et V[k+4] contient
le numéro du motif du k-ième hexagone (de 1 à 255). Pour h < k ≤ 4, V[k]
et V[k+4] peuvent être utilisées librement, mais peuvent être altérées
en phase A par TETRHEX. Les variables définissant la pièce doivent être
assignées lors de la phase A, et ne doivent pas être modifiées lors des
phases B, C, P et Q.
V[9] contient l'identificateur interne du signal (de 1 à 255) lors de la
phase B, et l'identificateur de l'action lors de la phase C. Cette variable
peut être modifiée par les routines RUL.
Soit n le nombre de nombres affichés à droite du tableau. Pour 1 ≤ k ≤ n,
V[k+9] contient la k-ième valeur affichée. Si la valeur de la variable est
négative, alors 0 est affiché; si elle est supérieure à M(k) = 10^d(k) - 1,
où d(k) est le nombre maximal de chiffres à afficher du k-ième nombre, alors
M(k) est affiché. Pour n < k ≤ 8, V[k] peut être utilisée librement.
V[18] peut contenir une donnée supplémentaire en phase C. Pour k > 18,
V[k] peut être utilisée librement.
6.6. Code des couleurs
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Les hexagones formant les pièces peuvent être de 6 couleurs différentes,
codées de 1 à 6:
_ 1 (001): bleu.
_ 2 (010): vert.
_ 3 (011): cyan = vert + bleu.
_ 4 (100): rouge.
_ 5 (101): magenta = rouge + bleu.
_ 6 (110): jaune = rouge + vert.
6.7. Modes pause
¯¯¯¯¯¯¯¯¯¯¯
On distingue 2 types de pauses: le mode pause du jeu et le mode pause de
la fenêtre.
Mode pause du jeu: on passe dans ce mode pause lorsque l'action +8 est
déclenchée (normalement lorsqu'un signal PAUS est envoyé). On sort de ce
mode pause en redéclenchant l'action +8. Les autres actions peuvent être
déclenchées en mode pause du jeu, mais à part l'action +8 (fin de pause) et
l'action -1 (abandon), elles n'ont aucun effet. Attention! même en mode
pause du jeu, on peut recevoir n'importe quel signal; c'est au programmeur
de tester s'il est en mode pause ou non avant de faire certaines opérations,
comme une modification de variable.
Mode pause de la fenêtre: on passe dans ce mode pause lorsque la fenêtre
passe en arrière-plan (en mode fenêtre GEM). Contrairement au mode pause du
jeu, il s'agit ici d'un mode pause forcé: on ne peut pas l'empêcher. A ce
moment, la phase P est appelée; dans cette phase, l'éventuelle variable
branchée au timer peut être débranchée (non obligatoire). Puis le jeu est
complètement arrêté (on ne reçoit plus aucun signal), mais le timer est
toujours actif. Lorsque la fenêtre repasse au premier plan, on sort de ce
mode pause, sauf cas particulier (pas assez de mémoire par exemple); en cas
de problème, un message d'alerte est affiché. La phase Q est alors appelée;
si une variable avait été débranchée du timer, elle peut être rebranchée.
Puis le signal PAUS est envoyé s'il existe, de manière à ce que le jeu ne
reprenne pas immédiatement. Attention! on peut passer en mode pause de la
fenêtre à n'importe quel moment.
6.8. Structure d'un fichier de règle
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Note: l'ordre de définition des motifs, des formes, des signaux et des
nombres est important, le numéro associé à la donnée considérée est attribué
automatiquement par la position dans la liste.
_ Header. Les adresses sont définies par rapport au début du fichier.
Les couleurs sont au format (0, R, V, B): le premier octet est nul,
et les 3 octets suivants contiennent respectivement les valeurs des
3 composantes rouge, verte et bleue entre 0 et 255.
. 1 mot long: $52554C33 ("RUL3"). Ce mot long indique qu'il s'agit
d'un fichier de règle, version 3.
. 1 mot long: couleur de "-- PAUSE --", en mode pause du jeu.
. 1 mot long: couleur de "game over".
. 1 mot long: couleur de "Votre nom:" et du nom (lorsque le joueur
doit entrer son nom).
. 1 mot long: couleur du nom de la règle.
. 1 mot: hauteur par défaut du nom de la règle.
. 24 octets: nom de la règle, terminé par un octet nul.
. 1 mot: numéro de la fonte vectorielle utilisée pour afficher le
nom de la règle, ou 0 si la fonte est fixée par l'utilisateur
(i.e. déterminée par l'option -fn).
. 1 mot: numéro de la fonte vectorielle utilisée pour afficher les
noms des nombres affichés pendant le jeu, ou 0 si la fonte est
fixée par l'utilisateur (i.e. déterminée par l'option -fg).
. 1 octet: nombre de motifs (de 1 à 255).
. 1 octet: nombre de formes (de 1 à 255).
. 1 octet: nombre total de signaux (de 1 à 255).
. 1 octet: nombre n de cases dans un côté du tableau hexagonal (de
6 à 9), ou 0 s'il est variable.
. 1 octet: nombre de scores (de 0 à 255) pour n = 6.
. 1 octet: nombre de scores (de 0 à 255) pour n = 7.
. 1 octet: nombre de scores (de 0 à 255) pour n = 8.
. 1 octet: nombre de scores (de 0 à 255) pour n = 9.
. 1 octet: nombre maximal de scores (de 0 à 255) pour n = 6.
. 1 octet: nombre maximal de scores (de 0 à 255) pour n = 7.
. 1 octet: nombre maximal de scores (de 0 à 255) pour n = 8.
. 1 octet: nombre maximal de scores (de 0 à 255) pour n = 9.
. 1 mot long: taille de la pile.
. 1 mot long: adresse de la définition des signaux.
. 1 mot long: adresse de la définition des nombres à afficher.
. 1 mot long: adresse de la phase 0 de la règle.
. 1 mot long: adresse de la phase A de la règle.
. 1 mot long: adresse de la phase B de la règle.
. 1 mot long: adresse de la phase C de la règle.
. 1 mot long: adresse de la phase P de la règle.
. 1 mot long: adresse de la phase Q de la règle.
. 1 mot long: adresse de la phase S de la règle.
. 1 mot long: adresse du texte d'aide. Nul s'il n'y a pas de texte
d'aide.
. 1 mot long: adresse des meilleurs scores (pointe vers la fin du
fichier s'il n'y a pas de score).
_ Définition des motifs. Chaque hexagone est formé de 288 pixels
d'intensité de 0 à 7 (0: noir, 4: couleur du fond, 7: intensité la
plus forte). A chaque motif est associé un tableau de 288 nombres de
3 bits, qui occupe 108 octets. Les motifs sont stockés les uns après
les autres.
_ Définition des formes. Cette définition est indépendante de celle
des motifs. Les pièces doivent être connexes. Une configuration de
la forme est définie par rapport à un hexagone de référence (qui
n'appartient pas forcément à la pièce), dont la position sera
donnée de manière aboslue dans le jeu. Une telle configuration est
identifiée par un tableau de 4 octets (mot long), tel que le k-ième
octet représente la position du k-ième hexagone par rapport à
l'hexagone de référence; si la forme a moins de 4 hexagones, les
autres octets doivent être nuls. L'octet identifiant la position
d'un hexagone par rapport à l'hexagone de référence est défini de la
manière suivante: il est nul si c'est l'hexagone de référence; sa
valeur est entre 1 et 6 s'il est adjacent à l'hexagone de référence:
1 s'il est en-dessous, puis on tourne dans le sens contraire des
aiguilles d'une montre; sa valeur est entre 7 et 18 s'il est à une
distance 2 de l'hexagone de référence: 7 s'il est en-dessous, puis
on tourne dans le sens contraire des aiguilles d'une montre.
. Pour chaque forme:
. 1 octet: nombre n d'hexagones (de 1 à 4).
. 1 octet: 0 si la forme ne peut pas tourner, négatif si la
forme tourne autour de l'hexagone de référence, strictement
positif si la forme tourne d'une autre façon. Dans le dernier
cas, cet octet contient le nombre de positions différentes,
compris entre 1 et 6 (note: normalement différent de 1).
. 1 mot: offset sur la liste des positions de cette forme si
l'octet précédent est strictement positif; sinon, mot nul.
. 4 octets: position initiale des hexagones.
. Listes éventuelles des positions (cf ci-dessus), dans n'importe
quel ordre, une liste de positions étant un tableau de tableaux
de 4 octets.
_ Définition des signaux (y compris les signaux standards). Pour
chaque signal, on a:
. 1 mot long: identificateur externe du signal, qui correspond
généralement à 4 lettres. Dans tous les cas, ce mot long doit
être strictement positif.
. 1 mot: scancode de la touche par défaut correspondant au signal
(l'octet de poids fort contient l'état des touches spéciales).
. 1 mot nul (réservé).
_ Définition des nombres à afficher. Les couleurs sont au format
(0, R, V, B). Pour chaque nombre, sont affichés du texte ("Score",
"Niveau", etc...) et la valeur. Si la valeur est négative, 0 est
affiché. Il y a un nombre minimal de chiffres affichés; des "0" non
significatifs sont éventuellement affichés. Il y a aussi un nombre
maximal de chiffres affichés; si la valeur est trop grande, alors la
valeur affichée est la plus grande valeur affichable (chiffres "9").
Note: les nombres sont affichés verticalement, dans l'ordre dans
lequel ils ont été définis.
. 1 mot: nombre n (entre 0 et 8) de nombres à afficher.
. Tableau de n mots: adresses relatives au début du tableau des
définitions des nombres à afficher.
. Pour chaque nombre:
. 1 octet: nombre maximal de chiffres du nombre (de 1 à 8).
. 1 octet: nombre minimal de chiffres à afficher (de 1 à 8).
. 1 octet: hauteur du texte en pixels (de 16 à 127).
. 1 octet: hauteur du nombre en pixels (de 16 à 127).
. 1 mot long: couleur du texte.
. 1 mot long: couleur des "0" non significatifs.
. 1 mot long: couleur des chiffres significatifs.
. 1 octet: position du texte par rapport au nombre: 0 si le
texte doit être affiché au-dessus, 1 s'il doit être affiché à
gauche, -1 s'il doit être affiché à droite.
. Pour chaque langue (il doit y en avoir au moins une):
. 1 octet: nombre n (de 1 à 127) de caractères du texte.
. 1 octet: code de la langue.
. n octets: texte.
. 1 octet nul, indiquant qu'il n'y a plus de langue.
_ Règle: sous-programmes en RUL. Les 7 phases peuvent s'entrelacer. Cf
sous-section "Langage RUL".
_ Texte d'aide (facultatif).
. Pour chaque langue:
. 1 mot long: offset sur la prochaine langue (ou sur le mot long
nul indiquant la fin de cette partie).
. 1 octet: code de la langue.
. 1 octet: caractère de soulignement (0 si pas de caractère de
soulignement). Cf ci-dessous.
. 1 octet (réservé). Sa valeur n'est pas prise en compte dans
cette version; mais pour la compatibilité du fichier de règle
avec une version ultérieure de TETRHEX, la valeur doit être
nulle. Une valeur non nulle pourra indiquer l'existence de
données supplémentaires.
. Texte dans la langue donnée ci-dessus, terminé par un octet
nul. Les caractères doivent avoir un code ASCII ≥ 32, sauf les
fins de ligne (CR/LF). Le texte pourra être envoyé directement
sur la sortie standard; il doit donc déjà être formaté. Il
pourra aussi être affiché dans la fenêtre de TETRHEX (item
"aide sur TETRHEX" dans le menu principal); dans ce cas, on
cherchera la largeur du texte (i.e. largeur maximale d'une
ligne du texte), et les lignes ayant cette largeur seront
justifiées. La largeur conseillée est de 76 caractères. A
cause de cette justification, les lignes ne sont pas affichées
telles quelles: il existe 2 caractères qui ont un comportement
spécial: l'espace et le caractère de soulignement (défini
avant le texte). Une séquence d'espaces située en début de
ligne provoque un déplacement du début de ligne (indentation),
tel que la proportion du nombre d'espaces par rapport à la
largeur du texte est égale à celle du déplacement par rapport
à la largeur de la partie de la fenêtre réservée au texte;
idem pour une séquence d'espaces située en fin de ligne
justifiée. Une séquence d'espaces située à l'intérieur d'une
ligne est remplacée par un seul espace. Les lignes uniquement
formées d'espaces et de caractères de soulignement, appelées
lignes de soulignement, ne sont pas affichées: elles sont
prises en compte lors de l'affichage de la ligne précédente;
une séquence de caractères de soulignement appartenant à une
ligne de soulignement a pour effet de souligner la séquence de
caractères située juste au-dessus exceptés les espaces situés
aux extrémités de cette séquence. Si la ligne ne se termine
pas par un caractère de soulignement, alors elle est aussi
considérée comme une ligne vide (c'est le cas des lignes de
soulignement se terminant par un espace, des lignes ne
contenant que des espaces et des lignes réellement vides).
N.B.: chaque ligne doit se terminer par un CR/LF, y compris la
dernière. Il ne faut jamais avoir plusieurs vraies lignes de
soulignement successives ("vraies" signifie que la ligne
contient au moins un caractère de soulignement), sinon il y a
risque de plantage.
. Mot long nul.
_ Tableau des meilleurs scores (éventuellement vide). On a d'abord les
scores pour 6 hexagones, puis pour 7, 8 et 9 hexagones. Chaque score
occupe 32 octets:
. 24 octets: nom du joueur + octet nul.
. 1 mot long: score (en hexadécimal).
. 1 mot long: date et heure au format XBIOS.
6.9. Langage RUL
¯¯¯¯¯¯¯¯¯¯¯
RUL est un langage de codes sur 8 bits formant des expressions en notation
préfixée. Une expression représente toujours un entier signé sur 32 bits. Il
y a aussi des instructions de contrôle (branchements) transparentes, i.e.
elles ont pour seul effet de modifier le compteur de programme: d'une part
elles ne modifient pas le résultat de la dernière expression (au cas où il y
aurait un retour de fonction, cf plus loin), d'autre part elles ne forment
pas d'expression, i.e. elles ne modifient pas la pile d'expressions.
Les expressions sont évaluées dès leur lecture. Par conséquent, lorsqu'une
opération a plusieurs opérandes, les premières opérandes sont évaluées avant
les dernières opérandes. La première expression est notée "x", la deuxième
est notée "y", et la troisième est notée "z", sauf indication contraire
(caractère entre chevrons).
Certaines expressions renvoient un booléen, codé par entier sur 32 bits de
la façon suivante: "faux" est codé par 0, et "vrai" est codé par -1. Ce
codage a été choisi de façon à ce que les instructions logiques (i.e. bit à
bit) AND, OR et NOT soient équivalentes aux instructions booléennes.
Chaque case du tableau hexagonal est identifiée par un entier non nul sur
32 bits. L'entier 0 identifie les cases inexistantes. Il ne faut jamais
utiliser d'autres entiers dans les commandes ayant comme argument un
identificateur de case. Il y a un autre moyen d'identifier les cases: par
couple (colonne, hauteur). Si n est le nombre de cases dans un côté du
tableau, les colonnes sont numérotées de -(n-1) à (n-1); la hauteur est le
nombre de cases situées au-dessous (dans la même colonne). A chaque case du
tableau est associé un tableau de 8 bits appelés marques, initialisés à 0 au
début du jeu; lorsque le bit b est à 1, on dit que la case a la marque b.
Les offsets (pour les branchements) sont sur 16 bits, sauf pour le
branchement conditionnel sur 8 bits. L'adresse de branchement est relative à
celle de l'offset.
Attention! lorsqu'une commande dont les opérandes ont des valeurs qui ne
conviennent pas est effectuée (comme une division par 0), le résultat est
indéterminé ou il y a un plantage. Lorsque cela a un sens, les opérations se
font modulo 2^32 (par exemple l'addition).
La signification des codes est la suivante:
_ $80 à $FF: constante x - $C0 (de -64 à 63).
_ $00 à $3F: variable V[x].
_ $40 <expr> <expr>: addition x + y.
_ $41 <expr> <expr>: soustraction x - y.
_ $42 <expr> <expr>: multiplication x * y.
_ $43 <expr> <expr>: division entière x / y. Le quotient est défini de
la manière suivante: c'est le quotient réel approché par défaut en
valeur absolue.
_ $44 <expr> <expr>: décalage à gauche x << y. Le nombre de décalages
doit être compris entre 0 et 63.
_ $45 <expr> <expr>: décalage à droite x >> y. Le nombre de décalages
doit être compris entre 0 et 63.
_ $46 <expr> <octet>: branchement relatif sur 8 bits si le résultat de
l'expression est non nul (instruction transparente).
_ $47 <expr> <expr>: modulo. On doit avoir y > 0. La valeur renvoyée
est l'entier congru à x modulo y, compris entre 0 et y-1. Attention!
ce modulo est différent du modulo (%) du C pour x < 0.
_ $48 <mot>: constante signée sur 16 bits.
_ $49 <mot long>: constante sur 32 bits.
_ $4A <expr> <expr>: x == y.
_ $4B <expr> <expr>: x != y.
_ $4C <expr> <expr>: x < y.
_ $4D <expr> <expr>: x > y.
_ $4E <expr> <expr>: x <= y.
_ $4F <expr> <expr>: x >= y.
_ $50 <offset>: appel à une fonction, i.e. branchement à un sous-
programme qui renvoie une valeur.
_ $51: retour de fonction. La valeur de la fonction est celle de la
dernière expression.
_ $52 <offset>: branchement relatif (instruction transparente).
_ $53 <expr> <offset>: branchement si le résultat de l'expression est
non nul (instruction transparente).
_ $54 <expr>: NOT logique.
_ $55 <expr> <expr>: AND logique.
_ $56 <expr> <expr>: OR logique.
_ $57 <expr> <expr>: XOR logique.
_ $58: random signé sur 16 bits.
_ $59: random signé sur 32 bits.
_ $5A <expr>: V[x] (x doit être compris entre 0 et 63).
_ $5B <expr> <expr>: affectation. La variable concernée et l'opération
à effectuer sont données par la valeur de la première expression: si
0 ≤ x ≤ 63, il s'agit de V[x] = y; si -64 ≤ x ≤ -1, il s'agit de
V[x+64] += y; si 64 ≤ x ≤ 127, il s'agit de V[x-64] -= y. La valeur
renvoyée est la nouvelle valeur de la variable.
_ $5C <expr>: données concernant la pièce suivante. Si le radar est
désactivé, 0 est toujours renvoyé. Dans le cas contraire, si
0 ≤ x ≤ 8, la valeur renvoyée est celle de la variable V[x] après le
dernier appel de la phase A, i.e. V[x] à l'apparition de la pièce
suivante, et si x < 0 ou x > 8, la valeur renvoyée est -1. Une
opérande comme -1 permet donc de tester si le radar est activé.
_ $5D: vrai ssi on est en mode pause du jeu.
_ $5E <expr>: si x ≥ 0, la variable V[x] est branchée au timer si
elle ne l'est pas encore (la variable sera décrémentée chaque
seconde); si une autre variable était branchée au timer, elle est
automatiquement débranchée. Si x < 0, la variable branchée au timer
(s'il y en a une) est débranchée. La valeur renvoyée est x.
_ $5F <expr>: temps approximatif entre deux descentes successives
d'une pièce, en millisecondes, compris entre 1 et 8191. La valeur
renvoyée est x.
_ $60 <expr> <octet n> <mot>^n: valeur d'un élément d'un tableau de
constantes sur 16 bits. Cette instruction évalue l'expression, lit
l'octet n, prend la valeur de l'expression modulo n, et renvoie
l'élément correspondant du tableau étendu sur 32 bits, les indices
allant de 0 à n-1.
_ $61 <expr> <octet n> <mot long>^n: idem, mais avec un tableau de
constantes sur 32 bits.
_ $62 <expr> <octet n> <offset>^n: sorte de CASE; branchement relatif
suivant la valeur de l'expression.
_ $63 <expr>: empiler la valeur de l'expression, qui est renvoyée.
_ $64: valeur du sommet de la pile (on ne dépile pas).
_ $65: dépiler une valeur, qui est renvoyée.
_ $66 <expr>: valeur absolue.
_ $67 <expr>: carré. L'argument doit tenir sur un mot.
_ $68: random sur 15 bits (entier positif ou nul).
_ $69: random sur 31 bits (entier positif ou nul).
_ $6A <expr> <expr>: min(x,y).
_ $6B <expr> <expr>: max(x,y).
_ $6C <expr> <expr> <expr>: double comparaison. Si y ≤ x ≤ z, alors 0
est renvoyé; si x < y ≤ z, alors -1 est renvoyé; si y ≤ z < x, alors
1 est renvoyé. Si y > z, le résultat est indéterminé.
_ $6D: envoi d'un message (cf section "Messages", message $0207). Si
on veut transmettre des données, il faut le faire par la pile, et il
ne faudra pas oublier de dépiler ces données. Le résultat de cette
instruction est la valeur renvoyée par le fichier de messages.
_ $6E <x> <m>: destruction des hexagones situés dans les cases ayant
la marque m. Si m < 0, tous les hexagones sont détruits. On doit
toujours avoir m ≤ 7. Note: la première expression ne sert à rien,
excepté à avoir le même format que la commande $6F.
_ $6F <x> <m>: destruction avec bouclage des hexagones situés dans les
cases ayant la marque m, où 0 ≤ m ≤ 7, i.e. si au moins un hexagone
est détruit, alors cette instruction est réévaluée. Le résultat de
la première expression est ignoré, mais cette expression sert à
positionner les marques m.
_ $70: nombre de cases dans un côté du tableau hexagonal (de 6 à 9).
_ $71 <c> <h>: identificateur de la case de colonne c et de hauteur h.
Si la case n'est pas sur le tableau (case inexistante), alors 0 est
renvoyé.
_ $72 <x>: hauteur de la case x (indéterminée si x = 0).
_ $73 <x>: colonne de la case x (indéterminée si x = 0).
Note: les 4 commandes suivantes permettent de faire des opérations
sur des ensembles de cases (la récursivité est permise, ce qui est
utile par exemple pour rechercher des composantes connexes ou pour
autre type de parcours). Ces opérations renvoient toujours la valeur
de l'expression évaluée pour le dernier élément, qui est toujours la
case inexistante (0). Pour chaque case de l'ensemble (y compris la
case inexistante), la case courante est stockée dans V[n], et
l'expression e est évaluée. Pour chaque cas ci-dessous, l'ensemble
est donné privé de la case inexistante.
_ $74 <n> <x> <e>: ensemble = toutes les cases adjacentes à la case x
et contenant un hexagone.
_ $75 <n> <x> <e>: ensemble = toutes les cases existantes adjacentes à
la case x.
_ $76 <n> <e>: ensemble = toutes les cases contenant un hexagone.
_ $77 <n> <e>: ensemble = toutes les cases existantes.
_ $78 <x> <m>: booléen indiquant si la case x a la marque m (m doit
être compris entre 0 et 7).
_ $79 <x> <m>: si 0 ≤ m ≤ 15, la marque (m modulo 8) de la case x est
inversée; si m < 0, toutes les marques de la case x sont inversées.
Si m ≤ 7, la valeur x est renvoyée; si 8 ≤ m ≤ 15, un booléen
indiquant l'état de la marque m - 8 est renvoyé.
_ $7A <x> <m>: idem, sauf que la marque est enlevée (bit mis à 0).
_ $7B <x> <m>: idem, sauf que la marque est mise (bit mis à 1).
_ $7C <n>: si n < 0, nombre d'hexagones (de 1 à 4) dans la dernière
pièce (ou pièce courante); si n = 0, identificateur de la case
contenant l'hexagone de référence de la dernière pièce (ou pièce
courante); si n > 0, identificateur de la case contenant le n-ième
hexagone de la dernière pièce (ou pièce courante); attention! n ne
doit pas être supérieur au nombre d'hexagones de la pièce.
_ $7D <x>: numéro du motif de l'hexagone situé dans la case x s'il y
en a un, 0 si cette case est vide, -1 si elle est inexistante (0).
Le test "> 0" permet de savoir s'il y a un hexagone dans la case, le
test "!= 0" permet de savoir si la case existe et est vide.
_ $7E <x>: idem pour la couleur de l'hexagone.
_ $7F <x> <d>: identificateur d'une case voisine de la case x si x
existe, case inexistante si x est la case inexistante; d indique la
direction. On prend la valeur de d modulo 6 (car il y a 6 directions
possibles). $7F <x> 0: case voisine située au-dessous, $7F <x> 1: en
bas à droite, $7F <x> 2: en haut à droite, $7F <x> 3: au-dessus,
$7F <x> 4: en haut à gauche, $7F <x> 5: en bas à gauche.
7. Messages
¯¯¯¯¯¯¯¯
N.B.: cette section n'est utile qu'à ceux qui ont une version enregistrée,
car dans la version non enregistrée on ne peut pas envoyer de messages.
Le système de messages permet à TETRHEX de communiquer avec des routines
externes, qui elles-mêmes peuvent communiquer avec d'autres processus. A
l'origine, les messages étaient faits pour envoyer et recevoir des messages
AES; mais on peut faire beaucoup plus.
Des routines externes, regroupées dans des fichiers appelés "fichiers de
messages", sont données à TETRHEX au lancement. Un fichier de messages est
formé d'une routine composée de sous-routines. On peut donner à TETRHEX
plusieurs fichiers de messages; ceux-ci forment alors une chaîne, le dernier
fichier chargé (i.e. dernier fichier dans la chaîne d'options) étant le plus
prioritaire (cf ci-dessous). A certains moments, TETRHEX envoie un message
(type + données), ce qui correspond à un appel de routine, une sous-routine
est choisie en fonction du type du message, et un résultat est renvoyé; le
protocole d'envoi/transmission de messages est décrit ci-dessous. Comme il
faut qu'il y ait au moins une routine, notamment si l'utilisateur ne donne
aucun fichier de messages, TETRHEX contient un fichier de messages interne
appelé fichier terminal, qui est toujours le moins prioritaire.
Protocole d'envoi/transmission de messages (en assembleur 680x0): TETRHEX
ou une routine d'un fichier de messages peut envoyer un message de la façon
suivante: D0.W doit contenir le type du message, et A0 un pointeur sur une
structure, formée d'un mot long qui est l'adresse de la routine du fichier
de messages le plus prioritaire (adresse du fichier + 4) et d'autres données
éventuelles dépendant du type du message. Au retour, D0.L contient un
résultat, dont la signification dépend du type de message envoyé; les autres
registres ne sont pas modifiés. Lorsqu'une routine d'un fichier de messages
reçoit un message, il doit traîter le message s'il le peut (suivant le type
du message), sinon il doit le transmettre au fichier de messages suivant;
même si le message a été traîté, il peut parfois être transmis au fichier de
messages suivant (tout dépend du traitement). N.B.: la routine de traitement
ne doit pas modifier les registres D1 à D7 et A0 à A7; donc, penser à sauver
au début les registres qui pourront être modifiés, et à les récupérer à la
fin. La transmission s'effectue de la manière suivante: D0.W, A0 et (A0).L
doivent avoir les valeurs données lors de l'appel; l'adresse de la routine
du fichier suivant se trouve à l'adresse du fichier courant, i.e. à
l'adresse de la routine courante - 4; connaissant l'adresse de la routine à
appeler, on fait soit un branchement, soit un appel de sous-programme (pour
pouvoir modifier le résultat). Le fichier terminal renvoie toujours 0 comme
résultat, et ne fait rien d'autre; il est donc préférable que le traitement
d'un message renvoie 0 si et seulement si rien n'a été effectué.
Types de messages actuellement définis:
_ $0000: non spécifié (dépend du fichier de messages).
_ $0001: initialisation. Ce message est envoyé juste après appl_init.
4(A0).W contient l'identificateur de l'application TETRHEX (utilisé
pour envoyer des messages AES à TETRHEX). 6(A0).B: flag d'affichage
des messages d'erreur (0 si l'option "-e" est inactive, -1 si elle
est active); le fichier de messages ne peut envoyer des caractères
sur la sortie standard que si ce flag est actif. Si l'initialisation
se déroule sans erreur, ce message doit obligatoirement être
transmis au fichier de messages suivant (une valeur nulle sera
renvoyée par le fichier terminal). Sinon, l'initialisation doit être
interrompue et une valeur non nulle doit être renvoyée; TETRHEX se
termine et renvoie le mot de poids faible comme code de retour.
_ $0002: fin du programme. Message envoyé juste avant appl_exit. Il
doit toujours être transmis au fichier de messages suivant.
_ $0003: début de la présentation. Ce message n'est jamais envoyé s'il
n'y a pas de présentation, i.e. en mode fenêtre GEM.
_ $0004: affichage du menu; l'image de fond n'est pas encore affichée.
Si un nombre non nul est renvoyé, l'image de fond est immédiatement
libérée, ce qui permet de la changer (cf message $0006).
_ $0005: menu affiché (attente d'un évènement).
_ $0006: demande de calcul de l'image de fond. Si le résultat est nul,
l'image doit être calculée par TETRHEX. Dans le cas contraire, elle
est calculée par le fichier de messages et le résultat est l'adresse
de l'image. L'image, sur laquelle sera ensuite affiché (par TETRHEX)
le tableau hexagonal, est formée de 7 plans 624 * 416 non entrelacés
(format VDI), les valeurs des pixels étant comprises entre 0 et 95,
i.e. les deux bits de poids fort ne sont pas simultanément à 1. La
palette (96 mots longs) se trouve juste après l'image. N.B.: le bloc
de mémoire contenant la nouvelle image de fond doit être réservé par
la routine du fichier de messages, mais il ne pourra être libéré que
par TETRHEX, soit automatiquement (s'il ne reste plus beaucoup de
mémoire), soit à la demande de l'utilisateur (Ctrl-F ou clic droit),
soit avec un message (cf message $0004).
_ $0007: nouveau fichier de règle chargé. 4(A0).L contient l'adresse
du fichier de règle. Ce message est envoyé par TETRHEX juste après
le chargement d'un fichier de règle, y compris après le chargement
du premier fichier; dans ce cas, il est envoyé entre $0001/$0003 et
$0004.
_ $0008: aide sur TETRHEX. Ce message n'est envoyé que si l'aide
existe bien.
_ $0009: aide sur le fichier de règle. Ce message n'est envoyé que si
l'aide existe bien.
_ $000A: entrée du nom du joueur.
_ $000B: début du jeu. Message envoyé avant l'évaluation de la phase 0
de la règle.
_ $000C: affichage des meilleurs scores.
_ $0100: passage en mode pause de la fenêtre. Message envoyé après
l'évaluation éventuelle de la phase P de la règle.
_ $0101: fin du mode pause de la fenêtre. Message envoyé avant
l'évaluation éventuelle de la phase Q de la règle.
_ $0200: non spécifié (dépend du fichier de messages). Message ayant
un rapport avec le jeu.
_ $0201: début du jeu. 4(A0).L: pointeur de pile du jeu. 8(A0).L:
pointeur sur les variables du jeu. 12(A0).L: pointeur sur le fichier
de règle. Message envoyé après l'évaluation de la phase 0 de la
règle.
_ $0202: fin du jeu (game over). 4(A0).L: score. Message envoyé après
l'évaluation de la phase S de la règle et avant la libération de la
mémoire réservée pour le jeu (variables, pile, ...).
_ $0203: prochaine pièce. Les données concernant cette pièce ne sont
pas stockées dans la structure (A0), car elles peuvent être lues par
l'intermédiaire des variables du jeu. Ce message est envoyé avant
l'affichage de la pièce.
_ $0204: une pièce vient d'être affichée.
_ $0205: action. 4(A0).L: numéro de l'action. Ce message est envoyé
juste après l'évaluation de la phase B de la règle et la mise à jour
des nombres (affichage), et avant l'exécution de l'action.
_ $0206: message envoyé par l'action +10. 4(A0).L: pointeur de pile du
jeu. Les données ont été mises dans la pile du jeu. Le sommet de la
la pile contient le nombre de données empilées (N.B.: ce mot long
n'est pas compris dans les données); ces données seront dépilées par
TETRHEX au retour.
_ $0207: message envoyé par l'interpréteur RUL (cf commande $6D).
4(A0).L contient le pointeur de pile du jeu.
_ $0208: message envoyé juste avant la phase A du jeu. Si le résultat
est non nul, la phase A ne sera pas exécutée et le message $0209 ne
sera pas envoyé.
_ $0209: message envoyé juste après la phase A du jeu.
_ $0300: lecture d'un signal. 4(A0).L: code de la touche (état des
touches spéciales + scancode + code ASCII) si une touche a été
frappée, sinon 0. Si aucun signal n'est détecté et si la touche
frappée n'est pas prise en compte par le fichier de message, 0 doit
être renvoyé (TETRHEX prendra la touche en compte et fera passer le
signal éventuel à la phase B du fichier de règle). Si aucun signal
n'est détecté et si la touche frappée ne correspond à aucun signal
ou ne doit pas être prise en compte, une valeur négative doit être
renvoyée. Si un signal est détecté (dernier cas), à cause de la
touche éventuelle ou d'une autre raison, l'identificateur externe du
signal doit être renvoyé.
_ $0301: émulation d'une touche de fonction. Une valeur entre 1 et 20
est renvoyée pour émuler la touche de fonction correspondante. Sinon
une valeur nulle doit être renvoyée.
_ $0302: émulation d'un évènement dans le menu principal. La valeur n
renvoyée a la signification suivante: 0: pas d'évènement, 1: aide
sur TETRHEX, 2: aide sur la règle, 3: charger une règle, 4: nom du
joueur, 5: jouer, 6: meilleurs scores, 7: arrière-plan, 8: quitter,
16 à 19: tableau de n-10 cases de côté, -1 à -20: meilleurs scores
(touche de fonction F(-n)).
_ $0303: émulation d'un évènement pendant l'entrée du nom du joueur.
Signification de la valeur n renvoyée: 0: pas d'évènement, 1 à 255:
caractère affichable ou non (3: ctrl-C, 8: backspace, 13: return,
27: escape), -1: flèche droite, -2: flèche vers le haut.
_ $0304: émulation de la touche Esc à la fin du jeu. La valeur
renvoyée doit être non nulle pour revenir au menu principal.
_ $0400: message AES de type ≥ 128 reçu par TETRHEX. 4(A0).L: pointeur
sur le buffer de messages (cf evnt_mesag).
_ $0401: touche enfoncée et non prise en compte par TETRHEX, dans le
menu principal. 4(A0).W: état des touches spéciales du clavier (cf
evnt_button). 6(A0).W: code de la touche enfoncée, i.e. scancode de
la touche dans l'octet de poids fort et code ASCII dans l'octet de
poids faible (cf evnt_keybd).
Note 1: dans le jeu, la pile est descendante, i.e. quand on empile, le
pointeur de pile du jeu est décrémenté de 4 (car les éléments ont 32 bits).
Le pointeur de pile pointe sur le sommet de la pile, i.e. sur le dernier
élément empilé quand la pile n'est pas vide. Le pointeur de pile initial est
donné par le message $0201; à ce moment, la pile est vide.
Note 2: les messages de type $03xx permettent de faire des calculs en
tâche de fond (avec un système d'exploitation non préemptif).
8. Notes techniques
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Cette section s'adresse à ceux qui connaissent assez bien le TOS/GEM,
notamment les programmeurs.
8.1. Flags du programme
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Note: comme l'assembleur que j'utilise n'est pas capable de positionner
les flags de programme (PRGFLAGS) comme on veut, il est possible que, dans
certaines versions de TETRHEX, j'oublie de les modifier. Ces flags se
trouvent à l'offset 0x16 du programme TETRHEX.GTP/PRG.
Vous pouvez modifier les bits 0 à 2 à l'aide du CPX FileInfo de Dieter
Fiebelkorn.
_ Bit 0 (fastload): il est préférable de le mettre à 1 pour accélérer
le lancement.
_ Bits 1 (TT-RAM prg) et 2 (TT-RAM mem): il est préférable de les
mettre à 1.
_ Bit 3: inutilisé (mettre à 0).
_ Bits 4 et 5: il est préférable de les mettre à 0.
_ Bits 6 à 15: inutilisés (mettre à 0).
8.2. Codes d'erreur
¯¯¯¯¯¯¯¯¯¯¯¯¯¯
La liste des valeurs renvoyées par TETRHEX est donnée ci-dessous.
Lorsqu'il y a une erreur, celle-ci est indiquée par une boîte d'alerte en
plus du code de retour, si l'AES a pu être initialisé.
_ 0: pas d'erreur.
_ 1: mémoire insuffisante.
_ 2: impossible de changer de résolution.
_ 3: mauvais processeur (il faut au moins un 68020).
_ 4: impossible d'ouvrir une station de travail.
_ 5: impossible de créer une fenêtre.
_ 6: problème de fonte.
_ 7: fichier de règle non trouvé.
_ 8: mauvais format de fichier de règle.
_ 9: erreur interne.
_ 10: chaîne d'options incorrecte.
_ 11: mauvais format de fichier de langue.
_ 12: fichier d'aide non trouvé.
_ 13: mauvais format d'aide.
_ 14: stack overflow.
_ -1: erreur système.
8.3. Déplacement de la fenêtre
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Avec le TOS 4, si une des 2 lignes situées en bas ou une des 2 colonnes
situées à droite d'une fenêtre (utilisées pour le relief) est en dehors de
l'écran et si on déplace la fenêtre vers l'intérieur de l'écran, alors un
message de redraw est toujours envoyé (bug du GEM). Pour éviter ce redraw,
on interdit à ces 2 lignes et ces 2 colonnes de sortir de l'écran; mais
comme, pour l'AES, elles ne font pas partie de la fenêtre, on doit en tenir
compte dans les calculs.
8.4. Modification de la palette
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
En mode plein écran, la palette de couleurs est modifiée de nombreuses
fois par TETRHEX, mais elle est restituée à la fin.
Mais en mode fenêtre GEM, un problème se pose, car plusieurs applications
(ou accessoires) peuvent utiliser des palettes différentes. Le mieux serait
de sélectionner la palette de l'application ayant la fenêtre au premier
plan, i.e. quand une fenêtre passe au premier plan, la palette est changée
en même temps; mais l'AES ne permet pas de le faire. C'est donc TETRHEX qui
effectue le changement de palette lorsque la fenêtre repasse au premier
plan; lorsque la fenêtre de TETRHEX est "détoppée", la palette n'est pas
modifiée par TETRHEX, car il ne peut pas connaître la nouvelle palette:
c'est à l'application qui a la fenêtre "toppée" de changer la palette. Si
toutes les applications utilisant la palette 256 couleurs se comportent de
cette manière, il ne devrait pas y avoir de problème en général (mais il ne
faut pas que la fenêtre soit détoppée avant que la palette soit modifiée).
Note: les 16 premières couleurs ne sont jamais modifiées par TETRHEX (en
mode fenêtre GEM) et ne doivent l'être par aucune autre application. Lorsque
TETRHEX est quitté, l'ancienne palette n'est évidemment pas restituée.
9. Limitations de la version non enregistrée
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
La version non enregistrée présente les limitations suivantes:
_ On ne peut pas changer de règle (touche Undo désactivée).
_ On ne peut pas changer la taille du tableau.
_ Les scores ne sont pas sauvegardés.
_ Les parties sont limitées à 5 minutes environ.
_ Après 10 parties, TETRHEX est quitté automatiquement.
_ On ne peut pas utiliser de fichier de messages.
La règle et la taille du tableau doivent donc être choisies au moment de
lancer TETRHEX (cf section "Lancement et configuration").
En vous faisant enregistrer, vous recevrez une version sans limitation,
mais aussi quelques fichiers de messages avec leurs sources, le source C
d'un mini-compilateur permettant de créer beaucoup plus facilement des
fichiers de règle, ainsi que la documentation nécessaire sur le format
(ASCII) utilisé. Vous recevrez également les sources des fichiers de règle
fournis avec TETRHEX, de façon à ce que vous puissiez les modifier et à ce
qu'ils servent d'exemples.
Vincent Lefèvre