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 ^^".

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...

"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 )

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. 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.

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 ...

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.

 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" ^^"

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).

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, 

(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)

Sunday, March 09, 2025

handscript ... not yet dismissed

I made no progress in building something to recognize scribbling writing input to my NDS homebrew. But I haven't forgot about it completely either.

I had a old post saying "NDS touch screen is 62x48mm. That makes 1 pixel 0.25x0.25mm. My 8x15 font will take about 2x4mm, making it comparable to tracing 3x5 letters on millimeter sheets (following the edges, not filling the dots) with a .2mm pen. That should be quite easy to emulate."

The smallest I know that works is a grid where cells are 4x4. That's what SpriteEditor does in the "big grid". With 4x8 cells per character, that means 16 characters horizontally on the DS screen, and at best 6 rows of text.

I feel like keeping simple squares (or possibly dots ?) would work sufficiently well. A 1-pixel padding to avoid adding corner cells when we're trying to make a "turn". No fancy overlay, no "drag a wire like in those Android lock screens". just use the bottom 8x8 pixel of each character to print which character has been detected.


 

Thursday, March 06, 2025

Heal Pick-up

I've had a "heal 1 point" pick-up in School Rush, and I was quite happy with it. The only issue is that everybody always mentioned it as "a 1-UP". I guess when your main character is a blue ball with hands and feet, a pick up that looks like a smiling blue ball will often be perceived as a 1-up...

I've been toying with the idea of making a "blue patch" collectible (see the bottom sprites in the screenshot nearby), inspired by the red dots of CoolSpot. I did my best but ... well... it just feels wrong when I animate it. It doesn't convey proper shape or coherent motion... and adding sparkles to it didn't help either.

Quelques petits pixels que j'ai rajoutés un peu plus tôt dans la semaine et qui serviront de points de vie pour le prochain jeu de Bilou. Pourtant j'aimais bien la balle bleue souriante utilisée pour ça dans School Rush ... mais voilà, j'entends vraiment trop souvent les joueurs en parler comme "la vie". Au point que rajouter un autre dessin pour les 1-UP, ça n'aurait pas de sens.

So I went for something else, using that same blue ball as a base, but trying to get some circling drop... it's not as smooth and convincing as I hoped, but it's doing a fair job anyway. I had tried to make something more elaborated by adding sparkles, but it feels like it doesn't work: it catch the attention along a triangle that competes with the circular motion ... or something alike. I'd love to have the wayofthepixel board to ask and get advice, but those times are gone...

J'espère que vous aimez ces espèces de gouttes-de-yin-bleues qui tournent... je pense que je les ferai sans les scintillements: ils me semblent casser la fluidité de l'animation comme ils sont là.

Ce n'était pas mon idée de départ: je m'orientais plus vers des pastilles tirées de Cool Spot, mais ça, ça s'est avéré encore moins réussi ^^".


Saturday, March 01, 2025

Pas si circulaire ...

Bon, j'essaie de mettre au point le fait de s'accrocher aux racines, et ça malgré le fait que j'ai noté quelque part "oui, ça ne marche pas parfaitement, mais c'est amplement suffisant pour faire le tour des niveaux sans ce prendre la tête".

C'est sans doute ce que je ferai dès demain, mais il faudra que j'y revienne et que je corrige un peu tout ça. Un composant "reste dans le cercle" avec un comportement cahotique, c'est marrant pour SpongeBop à cause de son élastique ... mais pour les lianes qui pendent ? les signets ? les ponts ? les boss ?

Technically, it would be nice to have Bilou reusing the "stay within radius" behaviour of SpongeBop when he's hanging at a root. Just have a smaller radius, show his hands grasping the root and voilà (oh, and remove the white polygons, please). That would work if that RadiusController wasn't randomly jerking up. Jerky monster with funny tik-tokking eyes is fun. But a jerky bookmark ? A jerky vine ? that looks suspiciously close to a bug to me

I had already fixed a more serious bug last week, and somewhere on some note book, I wrote down that "jerkiness shouldn't hinder levels traversal. Keep it as is and keep going". And yet there I am. Maybe this number shouldn't be that high ? Maybe that thing is wrong ... What does it look like in DDD?

Je vous ajoute deux petites capture-gif pour que vous vous rendiez compte si vous n'êtes pas allés vous promener sur mastodon ces derniers temps ... une où ça va pas trop mal (ci-dessous) et une ou ça part dans tous les sens (ci-contre)

Dans les deux cas, je ne donne aucunes consignes avec la manette. c'est juste "l'énergie de départ" qui est hors contrôle ... ou un problème d'arrondis qui s'accumulent ... ou quelque-chose de plus fondamental.

J'ai fini par rajouter un printf("%vx,vy + %corr_vx,corr_vy @%extra_radius") dans le code et faire cracher des tonnes de chiffres pendant que ça partait dans tous les sens (le debugging step-by-step, sur un problème comme ça ne donnait rien). Contrairement à ce à quoi je me serais attendu, on a très peu de "brusque augmentation du vecteur-vitesse" ... par contre, on a régulièrement un vecteur plutôt important (correction d'1 ou 2 pixels) parfois pendant 2 frames d'affilée. Dans un setup où la gravité met 8 frames à augmenter d'1px/frame, ça veut dire que Bilou va facilement nous faire un petit bond de la taille d'un caillou quand ça se produit.

