Showing posts with label basic. Show all posts
Showing posts with label basic. Show all posts

Friday, August 08, 2025

ROX'64

This is a piece of history. A screenshot from ROX64, a small lunar lander for C64 (without rotation) where you'd have to shoot at meteors once you've landed before the moon you've landed on starts getting moonquake due to excessive amount of shocks from meteors.

Ce petit screenshot n'a l'air de rien mais il a pour moi la saveur du Chaînon Manquant... cette part d'histoire qu'il faut que je vous raconte: c'est le jeu qui m'a fait passer d'un projet de quizz géographique en texte pur à un projet mêmant PETSCII, sprites et même quelques effets son au SID. Oh, ne vous emballez pas: le jeu que vous voyez là est un titre tout à fait officiel dont je n'ai pas touché un seul byte, mais il était écrit en BASIC, et j'ai donc pu l'imprimer, l'analyser et -- au final -- le bidouiller pour remplacer le module lunaire par un Caliméro.

One interesting aspect of the game was that it was 100% BASIC, meaning you could get and print the listing, study it ... and in my case, modify it so you'd play as Calimero throwing apples to avoid getting squashed. It wasn't much, and I bet nobody would have played it more than I did while proof-testing the thing, but it was the first time I was going beyond a quizz game and actually made something with all chips of the C64. If you think about it, replace the starry sky by some massive mountain, make the asteroid look red and you've got a boss-sort encounter that would have actually fit the theme of the (yet to come Calimero) game's first zone.

Oh and the (original) game was by Jeff Minter, by the way .. the one person who wrote "Revenge of the Mutant Camels"
 

Tuesday, June 03, 2025

Starport BBS*.as3m

J'avoue: j'ai un faible pour les sons AdLib. ça doit venir des des heures passées dans les Shadowlands et sur l'Omegamatic ... Parce que oui, la synthèse FM utilisée en guise de synthé midi, c'est loin d'être formidable, mais quand vous laissez des habitués du SID s'en emparer, ça peut donner des pépites.  Mais paradoxalement, c'est aussi ma plus grosse bête noire. 

Vous vous doutez bien que de l'Adlib, j'ai essayé d'en mettre dans mes programmes, hein. Le premier jeu Bilou en QuickBasic avait eu droit à une extension SoundBlaster qui m'avait notamment permi de jouer une petite musique de fond pendant qu'on était sur la map, au prix de ruses de sioux. Mais voilà, si le son par défaut était potable pour faire des petits jingles (remplaçant ceux joués au PC speaker), on était loin des bandes sons même de Jill of the Jungle. J'avais essayé de me faire mon petit programme de configuration de sons, mais il faut bien reconnaître que la seule chose que je comprenais, c'étaient les niveaux d'attaque, decay, sustain release, concepts que je connaissais déjà de l'époque du C64. Sauf que bah ... ça ne donnait pas grand-chose: je n'ai jamais réussi à en tirer aucun son intéressant. 

Puis (?) le RSD game-maker a fait son apparition chez nous ... il nous suffisait de trouver des fichiers .cmf pour avoir de la musique dans nos jeux. Elle était adlib. Il y avait des morceaux plus ou moins réussis dans le pack de base, mais surtout, il y avait des .cmf dans Jill of the Jungle, Hocus Pocus et pas mal d'autre titres. Mais point d'éditeur de cmf, pour "Creative Media File"...

Mais comme on pouvait le prévoir, au bout de quelques jeux, le côté "Piet the Craker-boy" de mon frangin a cédé devant le côté "MC-Piet / Cyborg Jeff" qui s'était trouvé un modtracker. Chiper les musiques d'autres jeux pour les mettre dans nos jeux ne suffisait plus (le fait que le magazine PC Fun ne les ait pas redistribués a sans doute joué aussi). Comme le premier modtracker qui a bien voulu tourner à la maison était livré avec un fichier .TXT qui expliquait le format de fichier .S3M, ça a été le début de la grande aventure player soundblaster ... mais ça, c'est une autre histoire.

