Wednesday, April 23, 2025

appleman 2.0.1

 

A little bit of work on the Appleman last week-end (at last, you could add and I wouldn't blame you). I've got the "shocked" animation revised, added "carried" animations and gathered infos about where these are in green.spr.

I'll still need to see why there is no "bounce" when it is shocked (reason: it's just using stopper and the animation is supposed to do the job) and patch the greent.cmd level script on the SD card of DarkneSs, because it still show the appleman with big purple punches instead of feet. (appleman.cmd must be correct, since level 2 doesn't seem to have any similar issue).

So let's add tonight "undead feet" animations, check a "do not loop stunned animation" that must be over 1 year old in my notebook. I've got another notebook where I've written down blador's behaviour ... let's merge that into appleman's script and we'll cleanup the resulting code mess once the home mess is tidied up.

Saturday, April 19, 2025

I want to try your editors so much!

How could I resist to such a quote ?

Adeline Venture (hehe) in Shadow Of The Temple The puzzle platformer I really, really want to make some day.

I want to try your editors so much! But in order to finish, I will have to do it in an engine I already know well. Probably construct3 -- CastPixel

It made me want to pack a set of my dsgametools with contents of Castpixel's mockup pre-digested into a .spr file so that she could directly toy with the level editor ... perhaps also convert the tutogit scripts so that she'd get something playable!

So first thing to know is that SEDS works with 16x16 blocks. There is a perl script that can convert the mock-up into tiles but if used directly, it will be a complete mess as game assets.

  1. ensure things are aligned on the 16x16 grid as much as possible. That means the ladder half-way over pillar must be shifted. A few other things needs similar shifting on the mockup.
  2. SEDS shows you 64-pixels slices at once. The scripts *can* handle wider pictures, but at the moment, they'll scan e.g. first row of 256x16 pixels and output 4 64x16 rows in the first page, then another 4x64x16 chunk etc. The result is barely usable, again, because many objects bigger than 16x16 will be de-aligned and will need to be re-aligned in the DS editor.
  3. So instead, you may want to turn the mockup into a 64x* image where things are where you want. Todo: imlib2spr.pl should be able to scan the image in 64px-wide columns itself, so that this step becomes useless and the mockup remains readable.
  4. The script may remove the background color, but when it does so, it also deletes fully background blocks from the output file. This is nice to avoid redundant data, but again, it screws up alignment on such a mockup. You can scribble something on those blocks or you may turn off the background color by giving another one with --bgcolor=ff00ff. Todo: have the imlib2spr.pl tool inject empty slots on the sprite page when it encounters such full-background blocks, to preserve alignment
  5. B u t if I use --bgcolor=some-color, the tool will inject a fully-transparent block as block 0. This is required for proper operation of the game engine and the level editor, but this is useless on the sprite pages. And worse, having block 0 editable led to corrupted files in the past. todo: patch the tool so that the empty block is never used by the generated pages (and never allocated by the editor :P)

With all that taken into account, with a 64x* png file with the content of the mockup aligned on a 16x16 grid as often as possible, conversion is performed with 

SpriteEditor/bin/imlib2spr.pl cast-a-venture2.png venture.spr --nomap --nopack --blocksize=16

And the reverse operation to see how things went is

SpriteEditor/bin/spr2png.pl venture.spr /tmp/venture.png && display /tmp/venture.png

Once that looks fine, copy the venture.spr file on your SD card in the /moving/ directory, make sure you have SpriteEditor for DS at the root of your SD card and launch it.

  • once launched, press START to enter the FILE screen
  • click the |/_/ browse button to show the contents of /moving/
  • if venture.spr doesn't show up, hold L trigger and touch the "UV" button on the alphapad to filter the list of files. (holding L lets you enter the second letter of each "button").
  • touch the "venture.spr" name to load the file, then press START again to return to the edition grid.

 

Wednesday, April 16, 2025

climbing ... manuscript notes.

Quelques notes qui datent de février 2013 et qui refont surface pendant les habituelles chasses de paperasse de début juillet: comment s'y prendre pour que Bilou puisse se balancer aux signets de la school zone.

J'y note la recommandation que les morceaux de signets soient passifs dans la collision et un peu de math pour déterminer si une zone de collision classique croise ou non une "ligne" de collision, qui conviendrait mieux pour les cordes qui pendouillent.

Par contre, je ne sais pas trop dire si j'avais prévu que le signet soit fait d'un seul Gob avec une zone de collision pour chaque élément ou de plusieurs gobs ... la pages avec les lapins vont plutôt dans le sens "un seul gob", chose que le moteur "Dreamland" ne saura pas encore gérer, je dirais.

On y trouve un

state% : 3D.% {
  using RopeController;
  segment [*] F_ROPE;
}

pour un nouveau type d'objet basé uniquement sur du rendu 3D. Le fait qu'on indique des collision pour chaque segment renforce l'hypothèse d'un seul GOB composite d'un nouveau genre. On lit d'ailleurs, sur la première page

foreach (@segments):
   if (b.ymin > s.ymax || b.ymax < s.ymin) continue;
   if (s.dx * s.dy >= 0) {
     // depending on the rope's direction, there's 2 corners of the bbox to check
   } else {
     // test the other two, I presume :P
   }
   

Et une observation que "bah, peut-être qu'une verticale plutôt qu'une ligne oblique, ça ne gènerait pas tant que ça dans la plupart des cas. 

Bref: c'est confus, même pour moi, mais je veux l'avoir sous la main dans le même tag que les autres

Hi English readers. These are manuscript notes from about 12 years ago, when I first tried to figure how to deal with swinging bookmarks that you could catch and climb to. They're a bit confused and I'm unsure even I understand what's being said there. But I've got bookmarks and climbing goal revived for Bilou's Dreamland, so I'd rather have these notes around when I'll think about it. The code snippets I typed above suggests that bookmarks were intended to be a new type of segmented 3D object, which has been dismissed for the Dreamland engine

Tuesday, April 15, 2025

gravity.flow ?

Je voulais faire tout autre chose, mais au moment de prendre le code en main, je me rends compte que j'ai une série de modifications qui n'ont pas encore eu droit à leur commit ... et que je ne sais plus trop à quoi elles correspondent.

Il s'agissait en réalité de deux modifications liées à l'eau: animer la surface (nager si bien avec un miroir en guise de surface, c'est un peu dommage ...) et faire en sorte qu'on puisse placer un jet d'eau dans une grotte. Parce que vous ne ça n'aura pas manqué de vous faire tiquer: il y a une sorte de rectangle moche au pied du geyser sur l'image ci-contre/dessus. C'est lié au fait que le geyser (tout comme la cascade) est obtenu en par une combinaison des deux couches de décor: l'une avec une animation de type "palette cycling" et l'autre avec une animation conventionnelle. Et donc pour mettre le geyser dans une grotte, il me faut deux nouveaux blocs "décor de geyser fusionné avec le décor de grotte".

After a fairly busy week and significantly busy Saturday, I wanted to try updating the Appleman behaviour, but I found my homebrew directory with different files uncommitted and changes involving binary files like maps. So I started by running the current code first on the emulator, and visit those maps to see whether there were any changes. And oh, of course. First change was animating the water line (see the mastodon video below). Second was an extra water jet in the second green map.

Quand je dis "je ne sais plus à quoi elles correspondent" (y compris une modification du code qui assure le palette cycling), comprenez "il a fallu que je fasse tourner le .nds pour m'en souvenir". Ce qui m'a donné envie d'en faire des petites captures (un jour après le ScreenshotSaturday ... pas de chance ^^"), et sur une de ces captures, on remarquait quand-même fort que le haut du geyser reste en permanence au même emplacement. Moi, j'aimerais qu'il monte et qu'il descende, pour ajouter un peu de dynamisme à la scène, et appeler à l'interaction.

See on that level editor, waterfalls and geysers are made of two layers of tiles combined. But that means you can't put a geyser over a dirt wall unless you've got tiles showing that in first place. Plus I'm using another palette slot for the dirt wall than the default one, meaning the cycling code had to be updated. That was ready for some screen-shotting

J'aurais peut-être pu utiliser le contrôleur "grid" de furblock, mais tôt ou tard, il faudra aussi que Bilou soit propulsé vers le haut par le geyser. Plan B: utiliser le même mécanisme de "flow" dans le contrôleur gravity que celui codé pour swim. Je profite donc que tout le setup wifi est là pour modifier le niveau et je définis un nouveau type de tile (les ^ mauves). ça donne des résultats rigolos avec Bilou, mais en réalité, ça ne marche pas: Bilou est bien ralenti quand il arrive dans le haut du geyser, il peut même remonter légèrement, mais au final, la gravité lui donne une vitesse suffisamment élevée (on peut aller jusqu'à 6px/frame) pour qu'il redescende, puisque le geyser le fait monter à une vitesse constante de 2px/frame. Bref, c'est bien pour des tapis roulants mais pas pour des geysers.

But then, the top of the geyser was very static ... I want it to wave up and down a bit. There are different ways I could do that in my engine, but only a few where not only the geyser top but also Bilou is lifted up when in contact with the stream. That implies a mechanism similar to the water flow designed last year, except this new special physics tile will define a property for the gravity controller instead. It will still be an "AIR" tile, though: we can fall through geyser, not swim them. (I hope to avoid nasty corner cases that way).

Unfortunately it didn't work the way I wanted. Lifting Bilou by 2 pixels (cyan lines on the diff) is fine as long as the vertical speed is lower than 2 pixels/frame downwards. It gives a nice boost when jumping and catches you when you're "stomping" the geyser, but while you're being stopped, your intended velocity keeps increasing, and at some point, you'll be fast enough to reach the ground again. Exactly as you start sprinting backwards on a conveyor belt.

So I ended up using the yellow code instead: directly change the polarity of the gravity based on the sign of the terminal velocity stored as a per-tile-type property. Not perfect, but close enough for now.

Mais en fait, il n'y a pas tant à changer que ça: plutôt que de déplacer Bilou, on va utiliser l'information stockée pour contraindre la vitesse maximale ... et tant qu'à faire, inverser la poussée si la vitesse maximale est négative. J'ai pris des vitesse identiques pour la gravité et le jet d'eau pour le "petit nuage" en haut du geyser, ce qui lui donne un mouvement symétrique alors que pour Bilou, la gravité lui permet d'acquérir une vitesse jusqu'à 3 fois plus grande, et il a donc tendance à s'enfoncer plus dans le jet d'eau. ça suffira pour le premier jet ;-)

edit: valeur maximale -2px/frame validée: il suffit de garder le bouton de saut enfoncé pour décoller bien au-dessus du geyser. Et si on tombe du sommet, on ne redescend pas trop bas.
 

Post by @PypeBros@mastodon.social
View on Mastodon

Saturday, April 12, 2025

Gamebrew / platformers

Somebody on gbatemp surprised me back in 2016 claiming (about School Rush)

HOLY CRAP! I'm surprised to see an actual game here, because usually most DS Homebrew is just shitty abandoned tech demos. Nice job on this! I'll check it out soon.

I dug that one again not so lately after School Rush finally got its Gamebrew Wiki entry and it felt hard to believe given the 1394 other entries the wiki has just for NDS games. There had been some unfinished titles for sure that had just enough contents to rank fairly in seasonly "coding" competitions, but there had also been brilliant titles. It was just after I ran into some "7 best DS games" that would only mention a few FPS and then non-game homebrews... I can't review all 1394 games, but I sure could give the "platformers" category a spin

"Sonic, the game" defines quite well the first category: graphics ripped from various 2D titles in Mario and Sonic series, unfinished physics and uninspired level design and no sound whatsoever. At least it demonstrates scrolling in large levels with parallax effect for the background layer.

Monky. One-screen collect-and-progress game. You'll have to backtrack if you missed some letters on the way. You'll lose all the collected bananas if you get hit. 1 monster type, 4 levels (as far as I can tell). (Unrelated) background music featuring a mod player and a few sound effects.
A nice tech demo using PaLib and graphics ripped from DK Jungle climb GBA game, but not very inspired as far as game and level design goes.

I did not pass level 1 on first play. I missed a key gamedesign element: as you keep moving forward, you'll enter a sort of "run state" where you jump higher. There seems to be 4 worlds of 5 levels each ... that would be worth playing more before rating the quality of level design. You've got sound and music, but if you've played some pinball titles on the Amiga, you'll immediately recognize the style and honestly, it doesn't quite fit the coconut plains of the first levels. 

Temple Topple could have been featured in our "Biloutris" project, I guess. Block falls, they disappear if they line up, but you can't move them (at least, I don't think so). You do have to avoid getting crushed, though. Don't expect much variety as you play. None of the little things that can make such a "climbing" game really funny.

Starting a game has a significant chance of being unfair. Once you're one or 2 screens away from the bottom, there's little chance of getting crushed, and in between, there's a good chance you'll have to wait for the next jump option to show up. I gave up around 1300 pixels high, out of boredom. I would bet on looped WAV/MP3 sample for the background music. It might have been the author's hands-on title for DS Game Maker...

I tried Epic Caveman, too, and understood why the wiki entry only lists the title screen. The title is an endless runner, somehow akin to the "running zilla" game offered when a chrome browser cannot connect to the internet. But here obstacle are quite large, right form the start, requiring very precise timing to clear the jump over them. You can't jump "on" them either, which doesn't seem to make sense in this context. An there will be sudden speed up, requiring you to adjust the tediously learnt timing on the fly. Not even between series of blocks but *within* a series.

There's some sound but nothing really impressive. I'd put it in the category "mini-game of an afternoon, to check you've understood how to use assert import and can structure your project with different screens around the main game screen. Good for a programming tutorial if you had the source, but hardly interesting as a game, although - unlike "sonic the game" - there is coherency and care to detail here.

edit: okay, this is what "sonic the game looks like. and you don't see the fact that if you nearly land on a "platform", it will push you backwards so you can safely fall down instead of remaining balancing on a few pixels. That reminds me why the real sonic has *two* vertical sensors, and not just one. 

(yeah, I hesitated to dedicate 280KiB of blog storage to show that, and I certainly didn't want it to become the post's thumb picture)
 

Sunday, April 06, 2025

Ressortir la supercard ?

Rédiger ce post à propos de Kirby and the Amazing Mirror, ça m'a de nouveau donné envie d'y rejouer évidemment. Et pourquoi pas sur SuperCard, au fait ? après tout, ça a plutôt bien marché pour Goodboy Galaxy et le jeu "Professor Sinister" de Simian Zombie il y a quelques années ? Et pour pas mal de titres dont Prehistorik Man avant que je ne me lance dans le développement NDS (et que je n'achète mes premiers jeux NintendoDS) ...

Mais à l'époque, j'avais un vieux Windows en plus de mon système Linux, et je pouvais y faire tourner le patcheur de ROM du constructeur (Supercard, donc). Pendant des années, plus moyen de convertir des ROMs et donc plus moyen de jouer à des jeux officiels à travers mon linker GBA. Mais en creusant hier, je note qu'il y a finalement une version open-source tournant sous systèmes UNIX du patcheur en question!

Voilà près de 20 ans que j'essaie de le trouver en boutique de seconde main et qu'on me répond "ah, très bon jeu, mais on ne le voit presque jamais ici" ... donc je tente...

Une fois patchée, la ROM tourne bel et bien ... j'ai omis d'ajouter le patch permettant de relayer les sauvegardes, donc si la cartouche est laissée hors-tension un peu trop longtemps, elle perd la partie en cours. Plutôt gênant pour ce jeu précis. Plus problématique encore, le jeu souffre de ralentissement. Je suis tombé sur un article qui explique assez bien le problème: dans la supercard il y a une RAM à la place de la ROM des cartouches classique, qui fait le "tampon" entre la console et la flash (il faut compter pas loin d'une minute pour charger le jeu depuis la flash) mais elle n'est pas aussi rapide que les meilleures ROM gba. Pour compenser, le patcheur va forcer le CPU à attendre le nombre maximum de cycles d'horloge à chaque lecture sur la cartouche. Et ça, avec Kirby, ça se traduit par des chutes à 30 fps trop souvent. Le jeu n'a évidemment pas été conçu pour ça et l'action est donc ralentie plutôt que saccadée.

On se dirait bien que "bah, ça laise quand-même la possibilité de faire du pixelstudy" ... sur DS peut-être. Sur l'écran de la Gameboy Advance SP que j'ai utilisé, franchement, ... c'est trop petit ^^"

 

Saturday, April 05, 2025

#20games part 4

Okay, I've covered all the games that had influenced me before I started working on Bilou ... I've covered those who influenced me while I was working on the BASIC edition. Now let's see those games who have influenced me reviving the project: those at the roots of the NDS revival.

The first of them all has to be Pixel's Cave Story ... The game that opened my eyes showing me that, yes, a single person could be crafting a whole game (not a mere 3-levels demo) that feels and plays like a game with original contents. All you need to do is stay modest on the technical side (2D, no realistic shading, SNES-like physics) and artistic side (pixel art, tracked music, possibly even chiptune).

Not only I could make it, but there was a huge community enjoying and creating around it.

On a fait le tour des jeux qui ont influencé la conception de Bilou et ceux qui ont eu un impact sur le développement de la version BASIC. Attaquons-nous à ceux qui sont à l'origine de son reboot. 

Heureusement que je l'avais bloggé, parce que sans ça, je n'aurais jamais retrouvé que la découverte de Cave Story s'était faite à un moment ou je trempais déjà dans le développement NDS, mais encore rien de décisif. Juste quelques éditeurs. Mais de découvrir qu'un gars écrivant tout seul un petit jeu "comme il aurait voulu pouvoir y jouer étant jeune" est parvenu à créer un phénomène mondialement reconnu en travaillant dessus 5 ans ... juste à condition de travailler à la frontière de sa zone de confiance ... ça fait réfléchir. Et le mois d'après, je suis tout à coup occupé à parler de BilouDS ...

But before I discovered Cave Story, I was playing Kirby's Amazing Mirror, and that sure had an impact on how I approached larger game, with suspended power-ups that could use to unlock secret paths later on. Okay, Kirby's Dreamland had an impact back in '93, although limited since Bilou's formula had been defined when I got my hand on the game. But as far as game design was concerned, K:AM will remain my personal reference possibly forever. How you use treasures to unlock new moves for your abilities ... how a few locations are revisited to find routes to new areas ... it is almost impressive that it features Kirby at all, given how deep the adventure is. And it works so much better than Megaman approach of a complex world ...

Like Rayman did, Kirby has also a "negative" influence, in that Bilou must remain distinct from Kirby. Does Kirby wear hats when he changes power ? well, Bilou will have to do something else.

Mais le jeu qui avait captivé mon attention juste avant que je ne me lance dans le développement DS, c'était Kirby and the Amazing Mirror ... la perle introuvable. Je serais curieux de mettre la main sur une map de l'ensemble des "routes" possibles dans le jeu tellement j'ai tourné dans ce labyrinthe des miroirs, à tenter de conserver un des power-ups suffisament longtemps pour pouvoir débloquer les chemins que je n'avais pas encore exploré. C'est de là que vient l'approche actuelle des power-ups pour Bilou, même si le fait de jouer à Megaman X m'avait donné la conviction que l'idée "un bouton pour passer d'un pouvoir à l'autre, des jauges d'énergies à remplir pour s'en servir" ne marcherait pas terriblement.

A l'opposé de Cave Story, on pourrait trouver Shantae: Risky's Revenge sur DSi. Le jeu qui rassemble des talents comme Henk Nieborg dont le pixel art me sidère depuis Lomaxx et Virt dont la musique me scotche depuis bzam/zzap : '01. Le jeu est sorti en 2010, le travail sur Bilou a déjà pas mal avancé ... Mais les éléments de décor sont énorme, le jeu se permet du multi-plan avec pré-visualisation de ce qui nous attend pour la suite, un panel d'objet complémentaire qui n'a rien à envier à un R-Type ... le moteur de jeu a certainement besoin de ruses de demoscèneur pour animer tout ça et gérer les va-et-vient dans la mémoire vidéo. Une référence, certes, mais une référence inateignable. Une étoile polaire plus qu'un phare d'Alexandrie ^^"

One last key game from that period was Shantae: Risky's Revenge. The game I wanted to have because it was the work of talented artist I'd been admiring for over a decade. Even more than the first Rayman, it is a game I have no way to immitate. The level of detail in the graphics, the quality of the animation, the soundtrack, the technical level of the programming, with that multi-plane platforming where you hop into the background and back to find your way out of a maze... I know if I want to have a game finished some day, that implies accepting that it will not beat Shantae. And to some extent, it isn't an issue: you don't need your game to beat another one as long as it is interesting in itself.

Thursday, March 27, 2025

#20games part 3

Rick Dangerous has its own tag on this blog. This is a clear indication of a influential game. It's not so strong on Bilou's adventure (apart for a spikes at the bottom of pits), but it was Rick that pushed us into making our own platformers, even before Sonic and way before Mario. Its influence was still strong in Calimero, although the impact of Sonic was equally strong on that one. But I never end up telling myself "oh I know, I'll make a Sonic-like" when I need to do something with a "new" character. And I never tell myself "oh, I know: I'll bring Sonic as a cameo playable character". That's for Rick only.

Il reste quelques jeux parmi ceux-qui-m'ont-influencés qui datent d'avant le premier jeu Bilou-en-plate-forme, je pense que ça vaut la peine de les rassembler, même si à ce stade-là du challenge des 20 jeux, ils se retrouvent éparpillés sur les 12 jours restants. Commençons par Rick Dangerous, le jeu qui aura détrôné Sonic (Master System) de cette collection. Parce que si Calimero est construit sur un mélange des deux jeux, très rapidement (sic), c'est le côté Dangerous qui l'emporte dans le gameplay. Et quand je commence à avoir quelques petits sprites prêts sur NDS, à quoi je pense comme moule-de-jeu ? Rick Dangerous. Et quand mon frangin ressort l'idée d'utiliser son personnage "Spector" pour participer au C64 challenge, qu'est-ce qu'on propose ? Rick Dangerous. Et qui mettrait-on bien comme personnage "un peu plus stylé" dans un remake NDS de pharaoh's curse ? Encore Rick Dangerous. Même "Nono in the Maya Zone", n'est qu'un Rick Dangerous déguisé sans Rick.

Passons. Bubsy, c'est un de ces jeux dont on a pas raté la sortie. '94, on était au taquet, de retour devant la télé tous les samedis pour écouter Maniac et Sam Touzami nous parler des dernières nouveautés et nous présenter des trucs et astuces sur les jeux qui avaient déjà quelques mois. Bubsy en a fait partie, et même si on y aura pas joué dès le départ, le côté cartoon/potache de son animation se retrouvera intégrée dans la proposition de Bilou pour le concours de jeu... et qui deviendra un de ses traits de caractère jusque dans les "on the road" de la BD. C'est aussi un des jeux dont la musique ne me quitte pas, ce qui est un autre signe distinctif de jeu qui a eu de l'impact.

Comparatively, it may be surprising to see Bubsy in the list, but it came out precisely when we were brainstorming what the exact formula of Bilou's Adventure should be. New zones ... new super-powers ... new mechanics ... Unlike me, my brother wanted something combining the most original ideas of the era (like Rolo the Rescue map pieces), and Bubsy's animations were certainly novel by the time. More personnally, I keep getting a smile when some Bubsy tune pops up in my playlist. I cannot say the same for Sonic ^^".

Think about it that way: before Bubsy, Bilou was a mere next-game character. After Bubsy, I started practicing little cartoony animations where Bilou would end up stunned/splatted/electroshocked ... 

Donkey Kong Country, j'étais sur le point de commencer l'aventure RSD Game-Maker quand il est sorti ... C'est sans aucun doute une de mes référence en gameplay (et qui a son tag), même si je n'ai jamais envisagé la possibilité de faire un jeu qui y ressemble. Quelque soit l'élément considéré (type de graphisme, d'animation, dimension des niveau ou leur organisation), ce n'est pas quelque chose que je peux tenter en solo. Pensez ... 4 types de "Yoshi" différents ? C'est tout simplement hors d'atteinte. Pourtant ... pourtant quand viendra le moment de reprendre le design en main pour la DS, il reviendra régulièrement à l'avant de mes pensées parce que trouver des secrets dans ce premier DK, c'est à peu près aussi chouette que dans Prehistorik ...

Le plus délicat,ça aura été de choisir entre DKC et DKC2 ... mais malgré ses perles musicales et le monde caché qui manquait cruellement à DKC, il y a trop d'endroits de DKC2 que je n'ai pas envie de visiter, en particulier en début de partie, si bien que je me retrouve rarement à me dire "oh tiens, je me ferais bien un DKC2"

Donkey Kong Country was one of the key games in my life, but it is also the first key game I knew I couldn't ever mimmic. It's super-ambitious to believe I could craft something comparable to Super Mario World or Bubsy, even as a life-lasting project. But DKC is just out of reach as a solo developer. I don't think I've ever envisioned doing it. I'll only make a few observation regarding gameplay, and try to identify what is fun when hunting for secrets in the DKC series ... but that's it.

Surprisingly, though, Rayman became the ultimate game model for Bilou. With epic boss fights, gathering powers as you progress in the adventure, revisiting levels with powers you've just earned to unlock more secrets. It was also the proof that my idea for animating limbless characters could actually work although it was still very crudely done in the prototype I had when Rayman appeared on the shelves. Many people will compare Bilou to Rayman even nowadays (especially when seeing the School Zone), yet Rayman pushed me to avoid or even remove things more than include them, to ensure that Bilou would remain sufficiently distinct. In August '95, Bilou.bas could let you throw your fist if you had the "turtle power" (iirc). It would never be reused again...

Et pour clôturer, il y a Rayman ... le jeu auquel les aventures de Bilou sont le plus souvent comparées. ça me fait plaisir, puisque c'est un de mes jeux préférés, et en même temps, je ne découvre le jeu que 2 ans après le début du travail sur Bilou, quand à peu près toute la phase de "pré-production" de mon frangin a eu lieu et qu'il n'y a plus "qu'à pixeliser et coder tout ça". Rayman, c'est le jeu qui va définir ce que Bilou ne doit pas (ou plus) faire. Ne pas aller dans une zone des instruments ... ne pas faire des champignons qui marchent ... ne pas lancer son poing (pourtant c'était déjà codé). Ce sera le prix à payer pour garder une identité propre.

/boot/grub/oops.cfg

Une petite manip' de travers et je me suis retrouvé avec une machine multiboot automatisée qui ne bootait plus du tout. just un "grub2>" tout seul ... en général, je finis par retomber sur mes pattes dans ce genre de situation, mais cette fois-ci, même un simple "help" virait au "help.mod not found" ... Eh oui, il a bien changé, le monde des secteurs boots... le bootloader est un fichier comme un autre dans le répertoire /EFI d'un disque particulier. il charge des annexes venant d'autres fichiers comme les autres, et il peut aller les prendre avec l'un ou l'autre système de fichiers ...

Parce que oui, au moment d'utiliser la commande grub2-install --efi-directory=/boot/efi --boot-directory=/where/you/want/it/to/be ..., l'outil d'installation va regarder quel type de fichier est utilisé par le boot-directory et placer un grub.efi intégrant xfs ou fat ou (pourquoi pas) reiserfs ... 

Bonne nouvelle, par contre, les modules permettant d'accéder aux différents systèmes de fichiers sont tout de même disponibles, et la commande search --no-floppy --fs-uuid --set=VARNAME UUID_GOES_HERE marche toujours. Mais je tournais en rond jusqu'à ce que je note un set prefix=(hd0,gpt5)/boot/grub2 ... j'essaie quelques autres gpt (la table de partition, pas le chat) pour finalement tomber sur celle qui marche. Hourrah! Je peux enfin retrouver les fichiers vmlinuz et initrd ... je peux lire le fichier /boot/loader/entries/*.conf correspondant à ce que je veux démarrer pour copier-coller les uuid à travers l'interface chaise/clavier et au bout de 2 ou 3 erreurs (où le noyau linux s'est retrouvé sans système de fichier et ou j'ai préféré rebooter plutôt que de m'acharner avec des mount /dev/nvme0n1p5 /), j'ai mon linux de nouveau d'attaque... Ah parce que oui, menuentry, c'est bon pour les OS étrangers. Les entrées du genre "démarrer le système", "démarrer avec le kernel précédent" et "démarrer en mode opération de sauvetage avec Lino Commando", on a droit à des fichiers séparés que blscfg (encore un autre module, suivant les BootLoaderSpec) va passer en revue.

j'aurais probablement pu me simplifier la vie en exécutant export $prefix ; configfile $prefix/grub.cfg une fois le "chemin d'accès à grub.cfg" corrigé, mais ça, je ne l'ai découvert que trop tard ^^"

Bien, donc j'ai pu depuis mon système redémarré revenir à un système fonctionnel à coup de grub2-mkconfig et grub2-install, mais du coup, je perdais ma tentative de modifier l'OS à booter depuis n'importe quel OS en ré-installant grub sur une partition partagée ... et rien à faire, pas moyen de trouver où était la définition de cette variable prefix ... Mais j'avais vu un truc intéressant: la présence d'une commande source FILENAME suggérant qu'on pourrait aller lire un fichier .cfg minimal sur la partition partagée et garder grub tranquillement là où il est censé être.

Monday, March 24, 2025

#20 games, part 2

There has to be some Super Mario in my unsorted list hash of 20 most influential games... Given that we're only considering 20 games, it was also clear that I would likely keep only one of them. That *had* to be Super Mario World. The original one, on Super Nintendo. There are countless qualities in other Mario titles, but SMW is *the one* I wish I could be playing everytime I feel so. So that was game #5.

Pour vous, lecteurs de ce blog, voir un Mario apparaître dans la liste des 20 jeux qui m'ont marqués devrait être évident. Avec "seulement" 20 jeux, c'était clair qu'il fallait que j'en choisisse juste un, et que ça ne pouvait être que Super Mario World. Aucun autre avant ni après lui n'a aussi bien utilisé Yoshi. Aucun autre ne m'a à ce point marqué par ses choix graphiques au point que je chipe sa carapace de koopa comme icône pour mon terminal. Ils ont assurément leurs qualités propres, mais c'est à SMW que j'ai envie de rejouer.

It might be surprising, but I also wanted to include Zool. Because it's the pre-dever' embodiment of a game where you're in the middle of living objects. People often point out Rayman when they see School Rush, but you won't see any walking pencil or bouncing eraser in Picture City. They would definitely have worked in Zool.

Bon, ça vous surprendra peut-être que j'aie repris Zool dans cette liste. Lui, ça fait des décennies que je n'y ai pas joué, et je dirais que je le vis bien. Mais y avoir joué en 1993 a été déterminant pour la construction du monde de Bilou. Pas sûr qu'il y ait eu une School Zone s'il n'y avait pas eu Zool pour nous montrer la voie.

Si les environnements de Bilou ont du Zool dans le sang, le personnage lui-même n'a pas grand-chose en commun. Bilou serait plutôt un cousin de Coolspot de ce point-de vue là (11eme jour du challenge). Au point que dans la version BASIC, l'affichage indiquant le nombre de vie restant montrait Bilou plus ou moins tranquille d'esprit, un truc directement inspiré par la "pastille qui se décolle" du HUD de Coolspot. Par contre les environnements de Coolspot sont un peu trop "normaux"

You'll note that Bilou as a character is very unlike Zool, but there was another major platformer outsider in '92-'93, and that was Coolspot. Simple geometric shape with feet and hands, defined mostly by its animation... When you realise that one of Bilou's power-up implied shades, you won't be surprised if I tell you Coolspot's health meter inspired a "1-UP count" in the BASIC flip-screen platformer where you can read Bilou's anxiety regarding the lives left on his face.

Comparatively, Rainbow Bells Adventure seems to have been only lightly inspiring (apart from "Pipe Zone" music in my head). Yet, I've been hunting for ways to play that game for years. To the point where I couldn't write this post without trying to install an SNES emulator on my NDS and try running Twinbee there. Oh, it was the first game I've played where you could cummulate power-ups (where Mario would insist on swapping them).

Le jeu du 7eme jour conclut à merveille ce batch: Twinbee Rainbow Bell Adventure. la pépite qui n'a pas été rééditée, dont on a pas les sources ... au point que tout en faisant le challenge, j'ai fini par m'installer une version plus récente de SNemulDS pour le faire tourner sur DS... et il tourne. On ne va pas se mentir, on sent qu'on est émulé et l'émulateur n'est pas d'une stabilité exemplaire ...mais il est bel et bien là ;-) Son impact sur Bilou, il aura fallu attendre (à part la musique pour la "pipe zone"), mais si on peut cumuler les power-up dans School Rush, c'est bien grâce à lui.

Sunday, March 23, 2025

PENMENU.S3M

Vous pouvez l'écouter sur modarchive, vous pouvez le dédicacer sur Nectarine ... ce n'est pas le meilleur module de mon frangin, loin de là. C'est le thème envisagé pour le menu d'accueil de Pengo's Adventure, notre premier jeu sur RSD Game-Maker.

Mais c'est surtout en 1996 qu'il est devenu inoubliable pour moi, et associé à un écran tout bleu (avec un raster-effect un peu raté), preuve que ma routine d'interruption continuait bien à progresser dans les patterns et à mixer les 6 pistes pour les mettre dans le buffer transmis en continu par DMA à ma Master Boomer ...

If you've ever written your own .mod player routine (or any other tracked music format), there's a chance that you've had a very-first-tune-that-worked on that player. In my case, that was a tune my brother wrote, that should have replaced the menu music in our very first RSD Game-Maker title: Pengo. Sure my brother wrote plenty of much better tunes afterwards ... he already had some better ones at the time, including a title for the "Maya Zone" of a puzzle-platformer, which I was eager to start working on...

But since "penmenu.s3m" used no effects, it was possible to get it running earlier. It still reminds me of that blue raster showing up while playing -- like everyone else doing low-level programming at the time, I was hacking the background color to give me hints about where in the code I was. There would still be work to do before it could be featured in a game, but my 8-track player had turned from dream ... to reality.

Bon, bien sûr j'aurais préféré que ça soit la musique de Nono dans la Maya Zone ... mais pour ça il aurait fallu aussi le support des effets (dont l'arpeggio) alors que PENMENU, avec juste la colonne de volume, c'est réglé.

On a retrouvé Basket Island

On peut difficilement sous-estimer l'importance du musicien Français Maf sur la musique de mon frère. Assez pour le détourner du genre "Luc Baiwir" omniprésent depuis le concert de '97. Ce que ça a de bien, c'est qu'on peut alors utiliser les commentaires qu'il laissait dans ces pour retracer les influences ... comme le fait que c'est par l'intermédiaire du magazine "PC-Team" que nous avons découvert ledit Maf.

Parmi les titres qu'il avait partagés via la rubrique "productions des lecteurs", il y avait notamment une série de modules faisant référence à une mystérieuse "Basket Island".

Eh bien il est temps de lever ce mystère: quelqu'un a mis en ligne une vidéo de la diskette de démo du jeu "Basket Island" sur lequel l'équipe Syndrome dans laquelle Maf travaillait avec Guillaume Werlé (code) et Raph Le Gall (gfx).

This is the story about a French prototype game named "Basket Island". We had started our university years, and we encountered a collection of .MOD files French musician Maf wrote two years earlier. Some of them were referring to a then-mysterious "Basket Island" project, and my brother especially liked how he managed to have syncoped beat in the otherwise square playback of modtrackers. The influence went beyond mere technique and my brother started investigating the sample set and the style of Maf until he was ready with his own "CJ(is)land" tune.

Des petits écrans qui s'enchaînent, des persos qui suivent le ballon et tentent de mettre des paniers. De quoi convaincre une autre équippe de Posse Press responsable du magazine AMIGA DREAM en '96 de partager l'info avec leur lecteurs. Cette démo fait suite à une autre diskette qui présentait un slideshow de captures d'écrans (ou juste de maquettes, en fait ^^") sur une des musiques de Maf.

I recall my brother did call Maf at some point (pricy, international phone call), and likely this is where we learnt that Basket Island had been an amiga game project, but it never got completed. Nowadays, there are a few videos of the recovered demo disks Maf's demoscene group had sent to game / amiga magazine to promote the game.

Le jeu n'aura jamais été fini. Je vous laisse le soin de creuser les liens à la recherche d'une raison officielle. De mon côté, entre la musique qui s'arrête sans prévenir dans la démo et l'instruction invalide je dirais que toute sympathique qu'ait été la démo, il y avait un gros travail de nettoyage à fournir pour que le code devienne stable et fiable. En plus de ça, on se rend également compte en regardant les phases de jeu que l'IA du joueur 2 n'arrive pas vraiment à défendre son panier et que la dynamique du jeu ne permet pas non plus au joueur humain de s'interposer pendant les phases de contre-attaque. Un peu comme si on avait été face à un pacman où les fantômes ne vous pourchasse pas vraiment, mais se contentent de tourner en rond. 

Despite brilliant graphics and clean rendering, the demo also show that the game engine lacked stability and that gameplay was still very rough, hardly fair to the human player. I guess that's why killed the project before it could be shipped ...

Probable que tôt ou tard, l'équipe (ou ses membres ^^") ait fini par se concentrer sur un projet plus fiable pour assurer leur avenir.

Tuesday, March 18, 2025

procmon.exe

 A rogue DLL
Is failing to load
Who you gonna call ?
DependsWalker !

It's not in your path
nor in Windows Kit
Who you gonna call ?
Depends Walker !

Well, it used to be in Visual Studio ... then in Windows Kit ... now it is a mere .zip to be downloaded on some random dependencywalker.com site, waiting to be hacked away or sold to any advertiser ... It's useless with Windows 10 anyway: it doesn't understand new requests in the new internal API and throws tons of fake dependencies at you.

Oh, sure, there is a github fork in another language made by some nice guy trying to replicate the feature. It will require some specific .net version to build and no, I'm not going to mess up with my dotnet setup after upgrading python to please the antivirus broke my builds.

So what's left ? The "modules" window of Visual Studio is of course useless. Setting breakpoints on LoadLibrary* is a nice way to spend your time watching hex numbers, but it doesn't help either. Rubber duck suggested procmon.exe, which looks a lot like the long-searched-for strace for Windows, and at least comes from a known package hosted by a legit webmaster

O yum. O apt and your super cow powers. O pacman. How much I'm missing you ...

Saturday, March 15, 2025

Dans les .DAT de Fury

J'aurais préféré pouvoir dire "dans le code", mais à défaut,  moddingwiki sur shikadi.net a pas mal d'info sur la structure des niveaux d'un de mes jeux fétiches: Fury of the Furries. On y apprend pas mal de choses qui différencient le code du genre de code que moi j'aurais écrit. Comme ce tableau de 5 entrées pour "une zone d'eau" puis 5 autres "téléporteurs". Les concepteurs du niveau devront se débrouiller dans ces limites. Les zones sont forcément rectangulaires, aussi. De mon côté, n'importe quelle zone de 8x8 pixels du niveau peut devenir de l'eau, mais ça aura demandé pas mal d'efforts de développement.

C'est presque encore plus contraignant que les lignes de code BASIC que j'écrivais dans les années '90. Mais avec cette structure statique, on *peut* se faire un éditeur de niveaux et éviter de devoir lancer le jeu après recompilation pour vérifier que les coordonnées correspondent bien à ce qui est prévu. Et le nombre de zones reste suffisamment faible pour ne pas ralentir l'exécution ... même probablement plus efficace qu'avec une liste dynamique puisque les emplacement en mémoire de cette liste sont connus dès la compilation.

There are days where I'm proud of the game engine I've crafted for Bilou on DS and days where I can't help feeling ashamed for how much overhead it carries for things that would have been made so much simpler in the 16-bit age. So from times to times, I go for another hunt on "how 16-bit games stored their levels" in hope that it would teach me how the engine manipulates them.

I knew Fury of the Furries had a level editor. We even have some icons and UI elements in an LBM file shipped with the game. For years, that's been all we had, but now the moddingwiki also features a description of .BIN files for each level in the DAT/ directory. You can see there that there had been some agreement between coders and designers that 5-{anything}-ought-to-be-enough-for-everybody. 5 exits. 5 teleporters. 5 regions where Green's rope wouldn't attach. 5 pools of water ... within each entry, you just find coordinates of a rectangular area. 

I used to have IF XX > 150 AND XX < 270 AND YY > 160 THEN die() in my QBasic edition of Bilou ... well, this is more or less the same. Except you don't get a script line, but you do get a tool that can adjust those coordinates with the mouse and have the engine load them precisely where the game logic will scan them. In comparison, my current engine will instead provide a get_tile_type(x,y) function that looks up a value in a phys_level_map[WIDTH/8][HEIGHT/8] and then let the state machine adapt from that ... where Fury.c could have if in_water_area(furry.x, furry.y) swim(furry);

Of course, that puts a strong limit on how many things you may have in every level, and thus on the size of those levels. It works fine with Fury because levels are quite small, although you may stay longer in some of them than in a Super Mario Bros level. This approach wouldn't have worked for Badman II-styled level, nor for a metroïdvania level design ... But for the maps my brother had drawn for Bilou's Adventures, even the 10 ennemies per level limit could have worked.

Un autre élément intéressant: la façon dont les blocs destructibles sont gérés. Vu la palette réduite, il n'y a pas de "portion partagée du tileset" ici.

Certain tiles in the image file have special meaning.

The tile at 0,1 is a coin. If the player touches this tile in the level, they will gain a coin, and the tile will be swapped out for the tile at 0,0 which is always empty.

The tile at 0,2 is an extra life. If the player touches this tile in the level, they will gain an extra life, and the tile will be swapped out for the tile at 0,0.

The tile at 0,3 is a time extension. If the player touches this tile in the level, they will gain an extra 30 seconds on the clock, and the tile will be swapped out for the tile at 0,0. 

All the remaining tiles on rows 0, 1 and 2 in the map are destructible tiles.

Par contre, certains objets doivent systématiquement être à certains emplacements, comme la pièce (coordonnées 0,1), l'image à utiliser à sa place (0,0), les animations à afficher entre les deux. On a droit à tout une ligne d'images que Fury Rouge pourra grignoter, et les deux lignes en-dessous serviront pour les blocs un peu abîmés et très abîmés. Tellement plus simple que mes "mapanim" ^^"

They also had an interesting approach for animated tiles: the top rows of the tileset pictures (7 or 8 of them) have special meaning, as well as a few more on the leftmost column. You'll see the details in the quote above. An interesting alternative to the hard-coded crumbling floor logic of 8-bit titles like Manic Miner, if you ask me. It requires a good pre-production brainstorming to decide what sort of things we want/don't want in the level, but at least the level designer and the graphist are free to make anything crumbling / chunked by Red as they see fit without having to bother the coders with One More Change.

Mais ce qui m'a le plus surpris, c'est le nombre si faible de "sprites" autorisés dans le niveau combiné à la quantité d'informations associée à chaque sprite. Imaginez: seulement 10 ennemis par niveau !? Mais la raison, c'est qu'il n'y a pas ici "d'ennemi partagé" non plus: pour chaque ennemi, on définit les zones qui le déclenchent, les flots qu'il active/désactive (les interrupteurs et les ennemis sont donc gérés de la même manière). ça explique comment on se retrouve avec des comportements si différents pour le même visuel de monstre ... mais rien qui ne se comporte comme un koopa (avec un déplacement identique d'un bout à l'autre du jeu).

One even more interesting thing is the way sprites are handled. There are few of them per level, but they are given over 1600 bytes each. All the switches and doors and falling blocks that you push and then move into place, all this is achieved with those 10 sprites that can have up to 10 state each in the level. 

Et ce que vous voyez là ne fait même pas directement partie de la structure "sprite", c'est un des 10 états associés à un des sprites, avec leur propre vitesse, leur propre type de déplacement, 


10 states is rather few (pendats in SchoolRush have nearly twice that amount) but what makes it brilliant here is that these are no koopa-like sprites. Their state machine is level-specific and instance-specific. You don't craft a mummy that will turn back at the edge of any platform, you have an editor that let you say *this* mummy will cycle horizontally between *here* and *there*. Same for the falling bricks. or the doors.

RSD Game-make state machine could only have one "next state" for each state. Pretty limited. Here there are at least 8 state transition conditions (most of them being triggers), some about "when that position is reached", other "when that water area reached that level", etc. And yup, you can "name" a water area or another sprite, or even a "current" area (flowing air or water) and activate/deactivate that when your sprite reaches a give state. 


Even the elaborate level 2 of the Pyramid could be explained with pre-defined path alternating "move horizontally" and "falls & bounce", with triggers so that the rocks start falling... there's not even need for a multi-state orange box as I depicted: there is no "shooting" of rocks, just a stock of 3 rocks rolling left and 3 rocks rolling right, and each could unlock the next one when crossing some predefined trigger.  

(PS: j'en profite pour introduire le tag "level data", et attendez-vous à ce que j'essaie de trouver l'équivalent pour d'autres jeux)

Friday, March 14, 2025

#20games

Bon, il y a 20 jours, j'ai décidé de suivre l'exemple de Sverx et d'essayer de poster chaque jour "un jeu qui m'a marqué". Je l'ai compris au départ comme "qui est une de mes sources d'influences dans les jeux que je conçois et réalise ... on y trouvera donc pas Link to the Past, même si c'est à son donjon des glaces que je repense chaque fois que je dois trouver la détermination d'envoyer un recommandé ou de renvoyer des couriers administratifs d'un bureau à l'autre du même bâtiment en passant par ma boîte aux lettres ^^".

J'avais dans le passé déjà voulu participer à un autre challenge du genre puisqu'il y avait jusqu'à hier un tag "10 games" avec 3 posts ...  Croyez-moi si vous voulez, le plus difficile aura été d'attendre chaque fois 24 heures avant de parler du jeu suivant ^^".

I've followed Sverx's example and try to identify 20 games that have been most influential to me as a gamedev. Having to wait for the next day before picking the next game turned out to be one of the trickiest part of the challenge to me ^^". The challenge also said "no explanation, no particular order", but it turns out the first four I picked were among games that I go back for reference very often.

Le challenge disait "pas d'ordre particulier" (avoir Goodbye Galaxy en #1 ne veut donc pas dire qu'il s'agit du meilleur jeu ou du plus important), et surtout "pas de commentaire". Mais sans grande surprise, j'aimerais maintenant revenir sur chaque choix et contextualiser.

"Commander Keen in Goodbye Galaxy", donc, qui a été _le_ jeu utilisé par mon frère pendant qu'il dessinait les premiers niveaux de Bilou. Sans oublier les imports aux monstres de "Secret of the Oracle" pour les ennemis de la Green Zone. Il est probablement aussi parmi les jeux dont j'aimerais le plus mettre la main sur le code source. Même s'il y a les sources de "Keen Dreams", le moteur de GG est plus abouti, ça se sent manette en main...

Some of the games I mention on this blog are so influential they even get their own tag in the cloud! That's the case for Commander Keen, the game that formatted my brother's level design and monster rooster, but also for Fury of the Furries, where *I* draw inspiration during so many levels revival and where I've truly learnt pixelart. 

"Fury of the Furries", que ce soit les graphismes, les musiques, le thème, le level design, ce jeu revient tout le temps dans mon esprit dès que je travaille sur mes propres jeux, donc bin ... évidemment, c'était le n° 2. Lui aussi, j'aimerais sacrément tomber sur son code source... la physique de l'eau, du sable, la corde ... vraiment curieux de voir comment les gars s'y étaient pris. (note au passage: il y a toujours le projet FuryStudio à étudier et les infos sur shikadi.net ). C'est aussi le premier jeu que j'ai pu utiliser comme référence pour le pixel art vu que tous ces graphismes étaient des .LBM.

Vient ensuite Prehistorik 2, qui reste une référence pour moi en matière de bonus, de cachette ... et de comment faire une démo d'un niveau capable de captiver une bande de gamins/jeunes pendant tout un après-midi. Comment Bilou.BAS faisait tomber les pommes pour le décompte du score à la fin du niveau ? Prehistorik 2. Comment le niveau-anniversaire essaie de vous pousser à faire un 100% sur un unique niveau un peu corsé quand-même ? Prehistorik 2. La révision des éponges pour les pendre au bout d'un fil ? Encore prehistorik 2. Lui ... trouver son code ... je ne sais pas trop. Ce serait peut-être un sacré travail de l'étudier si jamais il faisait surface, vu les stratégies "tout assembleur" si chères à M. Zmiro ... Mais on a toujours le site mine.nu et sa page sur le format des niveaux. (Il y a une réécriture SDL2 en C, cela dit ... )

The next two may not have their own tag, but their impact on game mechanics and how to make a compact game interesting over the long run are still fundamental. They are also two of the games for which I'd definitely like to see the source code, and figure out what design choice the developers have taken.

Et Pharaoh's curse. Il a beau être simpliste au regard des précédents, c'est peut être le meilleur exemple pour moi de rapport qualité de gameplay / quantité de contenu. Ceux qui lisent ce blog depuis assez longtemps n'auront pas manquer de noter que je finis régulièrement par revenir à des mécaniques tirées de ce jeu C64 ... et j'espère toujours voir débarquer la version remasterisée de notre ami Lazycow ... Notez que pour ce jeu-là, le code source, c'est de l'assembleur, donc plus facile à reverse-engineerer. Et quelqu'un s'y est déjà attelé.