The 2 screenshots above show the state as of ScreenshotSaturday, 5PM. I guess I don't have to convince you that it would look broken, if the game was doing that while you're not even pressing any button of your DS. I added print statement, revealing adjustments performed to stay within the radius (step-by-step debugging doesn't really work for such use cases), and even shooting a video of those lines so that I could time-travel and see what were the causes of sudden bumps... Except that there were no "sudden huge speed". Instead, there were multiple frames with 1 or 2 pixel-per-frame corrections, but that was already fairly strong for 1/8th-of-a-pixel-per-frame gravity. At 8PM, I had given up: it would require a complete rewrite to get stable behaviour, for sure.

Alors voilà ... j'ai copié le code de RadiusController::think dans un carnet pour pouvoir le comprendre et l'annoter ... j'ai voyagé dans le temps avec les captures .gif et analysé les chiffres que mon print avait produit et ça me donne le sentiment un peu désagréable qu'il n'y a rien de corrigeable dans ce code, parce que l'impact sur la vitesse persiste plus longtemps. Peut-être faudrait-il corriger directement la position, mais alors on perdrait la transformation de la chute en un mouvement de balancier...

edit: vous l'avez lu, j'étais sur le point de jeter l'éponge ... puis le lendemain matin, j'ai voulu tenter quelque-chose quand-même: et si les valeurs dx et dy que j'utilise pour vérifier si dx²+dy²<radius² n'étaient pas exprimées en pixels mais en subpixels ... pas en 256èmes comme la vitesse parce qu'il faudra quand-même les multiplier et que ça ne déborde pas ... mais des 16èmes de pixels ? Eh bien, avec ça, ça donne quelque-chose de beaucoup plus convaincant... je vous remet une mini-animation sur le côté. Il y a un peu de vibration résiduelle mais rien de vraiment choquant. Et ça malgré que Bilou partait avec un mouvement du genre à faire des bonds dans tous les sens au commit précédent.

But as I started my Sunday, I wanted to try something before rolling back to where I was on Friday: adjust the algorithm so that it would work with sub-pixel precision. 16th of pixels, to be precise, just the intermediate between pixel coordinates and current 256th of pixels used for speeds and entity positions by the engine. And ... well ... it turns out I now have something that converges towards a stable state. It's a bit sad for Spongebop... I'll have to try and find a way to turn of stabilization for them ^^".

Il me reste à trouver un moyen de rendre ça paramétrable, des signets qui ne soient pas élastiques et des spongebop qui le soient (la pauvre, obliger de circuler le long d'un parfait arc de cercle, c'est vraiment la dictature de SquareRoot ... je ne le lui souhaite pas).

edit²: le changement d'échelle (subpixel 12.4) suffit à lui seul pour avoir une éponge qui suit une trajectoire toute circulaire ... mais pour Bilou qui peut débarquer avec un vecteur-vitesse quelconque, il faut bien tous les petits ajustements. ça sent le code split, parce qu'il n'y aura rien à paramétrer ...

Sunday, February 23, 2025

le nouvel arbre

Avec les tests effectués pour les-racines-auxquelles-on-s'accroche, j'en ai profité pour faire une petite capture d'écran de l'arbre tel que je suis enfin en mesure de le faire apparaître dans le jeu ... Je pense que vous ne l'aviez pas encore vu. Pas parfait, mais honnête, je dirais. (et oui, j'ai vu: il reste des caractères foireux tout autour... C'est une map de récup, si vous vous souvenez ;)

edit: ces caractères (étoiles) sont invisibles dans l'éditeur de niveaux: il s'agit d'une portion de la mémoire utilisée pour les animations qui se retrouve visible parce que la map fait toujours référence à des numéro de tiles qui ne sont plus dans mes pages.

There are tests ongoing on my devstation with Bilou hanging to a root in the greenzone. They've been behaving rather weirdly lately, but they're taking place in that recovered-vertical-level once drew to test load-level-two feature.

And that means at some point, I was bored of seeing non-sense flashy tiles at the start of every attempt, especially since I've drawn some more leaves tiles last year. But you had never seen them, because I had never used them. Well, now it's done. they're not perfect, but here they are.

Saturday, February 22, 2025

Crappy Debbie WiFi

Bad luck, I've got unreliable WiFi with the new distro: every now and then a web page will get stuck while loading. When they're not, they're taking age to complete. If I ping, I don't see "network unreachable", but I see the pings struggling, the resovled name changing, sometimes even switching from IPv6 to IPv4. So I went for a monitoring of dmesg -w and I spot events like

[13390.293505] wlp2s0: disconnect from AP e4:bf:xx:xx:xx:50 for new auth to e4:bf:xx:xx:xx:48
[13390.332410] wlp2s0: authenticate with e4:bf:xx:xx:xx:48
[13390.332455] wlp2s0: 80 MHz not supported, disabling VHT
[13390.379300] wlp2s0: send auth to e4:bf:xx:xx:xx:48 (try 1/3)
[13390.382294] wlp2s0: authenticated
[13390.385211] wlp2s0: associate with e4:bf:xx:xx:xx:48 (try 1/3)
[13390.396102] wlp2s0: RX ReassocResp from e4:bf:xx:xx:xx:48 (capab=0x1411 status=0 aid=3)
[13390.400601] wlp2s0: associated
[13390.414136] wlp2s0: Limiting TX power to 20 (20 - 0) dBm as advertised by e4:bf:xx:xx:xx:48
[13411.113702] wlp2s0: disconnect from AP e4:bf:xx:xx:xx:48 for new auth to e4:bf:xx:xx:xx:50
Every 20-30 seconds. They match the struggles of ping.

Now, there are posts about how to handle frequent disconnections, and I wish they weren't so often behind cookie walls, so I could scan through them more easily. The link mentioned would offer little to no help. "Have you tried switching to networkd+resolved instead of NetworkManager ?" ... eh ... I'd rather leave that untouched if I can. See, it's not a whole new system: a decade-old ubuntu was able to use that same WiFi chip reliably.

if I watch iwconfig, I can see Bit Rate ramping up after a disconnect, then reach a certain point (around 100Mb/s) and then we disconnect and are back to a few Mb/s again. Yet, sudo iw dev wlp2s0 set bitrates legacy-2.4 48 36 24 18 12 9 6 does not seem to help ... Of course: ramping up bit rate is not the cause of the issue, it's a consequence of network being disconnected: it has to slowly re-establish connection every 30 seconds.

I'd like to say that I've found a blog post that proposed me to check nm-connection-editor and change "band auto" into "band B/G (2.4GHz). I'd like to say I've got a colleague explaining that pointed out it would have no effect until I manually systemctl restart NetworkManager.service, no matter whether I clicked "save" button on that settings window. Truth is this has been suggested (among many other useless things) by the rubber duck, again.

Now that it's fixed and that I read those dmesg lines again, I spot how there were *2* MAC addresses competing, and my computer would hop from one to another. Likely I could have saved myself trouble by disabling either band on the access point settings, but that may have affected phones of my relatives.

Monday, February 17, 2025

pixels, at last.

Une petite heure de week-end où j'ai pris le temps de me faire des petits pixels ... enfin. Après une autre petite heure plus tôt dans le week-end pour faire quelques essais de croquis.

L'écrabouilleur, d'abord, qui est la résultante de mes esquisses basées sur Ristar, des techniques proposées par Helm que j'avais utilisées pour les livres de l'école et de la réalisation que  finalement, des gants façon Mickey donneraient sans doute mieux dans l'univers de Bilou que ma propre main.

Il se trouve que j'avais déjà tenté de dessiner ma main, et j'avais la S-Team en entier et le verdict est sans appel: le nouveu design, plus anguleux, s'intègre mieux.

Finally, I managed to find 2 hours to work on the missing pixels I need for Bilou's demo. First the smasher punch, using all the observations I made while posting about my Ristar pixel study. It's more squarish (and the S-Team girls like it), it has cartoony-4-fingers look and is modeled after a cartoony glove rather than my own hand. Quite close to the sketch I made the day before. I'm still undecided about the thumb position ...

Second, the top-of-waterjet sprite. I won't try to make a tutorial of how-to-animate it: there is very likely room for improvement, but it does a fair enough job (imho) and nicely fits the style of the jet (see below for the in-game montage ;). I'll still have to make it wave up and down and make it so that the jet pushes Bilou upstream on contact.

Deuxième morceau: le haut du geyser inspiré de GoodboyGalaxy. Il faut dire que les derniers tests se déroulaient sur une map où j'ai ajouté l'animation pour la partie verticale du jet ... et bon, voir le jet se terminer par une ligne nette comme ça, ... ça picotte aux yeux.

Je ne suis pas franchement au niveau de hot_pengu, mais je crois que ça devrait faire l'affaire malgré tout (NB, c'est plus fluide en vrai sur la DS).