Le déclencheur pour l'histoire qui nous intéresse, c'est au moment où j'ai trouvé la description du format de fichier .mid et comment un .cmf est en réalité un .mid avec des réglages de carte adlib pour les instruments concernés en en-tête de fichier. Il ne m'en fallait pas plus pour commencer à envisager un programme (en assembleur, évidemment ^^") de conversion aS3M->CMF qui nous aurait permis de ... per ... mis... de ... (pause dramatique) conquérir     le monde!

Sauf que bon ... de nouveau, je n'avais pas grand-chose à mettre du côté "instruments". Si seulement j'avais eu les fichiers de Purple Motion (ne manquez pas la fonction 'player online' :), ces .as3m qui reprennent aussi les paramètres des oscillateurs, ces chiffres hexa sur les lignes "mod"(ulator) et "car"(rier), j'aurais pu les réinjecter dans mon vieil outil BASIC, non ? 

basschordscounterlead
chordlead1lead2lead3

Qu'est-ce qui change aujourd'hui? Eh bien ... on peut trouver des vues oscilloscope de certaines des musiques du répertoire FM de l'âge d'or. Et si je ne sais pas encore en dire "ah oui, c'est avec un LFO et un LPF", au moins, je peux voir quelles ondes de base ont été utilisées pour quel type de son. Par exemple pour un titre de Fury of the Furries

Et dans "The Alibi", à l'exception du son pour les accords, tous les sons se modulent au fur et à mesure. Et la façon dont ça se produit sur la vidéo me laisse penser que ce n'est pas une conséquence naturelle des paramètres de modulation choisis: un des paramètres (le volume du modulateur, à en croire @laamaa). Mais sauf erreur d'interprétation de ma part, certaines modifications de la forme d'onde au cours du temps peuvent donc être simplement liée à l'enveloppe ADSR du modulateur.

J'aimerais donc tester 

Mais à quelle fin ? Parce que bah, j'ai plus de carte Adlib sur aucune de mes machines. Alors oui, la version Linux de SchismTracker permet de les rejouer ... il y a des générateurs de sons adlib, mais ils sont basés sur des calculs en virgule flottante intensifs, chose que la NDS n'a pas...

On pourrait souder un chip FM sur une cartouche GameBoy ... ça serait sympa et le port gameboy à ce qu'il faut pour en récupérer le son ... mais bon, je ne suis pas Natalie, moi ^^"

Bref, reste l'idée un peu farfelue d'un sketch-a-sound pour DS qui aurait des fonctions de morphing frame par frame ... peut-être que ça rendrait... ou pas ...

Friday, February 05, 2021

Programming Pitfall Harry

L'aventure racontée par 8-bit show and tell est presque surréaliste: un dévelopeur de jeu qui vous envoie un morceau de son code source comme ça, juste sur demande. Et pas n'importe quel développeur: le créateur de Pitfall!

Pitfall, pour ceux qui n'ont pas vécu ça, c'est ce qui se rapproche le plus du phénomène Super Mario Bros pour les possesseurs de micro-ordinateurs jusqu'à ce que Great Giana Sisters ne devienne facile à trouver.

Je m'attendais à un bouquin/carnet déjà costaud, du coup, en fait, la chose tient sur l'espace de menu de mariage. juste une page US letter pliée en deux, l'extérieur contenant un petit mot du créateur et des illustrations.

C'est un programme a priori typique de la "programmation système" en BASIC C64, avec plein de POKEs pour modifier des registres du contrôleur vidéo et des DATA avec les trucs à y mettre. Le machin bien opaque pour qui n'a pas un bon manuel pour décrypter ce qui se passe. En plus des DATA avec des sprites convertis en décimal, il y a un autre jeu avec du code machine pré-assemblé qu'on va aller POKEr dans un coin de mémoire pour pouvoir l'exécuter. (Là aussi, il y a un bouquin, mais c'est plus chaud).

if you speak English, you're lucky. Because that means you can enjoy the full 8-bit show'n'tell where the story of that 'Programming Pitfall! Harry' leaflet that invited kids of the eighties to type from scratch something that would make the most iconic video game adventurer of the time do a footing on their screen. I mean it. That dude was the early eighties' Lara Croft.

If you've done some C64 programming, the content of the leaflet will be obscure but somewhat familiar. It's a loop POKEing things in memory so that the video chip (VIC-II) can render sprites and some obscure DATA that contain what it takes to get pixels the expected shape. There's something alike in the C64 manual to make your first sprite and I had tweaked a lunar lander BASIC game to feature Calimero instead of the LM back in my 10s.

Au final, on aura 'juste' le personnage Harry qui se promène à l'écran. Ouaip, je vois déjà les blasés du Scratch qui rigolent au fond, mais eh. 1) il est multi-colore. 2) il court (animation) et bouge tout à la fois. 3) il est grand. Rien à voir avec la démo-ballon du manuel C64, hein!

Et surtout, tu fais RUN STOP pour revenir à l'interpréteur BASIC, et le mec, il continue son footing. C'est le Mario-de-l'éditeur-de-Bisquit avec 25 ans d'avance!

En fait, on a pas ici une boucle BASIC qui anime et déplace: c'est un morceau de code machine installé juste avant le code qui fait clignoter le curseur texte qui s'occupe de faire bouger le personnage. Tout ça tenant dans le tampon mémoire prévu pour la lecture des cassette.

Pour se situer, le tape buffer utilisé dans le programme présenté dispose d'à peu près 200 bytes. A côté de ça, l'autre zone mémoire qui est disponible sans toucher au setup habituel pour faire du BASIC fait 4K et se trouve en 0xc000, juste avant les ROMS CHR et KERNEL.

But there's actually more here. You don't have to interrupt the program to return to BASIC interpreter: it does it by itself. And yet, Harry keeps footing on your screen while you can tweak the program or scratch it and run another one. That's because you haven't only POKEd some sprites data: you've also POKEd a small assembler routine that will be invoked ahead of the cursor blinking logic that will move and animate Harry's sprite.

I can only dream of what I'd have done with this if I had been exposed to such a sample when I was a C64 teenager. Think of it: tweak a few locations in memory and you could switch the character's behaviour between jump, idle, run, fall ... Chain a few other routines in a BASIC room-loader with POKEs and you could have a monster patrolling on line 42 while your character is running on another location. And you're free to run your loop checking their positions, computing whether collisions occured and adjust their behaviour if it did.

With some extra LDA and CMP opcodes, maybe the characters under the sprite could be checked and a flag could be set so that the BASIC code would know we've entered a 'FAIL' condition ...

Je ne peux m'empêcher de penser ... et si ... Et si au moment de commencer à travailler sur Logic Labyrinth j'avais eu accès à un petit programme de ce genre qui puisse déplacer un objet de manière quasi-autonome.

On aurait gardé un programme BASIC qui dessinerait la bonne salle et ajouterait quelques POKE pour chainer les uns derrière les autres character_interrupt, puis hshot_interrupt et walking_monster1_interrupt pour que les différents "personnages" de l'écran soient présents.

Ensuite, on aurait eu une boucle qui faisait de son mieux pour tester la position du personnage par rapport aux triggers du niveau et qui aurait fait apparaître ou disparaître certains éléments...

VRAM tricks used by Lazycow
Mais bon, mon seul contact avec le code machine du C64, c'était en 1997, 10 ans trop tard, et tout ce que mon bouquin proposait, c'était de charger un bout de code pour remplacer les caractères ROM par des caractères RAM histoire de pouvoir remplacer le T par un smiley.
Par contre, il faudra que je tire au clair cette histoire de 'VIC bank'. Quand j'ai commencé à écrire des programmes plus grands (pour Space Mission) mélangeant des tableaux de grande DIM(ension) et plus de sprites, je finissais par avoir mon programme qui provoquait des "erreurs systèmes", au point que le listing lui-même n'était plus garanti. Et si c'était simplement parce que j'écrasais des morceaux de listing avec mes POKEs ?


Friday, January 01, 2021

Du QuickBasic? ça !?

Avec bien des années de retard, j'ai finalement testé MisterKid d'Asher256. On pourrait le qualifier de "clone de Super Mario tournant pas mal dans DosBox" si on ne connaissait pas le langage dans lequel il a été développé: le QuickBasic.

Le jeu utilise la bibliothèque de fonctions DirectQB d'Angelo Mottola, capable de scrolling parallaxe(!) et la FmLib (d'Achraf Cherti, alias Asher256) pour proposer des musiques de fond AdLib. S'il n'y a pas l'air d'y avoir de polyphonie, ça reste un exploit technique, d'autant qu'à défaut d'être des thèmes originaux, ils proviennent du monde Nintendo et on est pas face à un player 'bien connu' traîtant des fichiers emprunté à un shareware MS-DOS comme j'avais dû faire du temps de PPPTeam. Coup de chapeau.

Bon, permettez moi d'être franc tout en étant enthousiaste: la partie artistique n'est pas le point fort du jeu. Ce n'est pas criard, mais ça n'est ni très inspiré, ni de nature à nous émerveiller. Le level design est comparable à ce qu'on pourrait rencontrer dans un niveau de "Super Mario Maker" sans tous les délires des niveaux infaisables. Mais il faudra bien calibrer la vitesse à laquelle DosBox tourne pour pouvoir négocier les sauts qui se terminent sur un bloc unique et malgré tout boucler le niveau en 60 secondes, le timer avançant indépendamment de la vitesse de notre personnage. Je propose de se caler sur 16000cycles pour DosBox.

Mais du point de vue technique, c'est un impressionnant tour de force et je serais curieux de voir où Bilou's Adventure aurait pu aller avec un outil pareil. (ou de savoir quelle genre de configuration était nécessaire pour le faire tourner en natif, tiens).

Asher tient toujours un blog (enfin, je crois: il n'y a pas de date à ses articles), mais je ne vois aucun moyen d'y laisser un commentaire. Je ne peux donc qu'espérer qu'il surveille toujours mon blog dans son intégrateur ou que duck duck finira par le ramener ici.

Sunday, April 19, 2020

3 ... 2 ... 1 ... Smile!

C'est tout simplement énorme. Je lance le décompte. Okay, ça fera sans doute pas le poids contre le kit 'dream(s?)' sur PS* et on a 8 ans de retard par rapport à 'Petit Computer' prévu pour les stores DSi.

Mais ce coup-ci, l'Europe a accès à la chose. Merci aux contacts des Taikenban et la communauté des cartmodders pour avoir attiré mon attention là-dessus. On en reparle, promis.

J'attends ... entre impatience et excitation. Ce sera peut-être le premier langage de programmation que je vais acheter. Incroyable, non ?
PS:

  • SmileBasic 4 a quand-même quelques nouveauté syntaxiques par rapport au MS-BASIC des années '80 ('70?), comme la possibilité de récupérer plusieurs valeurs en une commande avec le mot-clé OUT.
  • SmileBasic était le langage/interpéteur utilisé dans PetitComputer. Il reste des "Petit" à gauche et à droite dans certains exemples
  • Il y a une sorte de 'guide de l'utilisateur' dans les programmes téléchargeables, en plus des mini-tuto intégrés à l'outil. Et une documentation en ligne (encore un peu légère par rapport au SmileBasic de la 3DS).
  • Jayenkai nous a refait toute sa ludothèque pour Smile Basic!  Y compris Blockman Gets ^_^

Wednesday, January 04, 2017

Pico8

La pseudo-console PICO8 est sans doute le gadget le plus sympa que j'aie découvert au cours de l'an dernier. Un système tout-en-un, avec une programmation style BASIC (mais pas tout à fait) et un petit éditeur de graphisme et de son intégré, tout à fait dans l'esprit "game development for all", mais sur un support imaginaire, accessible via un browser et sur un assez grand nombre de systèmes. Des petits jeux qui rappellent l'âge de la programmation de garage sur commodore.

I'm enthusiast. PICO8 virtual console and the PocketC.H.I.P computer are likely the gadget-computers I love the most among those "thing-a-teach-kids-coding" I've met so far. BASIC-style, embedded editors. Easy to take along. I played a few platformer projects last week-end and enjoyed quite a lot of them. They remind me of fresh little projects that could be found in the garage-afternoon-devin' times of the C64 era. It's unclear to me whether that could support logic as complex as the one found in School Rush, though.

Si je n'en parle que maintenant, c'est que jusque là, je n'avais pas eu l'occasion de voir de plus près à quoi la programmation peut effectivement ressembler (mis à part quelques démos officielles). Mais je suis tombé cet après-midi sur un tuto "comment faire son premier shoot-em-up" en quelques gifs animés.

Et à mon avis un des hardwares les plus sympas pour faire tourner cet émulateur 8-bit, c'est le PocketCHIP... un ordinateur de la taille d'une calculette des années '80

Friday, July 19, 2013

Bilou Origins

Je vous emmène dans le temps ... 20 ans en arrière. Je suis un gamin de 14 ans et je viens de terminer de programmer le niveau 2 de Calimero en EPBASIC. Cet après-midi-là, mon frère revient à la maison sur-excité: un nouveau gars dans sa classe -- Piek -- fait des jeux vidéos et de la musique techno. Il a assisté à une formidable démonstration des capacité de l'Amstrad CPC grâce auquel Piek a réalisé un jeu de plate-forme autour d'un personnage rondouillard nommé "bubule". La suite a déjà été racontée et va conduire à Bilou tel que nous le connaissons aujourd'hui.

One week ago, this was all that was left from the seminal 
CPC game that led to Bilou as we knew it.

Pour ma part, il m'aura fallu bien du temps avant d'entrer dans le grenier où Piek range son ordi. Et quand j'y arrive, il est trop tard: la cassette sur laquelle se trouvait le projet "Bubule" est irrémédiablement perdue. Je n'aurai donc de ce petit (?) jeu que les images que je m'étais construites dans ma tête. Une sorte de mélange entre Space Panic et Rick Dangerous avec les personnages 8x8 pixels que Piek avait retracé au marqueur pour me servir de base dans la conversion dans un jeu de labyrinthe pour CGA 4 couleurs.

Les choses auraient pu en rester là, mais la semaine dernière, Piek a repris son QBX.EXE et son notebook ... Cette fois, plus question d'une reprise d'un obscur jeu de kung-fu ... Cette fois, c'est ... [télécharger Bilou Origins.zip] !
Je clique ... je lance DOSBOX ... Un écran-titre digne de Giana Sisters plante le décor: tous les fameux monstres -- le sauteur, la boule rouge -- dont mon frère m'avait parlé sont au rendez vous.

Je monte l'émulation à 128000 cycles et j'appuie sur ENTER ...  

My friend Piek just sent me some QBX package named "Bilou Origins". 20 years later, at last, I'm able to get an idea of what was the first game starring the blue ball now known as "Bilou" that excited my brother so much back in time. Using the raw power of our modern computers to emulate scrolling in a BASIC that never supported such a thing, Pierrick used his natural abilty to simplify problems to provide a 4+1-levels (so far) trip into a world of nostalgia.



Simplest level editor. ENTER toggles cursors, SPACE edits.
 Le premier contact surprend. Un chateau façon Mario, des ponts, et un personnage qui ne s'arrête plus de courir quand on a appuyé sur la flèche vers l'avant. Tirant parti de son système de scrolling au maximum, Piek est parti dans un mode de jeu assez différent, sans échelles, où il faut enchainer les sauts proprement pour atteindre la fin du niveau.
A côté du jeu lui-même, un petit "MAP.BAS" me titille ... oui: c'est l'éditeur de niveau. Moins de 40 tuiles pour construire cette petite merveille de rétro-gaming.

While the CPC game was mostly flip-screen adventure, possibly drawing inspiration from Lode Runner, Bilou Origins feels more like a rush game, since releasing the arrow key doesn't mean Bilou stops running. You'll have to carefully air-control your jumps so that you clear those gaps between partly-bridged platforms that ultimately lead to the (spiky) yellow castle. Beware the purple jumper, that cannot be defeated, and the mind-changing green dude, who could turn back just when you expect him to keep moving straight ahead.


Piek calls the PPP Team to help ... new levels, tiles ... I hope they'll be at least 6 to come and provide their own 4 levels + 1 castle, so that the quest can be completed this summer and we can ship "Bilou Origins" for PCs


Alors que je galère pour donner vie au niveau imaginé par la suite sur DS, voici donc probablement le jeu-anniversaire ultime ... Donnez-nous les vacances pour y ajouter quelques petits trucs rigolos -- des boss, des power-ups, ce genre de choses -- et on vous laisse vous aussi découvrir "le tout premier Bilou, revenu d'entre les bad sectors".

Tuesday, July 24, 2012

petit computer

Mais, mais ... du neuf sur le DSi Ware ? Heureusement que Digital Tools est là pour me tenir informer. Voilà qui va fameusement plaire à Pierrick : un BASIC sur la DSi: Petit Computer. Avec support des sprites, décors et même de quoi faire des p'tites mélodies. On va même pouvoir s'échanger nos programmes sous la forme de QR-codes (imprimés sur des étiquettes collées sur les floppies des années '80, bien sûr :) Bien vu, SmileBoom ... ça va faire mal ^_^

Voilà qui va faire une sérieuse concurrence à mes p'tits outils homebrew ... mais c'est une joie immense de voir le "homebrew coding" de ma jeunesse enfin compris et approuvé par Big N ... bon, y'a probablement pas de SYS 16384, mais qu'à celà ne tienne ...

Creating and sharing your own BASIC tools and games on the DSi, with only Nintendo-approved software... does that sounds impossible ? check it out for yourself

REALITY CHECK: Amère déception après la mise à jour système: le logiciel n'est pas encore disponible en Europe. Et je suis optimiste sur le "encore"... Il a fallu près d'un an pour que 'Inchworm Animation' traverse l'Atlantique, et on attend toujours Cave Story. La traduction de tous ces textes prend un temps considérable, hein ... M'enfin, quoi, c'est à ce point la fin du monde de faire une catégorie "dans ma langue préférée" ou "dans n'importe quelle langue" en laissant à l'acheteur la possibilité "d'upgrader" dans sa langue une fois le jeu enfin traduit.

Hey, GameBridge and SmileBoom, if you're reading this don't stop after the US: Europe wants Petit Computer! We are the land of the micro-computers! We've been playing on C64 even in the nineties and have dropped our Amigas only when the PlayStation decided the market for micro-computer games should no longer exist. I won't care if translation isn't complete: most of us can understand English anyway, so please, go to your Nintendo representative and ask them how translations could be provided as a downloadable upgrade. Stop reading and go releasing ... just ... please.

Wednesday, January 04, 2012

symbol 240,60,126,255,254,255,126,60,62

Premier passage de Pierrick chez moi, en 1993. Il attrape une feuille au hasard sur mon bureau pour me montrer comment il réalise des personnages sur son Amstrad CPC, à l'aide de la commande "SYMBOL" qui reprogramme les caractères graphiques. La feuille était en réalité le dos du plan du premier niveau de Calimero ... ce petit croquis a donc voyagé dans le temps jusqu'en 2012 ^_^

Heh. That one survived too, on the back of a level map that my brother had with him at school: the bubble-shaped character that Pierrick used as hero for small flip-screen platformers on his CPC. I've long time wished that reprogramming characters on the C64 basic was as easy as SYMBOL x,... but even for sprites, it was a PEEK/POKE nightmare, so almost all my C64 games attempts were merely using PETSCII.

Celà se passe sans doutelégèrement après que mon frère ait dessiné la page d'introduction de "Bubule Warrior", sans doute parce que Pierrick dessine depuis longtemps des personnages tous ronds autour de ses feuilles de cours.

Wednesday, September 14, 2011

Animer Bilou

Petite image d'archive, pour meubler un petit peu pendant que je tripatouille les entrailles de runme. Entre mes notes de philo, je gribouillais déjà en '96 des animations complète de Bilou à réintégrer dans le jeu QuickBasic. A partir de là, je pouvais identifier les positions à dessiner pour le "corps" dans mon Sprite Editor de l'époque, puis définir les coordonnées des 2 mains et des 4 morceaux de pieds à chaque étape. Bien moins agréable qu'avec AnimEDS, hein ?
Côté animation proprement dite, l'influence de Fury of the Furries a été déterminante.

I retrieved last week-end the full set of hand-drawn animations that were used to produce the QBasic version of Bilou platformer game... I'm sure you can feel the "Fury of the Furries" inspiration here. That was later used to plot the various (but restricted) 10x10 sprites for Bilou's body in my custom Sprite Editor, and then to write down the code that set the position of hands and feet ... 6 coordinates pair for every move. Sure it would have been easier if I had the AnimEDS as well by then ^_^

Sunday, February 20, 2011

Life-changing books (1/3)

I guess my life would simply not be the same if I haven't had that book in my dad's shelf when I was young. Granted, I had a couple of books about programming, but the "Commodore 64 user's guide" was really a goldmine. Every single aspect of the C64 was covered: multi-track music, video screen layout, memory map and sprites. There were a couple of high-level techniques that I learnt later on (such as bitmap mode or reprogramming characters) in other books, but this one really set the basis on which e.g. Calimero and Space Mission were dreamt.
Sans ce bouquin sur l'étagère de mon père, il y a des chances que ma vie n'aurait pas vraiment été la même. Oh, j'avais bien 2 ou trois autres bouquins de programmation mieux adaptés à mes 8 ans, mais le "guide de l'utilisateur" était purement et simplement une mine d'or. Musique multi-piste sur le SID, fonctionnement de l'écran et des sprites: tout y étais (enfin, me semblait-il), même si j'ai découvert par la suite d'autres techniques telles que la reprogrammation des caractères ... C'est armé de cette brique à reliure à anneaux que je me suis attaqué notamment à Calimero et à Space Mission.

As a result, many of my spare time since then consisted of filling 24x21 grids or trying to depict level using the PETSCII codes (which I used to copy in a small notebook so that I could use it anywhere), which I'd then convert into lines of DATA for POKE calls.
Une bonne partie de mes temps libres (en dehors de la guitare et des LEGOs) aura donc consisté à remplir des grilles de 24x21 carrés ou à construire des niveaux à l'aide d'une copie manuscripte du jeu de caractères PETSCII que je pouvais par la suite convertir en lignes de nombres traîtées par des POKE (écriture directe dans la mémoire de l'ordi depuis le programme BASIC).

When I received my first PC, my uncle gave me an official copy of the "EP basic" (similar although not 100% identical to GWbasic), which I used for many years. It was pretty confusing to me to move to a platform where there wasn't any memory-mapped registers anywhere. The PC memory map didn't contained anything interesting, and everything had to be done with dedicated statements such as DRAW, PLAY, SOUND, etc.

Autant dire que mon premier pas dans le monde du PC m'a complètement perturbé. Exit les memory maps ... pas de registre de coordonnées pour les sprites, mais des commandes PUT et GET ... Pas de registre de timbre ou d'attaque, mais une commande PLAY capable de "jouer" à travers le PC speaker le genre de ligne mélodique de votre tout premier GSM... et écran monochrome. Pas franchement le grand amour. Mais voilà: le PC est présent en permanence alors que le C64 n'est monté que pendant les vacances.

edit: Thanks to Charles Hawn and Warlord, the link to the pdf of the 1st edition is one click away!

Wednesday, March 10, 2010

B_CRUMBLINGFLOOR

Somehow, I stumbled upon this re-implementation of the Manic Miner / Jet Set Willy engine in Visual Basic. I'm unsure on how I should implement crumbling ground in Bilou (or any block animation in response to character's presence). Let's see how a +20 year old game handled it...

Bon, je l'avoue, je suis intrigué par la quantité d'"éléments spéciaux" présents dans un jeu aussi vieux que "Manic Miner" contient, et la difficulté que j'ai à trouver une manière convaincante de réaliser la même chose dans mon moteur de jeu actuel. Du coup, j'ai mis la main sur une ré-implémentation du jeu en Visual Basic. Voyons donc comment les blocs-qui-disparaissent-quand-on-reste-dessus ont été gérés ...

' block type constants
Private Const B_CRUMBLINGFLOOR      As Byte = 2
Block types are encoded in a separate array, with one byte per 8x8 tile. One such type is "crumbling floor". Other block types include B_AIR, B_FLOOR, B_WALL, B_CONVEYOR and B_NASTY (two of them) and B_SPARE (for switches). Jet Set Willy only has one B_NASTY type, and the other one is converted into B_SLOPE. This is consistent with my own engine.

Carles a construit son moteur de Willy de manière à réutiliser les données du jeu telles quelles -- sans être le code original sous Z80, ça donne malgré tout une bonne idée de ce qui aurait pu être fait. En l'occurence, par exemple, la structure de chaque niveau est donnée par un tableau de la taille de l'écran, indiquant quels graphismes utiliser, mais aussi le type de chaque bloc entre 0 et 7.

B_CRUMBLINGFLOOR est celui qui nous intéresse. En cherchant "crumbling" plus loin dans le code, je tombe donc sur la fonction DoWilly (extrait ci-dessous) qui gère toutes les interactions entre Willy et le monde qui l'entoure. DoConveyors ne fait qu'animer des blocs, de même que DoGuardians se contente de déplacer les monstres. Ce sont les sous-fonctions de DoWilly qui détectent les collisions et altèrent le déplacement du personnage. Exactement le genre d'approche que j'utilisais dans Calimero et Bilou en QuickBasic.

What's interesting (for me :-) in Carles' approach of redoing Willy's world is that he operates directly from the tape file of the spectrum, so not only it has the "readability" of modern BASIC (i'm not that much into Z80 assembly ^^") but it still explains the logic of the original game (how switches, witches and stuff are encoded).
If (.mode = [eWalk]) Then
  If Not (WillyCheckFeet()) Then
    ' code for falling stripped out ...
  End If
  Call WillyCheckConveyor(keys)
  Call WillyCheckCrumblingFloor
End If
The DoWilly() sub shown above proceed step by step, handling interaction of Willy with every item "present" in the game. That is, we have DoConveyors or DoGuardians as well, for sure, but they merely perform animation and movement job. WillyCheckConveyor makes sure conveyor pushes Willy. That's the real job.
Let's thus have a look at WillyCheckCrumblingFloor just below ...


Voyons donc WillyCheckCrumblingFloor dont le code est ci-dessous. Après s'être assurée qu'il y a bien un bloc friable sous les pieds de Willy, elle va utiliser FXCrumblingBlock pour procéder à l'animation (décalage du tile d'un pixel vers le bas) et transforme les propriétés du bloc donné en "B_AIR" si FXCrumblingBlock lui dit de le faire à travers la variable f.
o = .x + (.y \ 8 + 2) * 32
For c = 0 To 1
  If (m_RoomBlock(o + c) = B_CRUMBLINGFLOOR) Then
    Call FXCrumblingBlock(m_DIBBack, 8 * (.x + c), .y + 16,
                          CAPaper(m_RoomData(o + c)), f)
    Call FXCrumblingBlock(m_DIBMask, 8 * (.x + c), .y + 16,
                          I_BLACK, False)
    If (f) Then
      m_RoomBlock(o + c) = B_AIR
      Call FXRect(m_DIBBack, 8 * (.x + c), .y + 16, 8, 8,
                  CAPaper(m_BlockCA(0)))
    End If
  End If
Next
FXCrumblingBlock
will not be shown here, because it's a pretty dirty function that mixes up game logic, tile animation and rendering engine commands. What I can tell you is that everytime it is invoked, it scroll downs the data of that specific tile, and insert a "blank" line at the top. Once this is done, it scans the whole tile again and sets the "cleared" flag (variable f) to false if it found any non-blank pixel. That's precisely what triggers transformation of B_CRUMBLINGFLOOR into B_AIR.

As the tile "crumbles" exactly one pixel per frame and Willy walks one pixel per frame, it means if you simply walk on crumbling floor, it will be completely crumbled when you're done walking.


Pour moi, c'est là que le bât blesse: FXCrumbblingBlock mélange allègrement rendu vidéo, manipulation des animations et logique du jeu. Je ne la reprend donc pas ici, sachez juste qu'elle décide si oui ou non l'animation est finie en parcourant les pixels qui viennent d'être édités. Si tous les pixels sont "transparents", c'est qu'il n'y a plus du tout de sol et on peut remplacer B_CRUMBLINGBLOCK par B_AIR.

Là-dessus, je vous laisse bras-dessous: il est temps que je prépare ma pitchounette à aller rechercher ma fée à Belle Ile. Ciao.

Sunday, October 04, 2009

L'île des colons -- that was Bilou RPG

Je m'offre un petit moment de nostalgie... En cherchant "Bilou et son astro-flasheur à perforation en vrille" pour mon frère, j'ai repris une série de captures d'écran (vus sur twitter) d'un de mes plus gros projets en QuickBasic: Bilou's Quest. Un Zelda-like dont j'ai retrouvé une version sur diskette en fouillant chez mes parents il y a quelques semaines de ça. Le montage n'est pas génial: à l'époque de la sauvegarde, j'étais alors occupé à remplacer le joystick par la souris, ce qui fait que la version récupérée a besoin de la souris pour diriger Bilou et d'un gravis 4 boutons pour parler, soulever, etc. Bref, j'ai triché en démarrant les fichiers .BAS directement.

I'm taking you back 15 years ago, with a couple of screenshots i've taken this morning. Here comes the island that Bilou explores in Bilou's Quest -- one of my largest QuickBasic games. I recovered a backup on a floppy a couple of monthes ago and finally managed to make it run again ... well, sort of. I agree there isn't much to be proud about anymore: that's just a nostalgic memory, and the first occurence of Flower Power and Badman in pixels.

Du coup, je goupille comme je peux, je remplace les écrans auxquels je n'ai pas su accéder par des captures de l'intérieur des maisons et des grottes, etc. Bon, je vous le concède, en dehors de l'aspect "nostalgie", il n'y a pas grand-chose à en retirer. La maniabilité était innomable, les graphismes de Mystic Quest sous GameBoy sont bien plus réussis, le scénario manque cruellement d'inspiration, etc. Rien qui ne justifie que je cherche à en tirer une adaptation DS, quoi. Mais en son temps, c'était chouette de bosser dessus ;) Et puis, ne lui retirons pas sa valeur essentielle: c'est un projet qui a été transformé en un jeu. Compte tenu de la quantité impressionnante d'idées de jeu que "la farde PPP" contient, Bilou's Quest a tout de même le grade de "réalisation", même si ça ne couvre que 10% du scénario prévu (à la fin du niveau 1, le joueur n'a pas encore d'épée et ne peut se défendre qu'en lançant des pommes). Merci à mon frère Piet de me le rappeler.

