Et voici la cinquième session de Retro Programmers United for Obscure Systems, organisée par Olipix qui se termine !
Et j'y ai participé.
La machine
Tout d'abord, la machine. Le principe de cette game jam est de développer un jeu pour une machine qui n'a pas eu une grande ludothèque. Avec le Matra Alice, la question se posait. En effet, la première machine de la gamme, le Matra Alice 4k, est la même machine que le Tandy MC-10, qui a lui une ludothèque un peu plus fournie.
L'idée était donc de se concentrer plutôt sur les deux autres machines de la gamme commerciale : le Matra Alice 32 et le Matra Alice 90. Ces machines, qui offrent une compatibilité au niveau BASIC avec la première, sont néanmoins différentes, en particulier à cause d'un processeur graphique différent. Dans ces deux machines, il s'agit de l'EF9345. Le même qui équipe le VG5000µ, avec la même taille de mémoire vidéo associée, 8k.
Autant dire que niveau graphique, j'étais en terrain connu.
Niveau processeur par contre, c'est une découverte. Le 6803 est un microcontrôleur 8 bits, de la famille des 6800. Mais je ne connaissais pas vraiment. En tout cas, je n'en avais aucune pratique. Il a de la RAM embarquée sur la page 0. Il a aussi un chronomètre (timer), normalement utilisée pour les communications (séries et cassette).
Le développement
Avant de parler du jeu, un mot sur le développement. Comme je venais de recevoir l'extension « Multiports » , je voulais que le jeu puisse être sur cartouche. Autre avantage, pas de temps de chargement si l'émulateur gère bien cette extension.
Vous le savez si vous avez lu d'autres articles sur ce blog, j'aime bien avoir une chaîne de développement avec le maximum d'automatismes, pour me concentrer sur le développement du jeu et faire le moins d'opérations manuelles possibles.
Mon choix habituel va vers MAME. Et MAME a un support pour l'Alice... mais pas pour l'extension. Mon premier développement a donc été d'ajouter à MAME le support de l'extension, en tout cas le support cartouche et l'ajout de RAM. Le changement a été accepté, mais j'ai quelques modifications qui m'ont été demandées et que je dois toujours terminer.
Utilisant mes scripts d'automatisation habituels, j'avais en tout cas de quoi lancer l'émulateur automatiquement après une compilation.
Cependant pour compiler... il faut un compilateur. Il n'y a pas beaucoup de choix pour le 6803 pour un compilateur C, et légèrement plus, mais pas trop, pour un assembleur. Dans un premier temps, j'ai fais quelques tests avec un premier assembleur... mais avec le jeu que je voulais faire, je me suis dit que j'y gagnerais en productivité avec un compilateur C.
Après quelques recherches et essais, j'ai choisi CC6303. Le message « The assembler and linker should be reasonably reliable and complete. » m'a fait un peu peur, mais j'ai quand même tenté. J'ai fais des tests, et ça semblait générer du code correct.
Sur toute la durée du développement, j'ai eu deux fois des problèmes de génération de code. Je ne les ai pas analysés plus que ça, car c'était (bien entendu) vers la fin.
J'ai contribué à une paire de modifications au passage. Au moins, la game jam aura permis modestement d'améliorer les outils de développement pour cette machine.
Le jeu
Comme d'habitude, je suis parti sur une idée bien trop ambitieuse, et avec le premiers mois consacré à la découverte de la machine et aux modifications de MAME, j'ai dû revoir mes plans. En fait, même avec la totalité du temps, je n'aurais pas pu faire ce que je voulais...
Je suis donc parti sur une idée de jeu que je voulais aussi faire : un Match-3. C'est un type de jeu auquel je joue beaucoup. C'est aussi un type de jeu qui a beaucoup de variations : est-ce que les tuiles tombent, est-ce qu'elles montent, est-ce qu'elles sont renouvelées, quel scoring, quels bonus, des challenges, etc.
Pour démarrer, j'ai fait un prototype avec un terrain de 10 par 10, toujours rempli de tuiles. Lorsque 3 tuiles identiques ou plus sont alignées, elles disparaissent. Les tuiles du dessus tombent, et des nouvelles tuiles apparaissent en haut. Les tuiles étaient représentées par des chiffres. Le but pour moi était de 1/ trouver l'algorithme de recherche des tuiles alignées, 2/ vérifier que la machine était assez puissante pour ce type de jeu.
Une fois le prototype fonctionnel, j'ai commencé à ajouter des graphismes. J'ai utilisé Pixelorama pour dessiner les tuiles, avec un thème « Alice au Pays des Merveilles ». Comme je l'ai fait auparavant, j'exporte manuellement les images en PNG (j'aimerais bien un export automatique, mais cela ne semble pas possible pour le moment, ou alors je n'ai pas trouvé). Ces imagines PNG sont ensuite converties en données dans un format que je peux inclure dans le code.
De temps en temps, je lançais un test sur la machine réelle. C'est ainsi que je me suis aperçu que mon extension a un problème avec son extension RAM. Comme je n'avais pas le temps de m'en occupé, j'ai coupé la RAM supplémentaire (c'est une option de l'extension). Le jeu n'a pas besoin de beaucoup de mémoire, le code et les données graphiques étant présents dans la ROM.
Une fois le jeu fonctionnel, je voulais ajouter un principe de challenges pour avoir une sorte de mode « histoire ». Je voulais aussi ajouter un mode « infini », mais je n'aurai pas assez de place pour ça. Je voulais aussi ajouter un petit personnage qui réagit aux actions du joueur.
Dessiner un personnage avec les contraintes de couleur et mes (bas) talents de dessinateur a été un peu compliqué, mais je suis assez content du résultat.
INSÉRER IMAGE AVEC LE PERSONNAGE
Problème : la place sur la cartouche. Une cartouche d'extension Multiports a une taille totale de 64k. En mode cartouche, cette taille est divisée en 8 banques de 8k. Cela signifie qu'à un moment donné, il n'y a que 8ko accessible. Le Multiports a un système simpliste de changement de banque : il suffit d'écrire sur une plage de donnée précise le numéro de la banque voulue. C'est suffisant, mais sans support du compilateur, c'est un peu acrobatique.
Je n'avais pas le temps de pousser un système d'appels de code entre les banques, j'ai donc séparé le jeu en deux grandes parties. Dans la première partie, et donc la première banque, je mets tout ce qui est graphiques. C'est une astuce sur les jeux cassettes que je reprends ici : un premier programme se charge et redéfini les caractères. Ensuite, il lance le jeu.
La première banque contient aussi l'écran de titre.
Le cœur du jeu est dans la deuxième banque. Pour passer d'une banque à l'autre, j'ai un petit bout de code que je place en RAM pour faire le changement. Chaque programme est compilé comme un logiciel indépendant.
Mais... et le titre ?
Le titre est une référence à la traduction française de « Alice's Adventures in Wonderland » qui est trouvable sur le projet Gutenberg. Le chapitre deux commence par ce passage : « “De plus très-curieux en plus très-curieux!” s’écria Alice ».
Dans mon jeu, Alice se retrouve dans un monde étrange avec des tuiles à aligner. On ne peut pas dire que ça va très loin d'un point de vue histoire et justification... mais ça suffira.
Oh, et j'ai aussi dessiné une jaquette pour la cartouche et la manuel. À base de dessin sur tablette et de beaucoup de temps de retouche avec The Gimp, puis de composition avec Blender pour ajouter les tuiles.
Quelques liens
-
Le code source est disponible.
Conclusion
Le jeu est disponible sur itch.io. J'ai rapidement ajouté une version cassette, car tout le monde n'a pas un Multiports (pas encore disponible sur la page, elle sera dans la version 1.1 que j'ajouterai bientôt).