Saturday, February 15, 2025

The Tomboy Quest

  • Tomboy.exe is truly a PE32 executable holding .Net assembly ... my bare kernel doesn't want to run that
  • what with mono-runtime ? it starts, but is missing Mono.Posix ...
  • it is in my /ubuntu/usr/lib/mono/4.5, as a dll, but there are also some .../lib/mono/gac/Mono.Posix and a /usr/lib/libMonoPosixHelper.so ... so I'd better install libmono-posix4.0-cil from debian repos ...
  • okay, but now it complains about a missing gtk-shark ... I see references for that in /ubuntu/usr/share/cli-common/packages.d ... let's try and make some symlink ...
  • still not ... time to install strace and see what it fails to find... mhmm ... seems to be the Facades/gtk-sharp.dll and friends. But ubuntu did not have any Facades either ... so I guess that must be the files in .../lib/mono/gac/*-sharp instead. (strace did look for them, at least). Without gac contents, none of packages.d or policies.d is taken into account ...
  • trying again ... more sophisticated exception this time, about libglibsharpglue-2.so not found, if I'm not mistaken. It insist on it to be in /usr/lib/cli (fair enough), which only contains binfmt-detector-cli so far (part of mono-runtime)
  • more progress again, now missing libappindicator.so.1 ? would debian pacakge libayatana-appindicator1 do the trick ?
  • libgconf-2.so.4 you say ? okay, there's a .deb too ... now it says "Initializing Mono.Addins" ... it say "no GUI 'su' tool found" ... nothing ... What if I have mate-session running ? Ah! There you are ! Okay, your icon in the tray is a broken file ... your icon in the enlightenment dock is a question mark, but you ... are ... there. (I guess using --new-note or --search on the command line would have done the trick as well).

Time for some context, I guess ? Well, you know I've been installing a debian lately. It turns out it did not have the tomboy tool available in the repository... This is no surprise to me: the latest ubuntu I installed at work did not have it either, but my colleagues had started to deploy phabricator and it's been a good amount of years that I've switched all my dev-musing into that (mostly because it has instant upload of pictures despite a more sluggish overall interface ... and I can easily share contents with colleagues).

I'm done with PhD research and all, so my old collection of notes about a better Internet aren't very useful either ... but I started using tomboy a few years before it turned obsolete to hold some of my fairy's collection and automate the production of monthly curated list of that collection. So the last weeks have been a reboot-dance between the new debbie and the old ubuntu depending on whether I needed USB support or she needed her collection. That must come to an end because firefox certificates are about to expire in that old ubuntu, with no more packages to replace it.

The process above will sure turn into a maintenance nightmare sooner or later, but guess what, it's not the first time I resort on such process. Last time was to keep using an old Adobe Acrobat for Linux because the new one was a usability nightmare ... and it did a fair job for years and years, even hopping from SuSE to Ubuntu. Sure, I tried alternatives, like Folio, or rebuilding from sources, or the tomboy-ng package readily available for my debian (but that turned out to have several critical bugs and lacked key features for my curation technique, despite having a very welcome convert-old-notes tool) ... I hadn't tried NobleNote, thought ... maybe I should have ...

Thursday, February 13, 2025

Hang on!

It's one of the key mechanics I'd like to bring into my new game: being able to catch hanging things and hanging as well. It was a fun move in Commander Keen, it was amazingly expanded in Fury of the Furries and Mickey Magical quest ... And last week-end, I went on to try and get it prototyped.

I started with a summary of how Bilou can hang below spongebops in School Rush ... something we don't see a lot in the blog, mostly because Bilou is supposed to *ride* the sponges, not hang under them. Hanging was added as an "else" branch of another "else" branch:

when you hit the "HANDS" button mid-air, Bilou does a roll move trying to grab what's nearby. that is AIRGRAB state. The original idea was to test what was *below* him and either pick-up a dumblador or ride a spongebop... but the move shows the hand grabbing in front and rear directions as well ... so it would feel natural that Bilou could grab a sponge even if he's on the same horizontal line, like in the sketch on the left. Yet, snapping Bilou on top of the sponge from this location felt glitchy.

Bon, j'ai un p'tit Bilou suspendu sur une page de mon cahier-agenda depuis le début 2024 ... j'en ai un autre sur la bannière du blog ... je crois que l'appel du pied est assez clair: il serait temps de prototyper un peu ça, d'autant que cette fois ci, ce ne sont pas les coins de niveau où s'accrocher qui manquent dans le livre-secret-du-level-design.

Et pour "commencer simple", l'idée était de faire subir à Bilou le comportement des éponges. tout en réutilisant un des états codés pour l'interaction avec les éponges: rester suspendu (la feinte). Chose qui m'a tout de même demandé de me replonger dans pas mal de gobscript, parce qu'à la base, il est prévu que Bilou s'accroche *par-dessus* les éponges, et pas qu'il pende en-dessous. Le côté "pendu" n'a été rajouté que dans les derniers 20% du projet, entre deux séances de playtesting parce "bin, oui, c'est vrai au fait: pourquoi Bilou ne pourrait-il pas rester suspendu s'il était trop bas pour escalader l'éponge au moment ou la joueuse a appuyé sur (B) ?"

So instead, Bilou will enter AIRHOP move, getting an automatic double jump and automatically tracking the sponge's position. That feels fairly naturally when playing, that gives you a sort of "fair second chance" but it might fail anyway: you may fall below sponge's position again without having reached the "riding spot", with no hope of catching up. and *that* is the time when we finally switch to HANGING. 

There will be other objects to hang to in the game, especially bookmarks, vines, and the like. Some of them could be entities like spongebop (maybe moving a bit less), but sometimes it might also be nice to have tiles you can hook to. I have code to make some tiles react to collisions with the player, but that was not enough: the hitboxes used to detect spongebop explicitly search for baddies. And because I'm testing 3 areas over the course of the animation, I'm out of options to also test for friendly areas (which has been the case for all pick-ups so far ^^"). But hitting a tile can trigger an animation, and it can spawn an entity with proper hitboxes so that Bilou could hook to *that*. You couldn't really hook to a tile, anyway, because the BlockArea created during the collision test is immediately recycled, so you could not attach to it

Mon idée était ensuite d'utiliser un type de bloc spécial pour servir de point d'accroche, et d'aller "poker" quelques blocs de ce genre à des endroits bien sentis de la map "green" de la démo. ça non plus, ça n'a pas fonctionné comme j'espérais. Entre autres parce que quand Bilou cherche à s'accrocher à quelque-chose pendant sa pirouette-en-l'air, il cherche parmi la liste "EVIL" ... et les blocs interactifs, eux se présente automatiquement comme des "HERO".

Bon, ce n'est pas bien grave: puisque je voulais que Bilou s'attache au point d'ancrage, il fallait de toutes façons que j'introduise un GOB (game object) généré à partir du bloc spécial, un peu comme les scintillements qui suivent Bilou quand on ramasse un smiley bleu. Ce gob pourra être dans la liste que l'on veut. Pour éviter qu'on ne génère des quantités ridicules de gob-points-d'ancrage, on va (enfin) utiliser une animation de la map elle-même pour désactiver puis réactiver les propriétés du bloc pendant que le gob est présent. Exactement le comportement des blocs-question de SuperMario quand on les coup-de-boulise.

So the plan was the following: a new special block that would react to GRAB action. When that happens, it trigger the animation that actually leaves graphics untouched (with "spr0 ffff") but turns the physical tile into "plain fall-through" for 5 frames, and then restore the tile as "block 07" (thus interactive) again. Quite the kind of thing that SuperMario question blocks do on a daily basis, actually.

(It turned out meanwhile that using sprite 'ffff' did not work as intended, so I ended up adding a bbox statement to that animation -- effectively making it a special 8x8 tile rather than a 16x16 special block -- and fixed the code that plays mapanim so that "props" instruction is executed immediately rather than cached until the next "spr0" instruction)

anim9 spr:2 {
   spr0 7      # visuals for the "tile replacement",
   delay 5     # here just a Bilou hand ...
   done
}

state63 :anim9 {           # behaviour for that hand :
   using freemove          # just stay there, 
   area 0 (0,0)-(8,8) 1010 # accept GRAB hits.
}

state62 :anim9 {   # should have been the persistent state when Bilou hooked...
   using freemove
}

state63->state62 on found 0 [wc $1010 ?] (t) # detecting the actual hook-up hit
state63->nil on done                         # and disappear otherwise

using shgob(state63 is e:=1:6) as 6          # a special action to spawn the hooked hand
                                             # oh ... and it's an evil hooked hand.
block 06 {
    is gndhook "ff3c7cfebe2a2a00"  # the special tile 
    area (0,0)-(7,7) 1010          # will also detect GRAB hits
    on hit [t] (x6) :anim6         # and the 'x6' will invoke shgob registered 'as 6'
    props fc0
 }

That should have done it. I could see the hand showing up, and getting away, but I couldn't ever hook to it. I couldn't get an evidence of why it failed, but I believe it is rooted to the fact that bilou's own bbox must overlap the tile in order to trigger the "on hit" transition. but since all the hitboxes with the GRAB flag tend to be off-center, the second collision (with state63 entity) doesn't occur because there's no overlap.

Alors oui, je vous balance le script directement dans le browser. Parce que ça ne fonctionne pas. Enfin, après avoir corrigé la gestion de l'animation pour ne pas dépendre des changements d'affichage (qui expliquent le bout de terre manquant dans le screenshot là-haut), ajouté une "bbox" à l'animation (pour que le code sache qu'il ne doit manipuler que 8x8 et pas 16x16), je finis par avoir un objet qui est créé tandis que le bloc devient inactif puis se réactive ... le hic, c'est que il faut pour ça que le "corps" de Bilou soit en contact avec le bloc interactif alors que ce sont ses *mains* qui vont essayer de l'attraper. Et la zone à attraper est réduite à 8x8, de toutes façons mal positionnée... bref, je n'y arrive que 1 fois sur 5-6, donc le joueur n'y arrivera pas.

Il vaut bien mieux que je me décide à dessiner un graphisme dédié (une racine ?) et que je fasse juste un GOB dédié... il y aura des import/exports mercurial à faire ... 

At some point I thought "hmm. I'll just have the little tile be a 8x8 hitbox in the middle of a 24x24 special box, that will do the trick", but it wouldn't work either: that 24x24 region around the corner of a pillar (for instance) would have "jump-through ground" on one tile, and "air" everywhere else... how could a single "props" instruction fix that ? okay, I could introduce "props(-1,0) fc4" to change one specific tile of the block but that sounds like the coding equivalent of "just stab me now" ... 

So, likely, I should forget about that "hook to tile" thing, accept that there's very little hookspots in the Dreamland levels anyway and kickstart my NDS to draw some root sprite in green.spr ... 

MessageBox(NULL, ..., MB_OK| MB_ICONERROR)

L'an dernier, j'étais superviseur d'un stagiaire... Après avoir passé des années à essayer de donner de bonnes consignes aux étudiants, cette fois, il était à côté de mon bureau pendant qu'il codait ... un petit panneau de configuration à ajouter dans une procédure d'installation. Le premier jet de ce panneau s'est fait en Win32, pour essayer de mieux l'intégrer avec un "bon vieux programme" utilisé dans la même procédure d'installation...

On ne va pas se mentir, Win32 et ses callback, ce n'est pas franchement la partie qui m'avait tenté le plus dans la Bible du PC, mais en même temps, le fait que chaque "widget" soit adressable séparément et qu'on puisse par un petit script python retrouver sa fenêtre, cocher la case qui dit "jumbo" et cliquer sur "OK", ça a un côté séduisant ... Là où c'est beaucoup moins séduisant, c'est quand on voit qu'il va falloir appeler CreateFont() à gauche et à droite, passer des coordonnées et des tailles à tout bout de champ, appeler SendMessage() aux objets qu'on vient de construire pour appliquer le changement de police ... Puis ça devient vraiment pénible avec WS_TABSTOP qu'il va falloir ajouter partout pour pouvoir naviguer entre les contrôles de la fenêtre tout au clavier.

Puis est venu le coup de grâce: si on veut éviter que le titre ne déborde de sa barre, si on veut que les contrôles tiennent dans la fenêtre, on doit surveiller les tailles des différents objets créés ... GetTextExtentPoint32(hdc, text.c_str(), text.length(), &size);, ce n'est déjà pas très sexy, mais il faudra l'emballer avec 4 lignes de code supplémentaires rien que pour connaître la longueur d'une chaine en pixels ... oh, pas que ç'ait été plus simple avec freetype, celà dit. Mais quand on pense qu'on y est, on essaie d'ajouter un SetWindowsPos(..., SWP_NOOWNERZORDER|SWP_NOZORDER) pour pouvoir faire défiler la fenêtre dans le cas où il y aurait plus de cases à cocher que prévu ... et on voit qu'il va falloir se renseigner à la main avec GetScrollInfo(), gérer à la main les SB_LINEUP, SB_LINEDOWN et même SB_THUMBTRACK (pour le cas où l'utilisateur aurait déplacé l'ascenseur directement ^^"), s'envoyer soi-même les up/down en cas de WM_MOUSEWHEEL... déplacer chacun des objets contenus dans la fenêtre à coup de h2 = GetDlgItem(h,i); GetWindowRect(h2); MoveWindow(h2) sans oublier de convertir entre coordonnée-client et coordonnée-écran ... et tout ça pour quelque-chose qui clignotte affreusement. Autant dire que quand le frère de Jigé a proposé "de faire ça plutôt en C#", la bataille n'a pas été bien longue pour défendre le proto actuel ... on était plus proche du Turbo Pascal que de l'HTML, en fait

(tout de même, c'est perturbant de re-croiser du code qui fait un CreateWindow(..., BS_PUSHBUTTON, ...) plutôt que d'avoir CreateButton ...)

Wednesday, February 12, 2025

$VSWHERE

Okay, that's truly worth another "rongtudju" entry. I have to build with Visual Studio from times to times at the office, but I also work remotely from times to times. Of course, it's been ages since I installed sshd from mingw packages, and I'd rather call the build system from a ssh console when I'm remote than having GPUs trying to squeeze console activity into H.264 and show it on my screen. And it has been working happily for a good amount of years.

Then something bad happened, and as soon as the build system will try to invoke any of visual studio core programs, I would get error messages about

'cl' is not recognized as an internal or external command, operable program or batch file.

One key element of our build system is SCons, which I'm not fan of, but at least I can enter that and hack around now. Especially, I can see that no matter whether I set the $PATH environrment variable on the command line to include c:\program files\microsoft visual studio\...\bin\Hostx64\x64, the env['ENV']['PATH'] that scons will use to invoke the compiler will be empty.

If I decide to hack the 'CC' variable directly in Tools/msvc.py, I can make it compile stuff, eventually. But I had to dir /s stddef.h and others to get all those include path right. And it will stab me in the back as soon as I'll try to build a driver instead. Not to mention that of course, it doesn't help for other tools like lib.exe or link.exe ... 

A bit more rubber-duck-talking led me to VSINSTALLDIR hunting (and VS_VERSION hunting) in more python files, trying to find what is the normal way for SCons to decide which visual studio to use.

I know about the vcvarsall.bat script that "native developer console", but I doubt it would be used in a mingw-bash-scons-whatever-cl.exe setup, or at least not directly. And then, only then, I noticed the warning that the build tools had been trying to show me from the very beginning:

scons: warning: MSVC version '14.3' was not found.
  Visual Studio C/C++ compilers may not be set correctly.
  Installed versions are: ['14.0']

That was coming from Tool/MSCommon/vc.py, in a file that is mentioning $VSWHERE every now and then. Some more rubber-ducking and more dir /s revealed c:\program files x86\Microsoft Visual Studio\Installer\vswhere.exe ... and if I somehow force it into env['VSWHERE'], I no longer need to hack env['CC'] and env['AR'] to get a working build. Higgs! I even get the whole sub-project built just fine ^_^

Of course, the VPN dropped all my connections again a few minutes afterwards ... just enough to see whether I can get that running two times in a row, I guess...

Thursday, February 06, 2025

smasher pixel study

Fin janvier, je suis tombé sur un élément intéressant dans une vidéo de Ristar que je n'avais encore jamais rencontré: un gros poing sculpté dans un bloc. Intéressant parce que je n'ai pas encore de rendu convainquant pour le gros-bloc-écrabouilleur pour ma pyramide. 

J'ai commencé par le redessiner plus ou moins tel quel avant d'en déduire une version tournée vers le bas (et donc avec un autre genre d'éclairage.

You know, I'm still trying to get something convincing as big smasher for my pyramid level. And after a good deal of not-so-convincing too-realistic designs, I stumbled upon an interesting reference while watching a playthrough of Ristar. A big, closed fist, that looks cut out of a concrete block... Interesting geometry to say the least.

So after first trying to reproduce the design, I tried doing it flipped-down, with adjusted lightning to match it ... I also tried make a sort of perspective shift, observing that the lateral view is also iconic of a closed fist ... None of that has been converted to pixels yet. 

After those, (way after. This is almost necro-blogging) I eventually went into that Super Mario Wonders level with big Bowsers fists all over the place... clearly Mario Wii / WiiU fists had been an inspiration for the original design, and clearly too, the weird look of cast-hot iron won't help me giving my own art a fit-a-pyramid look ... But it shows me right now that 5-fingers fist will never look fit in Bilou's world, where things have at most 4 fingers -- Mickey-style -- when they have fingers.



Bref, c'est joli, mais même avec une permutation isométrique reprojetée, il reste un truc qui cloche ... et peut-être que malgré leurs couleurs inexploitables, les poings de Bowser viennent de me donner la réponse: dans l'univers de Bilou, un poing à 5 doigts, c'est un doigt de trop.

On va donc reprendre le cours de Helm (maintenant qu'il est en ligne ^^), une série de gants de Mickey Mouse et essayer de se construire un gros poing bien lourd et bien bilouteux pour faire du jus d'intrus dans cette fameuse pyramide ...

Et non, ce n'est absolument pas un point prioritaire sur aucun des non-plannings ... donc ... on le fait en moins de 15 jours ^^"

Tuesday, February 04, 2025

back then ... geometry first.

Dumblador revisit post from October 2011 featured not-so-great book covers and "colour balance" post 20 days later featured them almost identical. Then 10 more days and they suddenly look like in School Rush. What happened in between ? pixel art Comment and Critique. "I think you're focusing way too much on using techniques right rather than the objects itself" said Elk, but I couldn't figure out what that meant. "The biggest problem with your art is bad texturing, at this point, I'll return with specific edit and critique." So Helm Returns is what happened. 

En triant un peu, je suis retombé sur un post du forum pixelation qui répond à une question que personne ne se posait. C'est qu'entre le relookage de Dumblador (Oct. 2011) et la recherche des couleurs idéales pour la School Zone (Nov. 2011), on est passé d'un livre pas très convaincant au design actuel utilisé dans School Rush (et qui restera certainement inchangé pour Dreamland). Dans ce post, Helm me donnait une série de conseils en retouchant lui-même le livre que j'avais dessiné.

1. is your book.
2. is the form broken down to its block shape.
3. is geometry, lit from above more or less. If a thing doesn't look good and identifiable on this stage, it won't look much better if you overrender it.
4. here I apply more detailed geometry, I still don't need more colors or fancy tricks, I don't need to fake texture, it's just stuff that the book can support. I also looked at reference here which you should always do, no matter how cartoony what you're trying to draw is. You can spot many differences from 3 to 4 that are related to the reference.
5.After the shapes are good, identifiable and the object has volume, you can go nuts with your new school colors and tints and whatever else, it's all embellishment from here and on.

Le jeu, dans ce cas-là, c'est d'essayer de réappliquer soi-même les conseils qu'on a reçu. A savoir ici "commence par la forme brute, puis fais en sorte que la géométrie soit compréhensible". Ne pas aller au-delà de l'étape 3 si quelque-chose va de travers. Ensuite, rafiner la géométrie mais ne pas texturer, ne pas partir dans des grands effets de couleur. Une excellente leçon, et je vais en avoir bien besoin pour m'attaquer au gros poing pour la pyramide ...

So I went on and try to apply the master's suggestions to get closer to what I wanted:

My attempt at having the right geometry with flat shading and minimal details, my step of putting more detailed geometry and shading before adding any texture, and the final take. The page lines have become too horizontal and dull, retrospectively, but the binding has been used almost as-is in the game.

It was a pleasure to read the master's comment:

Much, much better. Wouldn't surprise me to see this piece in any professional good looking mega drive game of the era.

Approach all real-life related items you render in a similar way, avoid 'noisy textures' for their own sakes and you will level up in your craft."

A lesson to remember as I'll have to work on more pixels for the upcoming game...

Tuesday, January 21, 2025

Have you tried melonDS ?

Have you tried using melonDS for DLDI-based homebrew? It's my personal preference, it emulates the DSi too, and it's getting GDB support for debugging soon (though not yet). (@asie.pl) [...]
It's free software (doesn't even require any dumps for DS mode, though hardware dumps are required for DSi emulation) and I use Linux exclusively.

This post was a draft last updated on 20th November ... Asie's comment was from March 2023, after I tried to get my demo running on 3DS and believed it wouldn't be hard to fix DLDI support in desmume... (but I was wrong)

And today I just notice that I do have "hobby/melonDS" folder in my fresh-Debian laptop. 111MiB of cmake & dependencies later, I can rebuild the emulator (got hell lots of warnings, but it did build) and managed to make it load and play the current "Three Rooms of Dreamland" demo.

It has polished UI for setting keyboard/joystick, it has much more stable sound output than desmume had and did load my files properly, despite I couldn't do it from the command line yet (EFS files wouldn't be found unless I use the menu to load the .nds)

It has a nice "DLDI" entry indeed, where you can define some appealing "sync SD to folder" ... but I'll have to read more documentation if I want to make any use of that. If it can let me use Level Editor for DS straight on files hosted on my laptop, that could excuse the lack of a GDB stub ...

No fancy VRAM preview or any similar power-emulator as those I've seen on 8-bit and 16-bit console emulator either ... sigh.

Sunday, January 19, 2025

Debian pour Icebear

Une surprise 2025 dont je me serais bien passé: le laptop du bureau ne fonctionne plus avec le lecteur de cartes d'identité belges ... selon jigé, ça marcherait mieux avec Edge ... très peu pour moi. Le couac, c'est que ma bonne vieille distribution ubuntu ne sait plus faire les mises à jour non plus. J'ai donc passé un moment à essayer de faire tourner d'autres distro dessus, à commencer par une RockyLinux (j'avais déjà l'iso) qui n'a pas réussi à booter, puis la LTS d'Ubunutu (24.04) pour laquelle j'ai dû chipoter (boot UEFI obligatoire) mais qui n'a pas su utiliser eid.belgium.be une fois tous les package installés. La raison ? les gens de chez Ubuntu sont fan du système "snap" et firefox se retrouve maintenant lui aussi dans un "snap".

Bon, j'avoue que moi, je ne suis pas franchement fan de snap. L'idée était sympa quand il s'agissait de recevoir un jeu et ses dépendances sans venir mettre des crochets dans toutes les bibliothèques du système, mais quand on retrouve gnome-dans-un-snap ou firefox-dans-un-snap, franchement, pour la gestion du disque sur un système pas si tera que ça (typiquement je limite la partition système à 42Go), ça devient vite pénible. Et là, en plus, ça rend une fonction primaire du système (remplir la déclaration d'impôts) impossible, donc ciao.

Où trouver une distribution Ubuntu-like qui n'utilise pas snap ? Debian, tout simplement.

Alors pour les non-pingouins d'entre vous que le paragraphe sur snap n'a pas fait fuir, debian c'est la distribution sur laquelle Ubuntu s'appuie. En gros, des fans de debian ont un jour voulu faire en sorte que leur linux soit plus accessible, capable de lire des mp3 nativement, avec une configuration plus simple de la connexion internet, etc. et ils ont lancé Ubuntu avec tout ce qu'ils avaient préparé.

Et donc, quand on vient de lancer une version démo (on dit "une live", nous autres ^^") d'Ubuntu et qu'on lance juste derrière une version démo de Debian 12, il y a quelques surprises ... comme "ehM pouraoui je suis en qwertyM" parce que le module de boot ne prend pas son temps à vous poser des questions avant de débarquer sur le bureau. Ou "Eh ? comment, perdu.com n'est pas joignable ? " pour me rendre compte que "ah bah oui, le wifi n'est pas configuré ^^" ... de nouveau, ça faisait partie des questions préliminaires avec Ubuntu.

Mais, youpie, le package de support des cartes d'identités, lui, marche bien, y compris dans firefox. Enlightenment et terminology sont disponibles et je pense bien avoir pris un package "mate" plutôt que gnome. Alors qu'est-ce que je fais encore sous ouinouin plutôt que de prendre en main ma nouvelle debian ? Eh bien, c'est que le boot system du laptop, ce n'est pas UEFI de base. Et j'aimerais le garder en dual boot. Et il y a une commande pour grub (1) qui devrait me permettre de détecter la debian et l'ajouter depuis ubuntu ... je voulais vérifier ce que c'était avant de lancer update-grub en aveugle (qui n'était évidemment pas dans la liste des grub* que je testais puisque ... lol ... il *finit* par grub là où tous les autres outils *commencent* par grub ^^"

edit: voilà: ça boote. Maintenant, copier les signon.json et autre key4.db pour que le nouveau profil firefox puisse avoir mes identités, copier le répertoire .e pour récupérer ma config enlightenment ... forcer un peu l'affichage de firefox pour que ce soit supportable

edit+: bon, si je veux pouvoir faire tourner mon bon vieux desmume de référence, je vais devoir suivre mes instructions pour ajouter le support 32-bit ...

edit++: "lili usb creator" est manifestement prévu pour créer des clés MBR. Si la machine-cible est configurée en GPT/UEFI, c'est mort. Dans ce cas-là, c'est rufus qu'il nous faut.

edit+++: manifestement, sous debian, il faut mentionner .bashrc explicitement dans son .bash_profile ^^"

Saturday, January 18, 2025

Hydrocity pixel waterjets

Bin ça! Il y avait un parfait exemple de jet d'eau dans un jeu 16-bit dans la série Sonic, et j'étais complètement passé à côté! Heureusement qu'il y avait Tim pour poster une photo de son Anbernic Arc-S pour me remettre sur le droit chemin!

L'effet est plutôt convainquant, plutôt utilisé comme script de transition/narration entre 2 phases que véritablement comme un élément de gameplay interactif, mais ça reste pertinent. Il reste un peu moins de 2 secondes à l'écran avant que Sonic ne soit propulsé plus haut tandis que le jet redescend et sort du cadre.

Last year, I was looking for 16-bit references of a water jet and I couldn't find anything satisfying, but it seems like I completely missed those location-transition-events in Hydrocity Zone act 1 of Sonic 3. I hope you'll excuse me: my memories of Hydrocity essentially resume to "this place hates me". Trying to keep enough air in Labyrinth Zone wasn't easy, but it felt possible and a sort of appropriate final challenge in the game. You'll completely miss the water jets if you're watching a speedrun or any competent player as well: they're sole purpose is to bring back upwards player who failed to stay on the high dry path.

ça se passe dans Hydrocity, la deuxième et parfaitement imbuvable zone de Sonic 3. Il se trouve que j'ai le jeu sur une cartouche combo Sonic Genesis 2D pour NDS et j'ai donc fait l'effort de retourner jusque dans Hydrocity, mais sans encore arriver jusqu'au jet vertical pour me rendre compte par moi-même.

Il faudra pour ça, une fois le jet horizontal passé, que je m'aventure dans les profondeurs jusqu'au couloir avec les hélices qui nous poussent vers la droite. ça malgré les pics, les poissons mal foutu et les tapis qui nous ramènent en arrière juste quand on est sur le point de pouvoir reprendre de l'air ... C'est beau le rétro, mais là, c'est quand même pas loin de l'abus vu qu'on est encore qu'au 3eme stage du jeu ... 

For the era, they seem to work surprisingly well. They only need 4-colors palette cycling, and are even somewhat light on tiles consumption, with a 32x32 pixels pattern (plus mirroring) for the trunk and 32x48 for the top (and even one 16x16 block of the top being shared with the trunk). You've got one big arc per pattern, which clearly works better than the repeated pattern of Mc Donald's Treasure Land Adventure. (although, this is not the worst water animation in that game ...). Note too how the top part uses the raster in opposite direction so that it feels that water is falling down there. (yeah, obvious, I know)

Bon, mais trève de rouspétances, regardons ces pixels. l'artiste s'est concentré sur un motif d'arc répété avec un dégradé plein de tramage (plutôt une bonne idée sur la technologie CRT de l'époque) pour finir par un arc de cercle plus arrondi où le dégradé est mis à contre-sens.

Le tout est évidemment animé par palette cycling ... ça vaut mieux vu la surface à prendre en compte. A noter aussi la grandeur du motif. On a pas essayé ici de faire de petites vagues répétées: la partie "champignon" est constituée d'un seul dégradé ! Du coup, c'est bien l'effet "mouvement" qui prévaut sur l'effet "clignottement".

The pattern is rather noisy, but that shouldn't be a big issue for the CRT screens it is designed to. Given the size of each area, the motion illusion prevails over the flashiness. At least when played at 75% of the intended 60fps. Maybe it also worked at 60fps on CRT screens (we had 50Hz here, so who knows ...). 

All I can tell you is that it took me dedication to bring Sonic in the proper spot(s) of Hydrocity on my Sega collection for Nintendo DS cartridge and on the 3DS LCD screen the result was ... meh ... mostly getting a averaged blue tint all over the jet, the pixels staying in place for most of the 2 seconds where we see the jet, with my brain saying "ah! I spot the pattern!" rather than "wah! That's blasting fast!".

So well, it was a nice reference at the time. I mostly works because you're taken off-screen once the jet should retract and because it's a one-time event rather than what I need (a trigger-on-demand event) or what Mc Donalds and Bubsy games needed: an platform going up and down continuously.

J'affronte donc une deuxième fois le niveau, fort de la carte mémorisée ... il y a surtout des zig-zag imposés à toute allure entre les deux jets d'eau du niveau 1 (aucun dans le niveau 2, qui a besoin de ces tiles-là pour nous mettre plus de toboggans). Je peste contre les poissons-pirhaña qui m'empêchent de sauter pendant plusieurs secondes alors que les bulles d'air ne sont suffisamment grande pour respirer qu'à partir d'un sonic du sol ... je choppe un bouclier-bulle ... je le perd ... je suis propulsé une 2eme fois.

Eh bin, les gars, l'effet "mouvement", à 60fps sur un écran LCD, il est un peu perdu dans la bagarre ... on voit juste une trombe bleue d'une couleur plus ou moins uniforme tellement ça va vite. Un peu déçu, je vous l'avoue.