Thursday, July 23, 2009

Calimero

Difficile de vous parler de mon expérience de la programmation de jeu sans vous parler de Calimero. Plus qu'un jeu, c'est pratiquement toute une page d'histoire en ce qui me concerne. Celà se passe au début de mes années de secondaires, donc entre 1991 et 1994.

La construction du jeu est clairement inspirée par le jeu Sonic the Hedgehog sur MasterSystem qui cartonnait à l'époque sur les écrans de la maxithèque: bumpers, pics, et bonus / powerup dans des "télévisions". La comparaison s'arrête là : j'avais dans les 13-14 ans, et bien loin du niveau de la Sonic Team ...

"Calimero against the Black Empire" is more than a game: it's almost the complete story of my early game-programming experiments, between 1991 and 1994. I was roughly 14, in a world ruled by floppy disks, my brother and I were impressed by the first episode of "Sonic the Hedgehog" on MasterSystem and so appeared our first levels featuring bonus-in-televisions. While the initial project was to realise this on C64 (see sprites below), it was my first big BASIC project on a PC ... an 8086 XT to be precise with 720x348 Hercules graphic display.

Le projet a commencé alors que je recevais à peine mon premier 8086 XT, et je m'orientais plutôt vers une réalisation sur le C64, comme en témoignent ces premiers essais de sprites millimétrés. De là aussi le look très "géométrique" des décors. Pourtant, avec l'avancée de ma lecture du langage EPbasic, c'est bel et bien sur PC que l'aventure aura lieu. Je passe donc mes grandes vacances à compter les petits carrés et à encoder tout ça en "passe 21 pixels, trace 20 pixels en blanc, à la ligne, passe 20 pixels ...".

