De temps à autre, j’aime bien chercher sur internet des vieux jeux d’aventure dont le code source est disponible, pour voir ensuite voir si ce code est toujours compilable et exécutable sur un ordinateur moderne.
C’est ainsi que je suis tombé sur Adventure Castle développé en langage C par Dave Dunfield. L’archive Castle.zip est téléchargeable sur ifarchive.org. Le jeu est également répertorié sur IFDB mais la page dédiée ne donne presque aucun information, à l’exception de l’auteur et de la date de création du jeu (1983). En ouvrant le fichier Castle.zip, l’on obtient quelques informations supplémentaires :
Dave Dunfield's "Adventure Castle", a clone of "Colossal Cave"
Written in Micro-C, runs on DOS 2.0 and up (PCs).
Binary built by Dosius.
Micro-C semble être un ancien compilateur pour MS-DOS. L’archive Castle.zip contient les fichiers suivantes :
castle.c Code source en C
castle.com Exécutable pour MS-DOS
castle.dat Fichier binaire de description des lieux
castle.hlp Fichier texte affichant une aide
Vous pouvez directement jouer à Adventure Castle avec DOSBox. Sous Linux (Debian ou Ubuntu), l’installation de DOSBox se fait de la façon suivante :
$ sudo apt-get install dosbox
Ensuite, pour lancer le jeu, après avoir extrait les fichiers de l’archive Castle.zip :
$ dosbox castle.com
Le jeux se lance dans une nouvelle fenêtre :

Il est bien sûr possible d’utiliser DOSBox avec d’autres distributions Linux ou avec Windows.
Adaptation du code source pour GCC
Le premier essai de compilation du code source avec gcc a été un échec. En effet, certaines fonctions utilisées pour manipuler les fichiers ne sont pas compatibles avec la librairie C standard actuelle, parmi lesquelles fopen (ouverture d’un fichier), ftell (récupération de la position courante dans le fichier en cours de lecture) et fseek (positionne la tête de lecture à la position donnée en paramètre). Ces dernières sont utilisées pour lire le fichier binaire castle.dat qui contient la description des 180 lieux (ou salles) du jeu. La structure est particulière, le caractère nul (0) est le délimiteur d’une nouvelle salle, il est suivi de la description dans un format chiffré.
J’ai effectué de nombreuses autres adaptations sur le code, certaines pour pouvoir rendre le programme compilable avec gcc et fonctionnel, d’autres d’ordre esthétique.
Liste des adaptations pour compilation avec gcc:
- Correction de l'utilisation des fonctions de manipulation de fichiers : fopen, ftell, fseek
- Déclaration des fonctions dans un style moderne
- Ajout des types t_bool, t_usi (entier court non signé) et t_si (entier court signé)
- Correctif dans la fonction parse(), les commandes de l'utilisateur n'étaient plus reconnues
- Correction du calcul du score dans la fonction end_game()
- Pour la fonction rand(), initialisation de la graine avec une lecture de l'heure (utilisation de time.h)
- Suppression de tous les warnings générés par gcc avec l'option -Wall.
Voici l’archive avec le code source mis à jour :
J’ai ajouté un Makefile qui permet de produire l’exécutable castle. Pour compiler :
$ make castle
Pour lancer le jeu :
$ ./castle
Le jeu s’exécute dans la console :
ADVENTURE CASTLE by Dave Dunfield
Welcome adventurer, would you like instruction?y
You have been given the mission of exploring the ancient ruins of long
lost ADVENTURE CASTLE, which are said to be buried nearby.
Local people are afraid of this area... so you are on your own. Those
foolish enough to attempt the task have never been heard from again.
There are rumors of terrible monsters and strange magic...
Your job is to find and explore the castle and surrounding area, and
to retrieve the fabulous treasures said to be lost within its depths. If
you do manage to find anything of value, pile it on the beach where your
employer can get it (If you can't find the beach, you're in REAL touuble).
Since you can't fit inside the computer where this fantasy land really
exists, we will send your ALTER EGO who can. You may communicate through
commands typed on the keyboard. Most commands are of the general form of
a verb and a noun, such as 'take knife', although your alter ego usually
can determine what you want from more complicated commands.
Use 'quit' or 'stop' to end the game, 'score' or 'points' to find out
how badly you are doing, and 'carry' or 'inventory' to find out what you
possess. Use 'suspend/resume' to save/return to a game.
To get full points, you must place all treasures safely on the beach,
and destroy all monsters which may be inhabiting the area... GOOD LUCK!!!
One moment please...
You are standing in a small clearing in the forest, There is
a large stone cliff to the immediate east. Paths lead off to
the north, west, and south.
>
Enfin, j’ai créé un petit utilitaire extrdat qui extrait les données du fichier binaire castle.dat et les affiche sur la sortie standard dans un format texte lisible. Vous pouvez ainsi voir en clair la description des 180 salles. Le source est castle_extract_dat.c. Pour le compiler : make extract
Il ne vous reste plus qu’à résoudre l’aventure… Je n’ai pas fait beaucoup de tests, il se peut donc qu’il reste quelques bugs… N’hésitez pas à me les signaler le cas échéant.