Si je ne peux pas vous donner une historique plus exacte, c'est qu'avec un disque dur de tout juste 20 MB, toute l'évolution du projet s'est déroulé sur diskettes 5'1/4 un peu dures à relire aujourd'hui ... Et avec un PC qui ne retient pas la date, ... Quelques versions diskettes seront refilées à mes copains de classe programmeurs Julien Collaer et Cédric Dupont.

My brother drew the level for 4 worlds -- namely fire, water, pyramids and pipes -- that Calimero the black chick will travel to save his sweetheart Priscilla from the clutches of the Evil Black Empire. Okay, admittely, nothing impressive in that scenario by today's standards, but keep in mind that this was the scenario of virtually *any* platformer by then. Calimero's favourite sentence "That's too much unfair" is really the corner stone of my brother's level design: you'll have to jump into that fake lava river to find the level exit. Don't rush to the obvious exit, which is fake and will just make spikes appear all over the place that will kill you. Even with the cutest graphics, with such levels, it would be hopeless to work on Calimero on DS...

La première version qui voit le jour pour PC avec carte monochrome Hercules à la résolution improbable de 720x348 dans le "niveau du feu". Mon frangin (Cyborg Jeff, uniquement connu en tant que "Piet" à ce moment-là) qui était déjà mon scénariste pour la bande dessinée, me fournit un scénario en béton (la belle priscilla enlevée par l'Empire Noir) et des niveaux dans 4 mondes originaux (le feu, l'eau, les pyramides et les tuyaux)... On s'en plaint maintenant dans Super Princess Peach, mais à l'époque, c'était plutôt bien vu.

Non, le vrai problème avec ces niveaux, c'est l'influence de Rick Dangerous. Des "picots invisibles", un faux drapeau (fausse sortie du niveau), et quasi systématiquement la fin se trouve derrière une fausse mare de lave, etc. C'est une des raisons pour lesquelles il n'y aura jamais de portage de Calimero sur DS, même si je faisais quelque-chose d'aussi réussi graphiquement que le mockup de 'New Zealand Story' par Kenneth Fejer.

I don't precisely realise those flaws by that time, and I will spend much of my leisure time to precisely draw every screen on a large sheet of paper, with a 1mm=2px scale, before the level is translated into LINE(xo,yo)-(xd,yd) and PAINT(xc,yc) statements. The coordinates of every bonus and hazard hitbox are scribbled with a coloured microball pencil ... I had only access to the computer three days a week, and only for one hour (parental rules :P), so such preparation were a must. Programming sessions, however, often consist of repeatedly asking the screen to be repainted as being one pixel off could make a PAINt command to overflow and fill the whole screen >_<. A missed "screen exit detection" -- a request to paint a sprite out of the screen -- will interrupt the execution with an infamous error message from the BASIC : more "IF XX < ... THEN GOTO ..." is needed :P

Et pourtant, je persiste. A grand coup de feuilles de listing sur lesquelles je prépare minutieusement les commandes "line" et "paint" du BASIC à l'échelle qui définiront chaque écran, des tests pour chaque bonus et pour chaque zone mortelle. Si ça permet une certaine liberté, c'est long. Terriblement long à mettre au point (un seul pixel de loupé et la commande "paint" recouvre tout l'écran >_<). Je suis toujours dessus en septembre '93 quand mon frère rencontre Pierrick et commence à envisager une version en couleur sur ... Amstrad CPC. Le projet ne commencera jamais, mais jettera les base de Bilou. A Pâques 1994, je migre vers un 386 avec VGA et carte son. Et là, horreur : le mode d'écran "SCREEN 3" que j'utilisais jusque là n'est plus valable. Il faut tout repasser en 640x480, mais je gagne quelques couleurs au change. Je vais même aller jusqu'à programmer enfin le premier boss avec l'aide de Pierrick, reportant méticuleusement le dragon dessiné en Deluxe Paint via des pages entières de feuilles quadrillées (genre 'point-de-croix' pour ceux qui connaissent) des zones importantes, que je réencode en BASIC. Sans services du genre "wotsit", l'utilisation des .pcx est à cette époque réservée à ceux qui ont pu s'offrir "graphic gems" ou un bouquin du genre.

When I purchase a VGA graphic card and a Master Boomer sound card for my 386 in easter '94, I realise in terror that the 720x384 mode is Hercule-specific and no longer supported. The whole game has to be updated -- but by the same time, colours can be added. With some help from Pierrick, Calimero will at least fight against his first boss -- a dragon drawn with Deluxe Paint and hand-transcoded with several 20x20 tiles on A4 draft, squared sheets: there was no WOTSIT service by that time to help me understand how to process PCX or LBM file format, and definitely no function library to do the job for me. In its ultimate shape, Calimero will have a 10sec music sample looping during the boss fight and a "cinematic" conclusion where lava is replaced by water, flowers grow and blue bunnies frolic all over the scene on a speaker-rendered "merry melodies" theme.

J'irai même jusqu'à programmer une petite "cinématique" de fin de monde, réutilisant les lapins servant de NPC dans "Bilou RPG" (que je mêne en parallèle) et la goutte d'eau qui sert de pièce d'or dans Keen IV et faire un happy end sur la musique du final "Merry Melodies" des cartoon de mon enfance.


Alors que Juin '94 arrive, le projet s'essoufle. C'est définitivement trop exigeant pour un gameplay qui lasse. Pour pouvoir jouer la musique de Pierrick pendant le boss (en fait, une interprétation du thème de Terminator sur le synthé de mon frère), j'ai "acquis" le QuickBasic 4.5, étudié attentivement l'aide qui m'ouvre de nouvelles perspectives : le stockage de sprites "en natif", la manipulation de fichiers, et surtout la programmation structurée, enfin libérée de la numérotation des lignes. De nouveau, c'est surtout "Bilou RPG" qui en bénéficiera, Calimero ne servant que d'explorateur hasardeux pour ces techniques.

As I get more comfortable with 256 color screen mode and find ways to go beyond a simple "XOR" display, the project is left aside as I turn towards the Bilou RPG project using recently developped sprite editors. Calimero will remain forgotten until June '95 where my bored brother will use Recreational Software Design Game-Maker to revive the first twp levels. The hope to see the water, pyramid and pipes zone didn't last very long, however, as G-M hardly support most of the gameplay features (secret passages, bumpers, and switch between gravity-affected player and helicopter power-up in the same level).

Ce n'est qu'en juin '95 que mon frère, armé cette fois du GameMaker de Recreational Software Design et des graphismes (très inspiré de Sonic, il faut le dire) de mon "Panzer III", nous gratifiera d'un "calimero 2". Je suis sûr qu'il avait prévu de faire (enfin) une réalisation des niveaux de l'eau, pyramide et du monde des tuyaux, mais même le premier boss passera sous silence. Les passages secrets, les bumpers et l'hélicoptère, ce n'était vraiment pas pour le GameMaker, rien à faire.


Maintenant, éteignez votre ordinateur et allez vous coucher

Wednesday, June 24, 2009

Je vous parle d'un temps que les moins de 20 ans...

Bien avant Internet, du temps où les diskettes étaient molles et que les écrans étaient le plus souvent monochrome, je programmais déjà. Petit retour sur la version "BASIC" de Bilou en image, stimulé par le fait que j'ai utilisé la "distribution" de Bilou pour QEMU comme .torrent de test dans les TPs de mes étudiants (pas de téléchargement proposé, parce que je me suis rendu compte que certains paramètres y étaient encore incorrects :P)

There was a time were the network wasn't interconnected yet and had to travel the real world enclosed in sectors of floppy disks that were actually floppy. Screens had usually no colors but I was already coding. Here are a few shots of those coding sessions, with the BASIC version of Bilou's adventure.

Tout d'abord, construire le niveau lui-même. A grand coup de "Data" qui sont lues séquentiellement à partir d'un autre point du programme. Une sorte "d'Embedded File System" avec ses avantages et ses inconvénients, l'inconvénient majeur étant sans doute l'impossibilité de construire son niveau autrement qu'au clavier.

Vous reconnaissez la scène dont la capture d'écran est sur ce blog depuis des mois ?

Venait ensuite la 'routine de gestion de l'écran', quelque-part au coeur d'une énorme boucle du genre:

  • lire les DATA et les afficher
  • select CASE ecran
  • ajuster la position de Bilou et boucler

A level was built out of 'DATA' lines that encoded pixels or tile arrangement for a room. But that wasn't quite enough. Over the background layer, I had small chunk of code that placed interactive graphics, and a loop that animated every object on the room, tested for collisions with bonuses, bumpers, etc. and "doors" area towards the next screen. Yes, every room with its own game loop. Never do that again, kids.

Cette "routine" va dessiner tout ce qui n'est pas décor (ennemis, bonus, dégradés, etc) avant de traiter en boucle le comportement de ces objets avec des sous-routines (ouf. Il y en a quand-même) genre "move" pour Bilou, "pomme" pour tester si bilou touche une pomme, "gold" pour tester s'il touche une pièce d'or, etc. Vous avez vu cet horrible hack ? répéter n fois ce qui ne dépend que de Bilou avant de passer au test de timer histoire que Bilou puisse effectivement se déplacer plus vite que le petit ver. On a échappé au 'FOR I = 1 TO 1000 : NEXT', ceci dit.
Des choses aussi élémentaires que "suis-je mort" ou "faut-il passer à l'écran suivant" devaient être répétées pour chaque écran. Wéééééé. :P

Allez, un autre petit écran. Je me suis demandé en reparcourant le code "mais enfin, pourquoi diable ce "if ... then mort". Bin parce que sinon, Bilou pouvait se promener allègrement dans les pics dessinés un peu plus haut. J'aurais pu trouver autre-chose... une couleur mortelle, par exemple.

Au passage, il n'y avait plus de sprites dans le QuickBasic (pas plus qu'en EP-BASIC). Tout fonctionnait par copier-coller entre l'écran et des variables tableau (ce que les amigaistes appelaient sans doute le "blitting", mais qui en l'occurence était du PUT et GET. Concept farfelu, ces "copies" pouvaient faire appel à un opérateur booléen pour combiner les pixels existant et ceux du buffer. Je suis parti de jeux monochrome où j'effaçais le personnage du fond noir en le "XOR"ant avec lui-même pour finir par utiliser un système de masque en deux passes (AND/OR). En l'occurence, dans ce jeu-ci, j'avais droit à 15 couleurs de fond (respectant le pattern xxxx1111) et 15 couleurs de sprites (0000yyyy) de sorte qu'un "AND" bit-à-bit entre un sprite et le fond affichait le sprite, et une couleur automatiquement transparente (255). De tous mes hacks, je crois que ça reste le plus tordu. Toute tentative de programmer sa propre routine d'affichage en BASIC étant évidemment inimaginable, car d'une lenteur affligeante.

Figurez-vous que même les tests étaient lents. Je veux dire les "if-then-else" Du coup, j'essayais dans mes routines de comportement (appelées plusieurs dizaines de fois par seconde quand tout allait bien) d'en utiliser le moins possible. En témoigne ce genre d'expression optimisée -- surréaliste aujourd'hui -- qui utilisait le signe de la différence de position pour ajuster la vitesse du "Bubble Bat". Il m'en reste encore des séquelles aujourd'hui (cf. Coding Funky Funghi).