Thursday, January 28, 2021

Une histoire de police

 C'est la série de p'tits fanart pixelisés de Rephil qui m'a mis la puce à l'oreille: une police en pixels, c'est quand même bien plus lisible avec un ombrage. Surtout quand on est pas déjà en noir-sur-blanc. (ou blanc sur noir). Et vous savez quoi, il arrive à le faire même en 5x5!

I guess it is the checkerboard pattern of Rephil's  (pixel|fan)art that lead me to realise is so much more readable when you drop a shadow. (yeah, that took me 15 years). So maybe it would be worth it to do the same on the DS for my game tools, right ? And maybe I could even push it further and use 'drop shadow' to indicate that some specific text is interactive! Someday ... maybe... Clearly not a high-priority thing to do.

Alors bin avec mes caractères 8x8, sur DS, il n'y a pas de raison que je m'en prive, si ? Dans presque chaque caractère, il y a une ligne vide en bas et une colonne vide à droite pour éviter qu'ils ne se 'collent' l'un à l'autre. Et ça n'est absolument pas gênant si les pixels d'ombre se colle aux pixels blanc des caractères suivant.

Petit mockup de ce que ça donnerait... On peut même raffiner en utilisant ce truc que pour les caractères "interactifs" des widgets. On peut même utiliser une couleur supplémentaire "highlight" qui disparaîtrait quand on active le widget alors que l'ombre passerait à la couleur de texte pour donner ce petit effet interactif "le bouton s'enfonce quand je pousse dessus" qui fait toujours du bien.

Maintenant que je suis passé à du multi-palettes dans tous mes outils, pourquoi s'en priver ?

edit: oh bin justement, quelqu'un a mis en ligne une belle collection de polices bitmap issues de la demoscene...


Tuesday, January 26, 2021

MechaSkull's ninja

J'ai à peine atteint le boss des catacombes dans The Messenger que la nouvelle tombe: Cyber Shadow, le jeu de ninja de MekaSkull sort la semaine prochaine demain aujourd'hui. Un jeu dont j'ai suivi le développement avec plaisir et assidûité ces dernières années. C'était d'ailleurs un de mes plaisirs sur twitter pendant les années creuses de mon blog: découvrir un nouveau screenshot animé de MekaSkull, et imaginer la raison d'être de ce qu'on voit ou des variantes pour un retour-plus-tard-dans-le-jeu.


Prenons les barrières électriques intermittentes et les "chausse-trappes" à coup de sol qui s'électrifie par moment, par exemple: en introduisant des 'générateurs d'impulsions' (les ronds rouges), MekaSkull permet à la fois de mieux visualiser les timings complexes (façon guitar hero ?), mais aussi nous permet potentiellement de chercher par quel détour on pourrait aller les désactiver et rendre le passage moins hardcore. (s'il ne l'a pas fait dans Cyber Shadow, j'ai bien l'intention de faire ça dans la pyramide de Bilou, d'ailleurs).

Vous aurez probablement compris si vous avez cliqué sur quelques liens pour aller voir les vidéo de gameplay que MekaSkull avait postées qu'on est -- au niveau de l'intrigue -- à la croisée des chemins entre un Ninja Gaiden et un Matrix. Et je dois dire que ça me convient bien.

Il ne manque pas de vidéos sur Internet où les développeurs -- quelle que soit leur expérience -- cherchent à résoudre le problème des 'ennemis stupides' dans un jeu "moi contre le monde". Même la Développeuse du Dimanche y passe [citation requise]. Pourtant, dans ce genre-là, c'est presqu'indispensable d'avoir des ennemis un peu stupides. Pas forcément au point de se jeter d'eux-même dans les trous à la goomba, mais vu leur sur-nombre sur nous, c'est ça où nous rendre tellement blindé d'armure qu'on se demande comment on arrive encore à bouger.

Pour moi, le setup 'cyberpunk' avec des robots comme adversaires offre une excellente justification: ce ne sont que des machines. Une tenue de camouflage peut en effet faire en sorte qu'elles soient 'myopes' comme des taupes. L'absence d'instinct de survie peut expliquer qu'elle continuent à faire leur ronde bien qu'on vienne d'éliminer trois de leurs clones, etc. Et on peut matérialiser la borne qui leur envoi un message de 'fin de recherche' si elles n'ont pas trouvé leur proie au bout de 20 secondes (et donc détruire cette borne si on veut).

On peut même justifier leur montée en aggressivité au fur et à mesure qu'on progresse dans le jeu par des mises à jour un peu rushées du genre "dévier l'alimentation vers la coque en cas de choc inexpliqué" (traduction: l'ennemi qu'on utilisait jusque là comme plate-forme va pouvoir maintenant s'électrifier après 1 seconde quand on lui tombe dessus, mais en revanche, ça vide ses batteries pour nous tirer des boulettes dessus).

Enfin, voilà. Avec le soucis du détail qui a été mis dans ce jeu, j'espère très sincèrement qu'il retiendra l'attention des sélectionneurs de l'Ultime Décathlon!

Monday, January 18, 2021

spr.load+

The next big step for my game engine to be capable of running project “Bilou  Dreamland” is overlay loading. In all my previous games, there was one main tileset and sprite set that contained all we needed. Monster, hero, Pick-ups. Anything that had to be animated sat together in that file…

Bon, prochaine étape significative pour le développement sur DS: faire en sorte que le game engine puisse charger les graphismes "en deux temps", en particulier pour les sprites. J'aimerais bien éviter de devoir répliquer le graphisme de Bilou sur plusieurs spritesets, tout simplement.

Et ouaip, j'étais prêt à lancer ça en début de congé de Noël, puis je suis laissé distraire par un 'to branch or not to branch', *deline m'a chipé la tablette pour lire du Ewilan, et moi je me suis mis à faire du déterrage de brouillons :-/

C'est ça, la quarantaine: ou bien tu code, ou bien tu blogges. Les deux, c'est niet.

In order to come up with a “world 2” that features new creatures, this has to change. Especially, I want to have a single “Bilou.spr” containing character animations for all moves. The engine will then complete this with world-specific monsters and NPC data. When you think about it, the very reason why there’s never been a level 2-1 in my BASIC games was because  I couldn’t find the proper solution to this design challenge.

Mais, allons. Ne soyons pas défaitistes: c'est pas que je n'aie rien fait sur DS pendant les vacances. Juste que je n'ai pas fait ce que j'avais prévu, et que j'ai complètement perdu de vue depuis ce que j'ai fait depuis ce moment.

Plutôt que de me lancer dans une nouvelle branche, j'ai stabilisé et consolidé les différents outils.

edit: j'ai déjà quelques p'tites modifications qui donnent pas mal.

Par contre, il faudra que je réfléchisse à un moyen de valider que tout ça fonctionne bien comme prévu.

Well, I was about to start this at the start of xmas holidays, and then *deline picked up my boox to do some e-book reading while I was wondering whether a new branch would be required or not and then I ended up spending the holidays posting some very old drafts. Welcome to being 40: blog xor code.

well, nor the whole holidays, actually . I’ve still been able to do some ndsdev, just not the kind of things I expected. Tools are now stronger and more reliable. I’ve finally started to code something for it, but I need to figure out how I am going to test that.

edit 30/1: j'attaque...
edit 2/2: sprdo could help testing it.

Sunday, January 17, 2021

Big Level Objects (take 64)

En jouant à Rayman Origins (oui, je continue le mois du déterrage de vieux brouillons), j'étais arrivé à la conclusion que les gros morceaux de niveau mobiles étaient devenu un élément incontournable du level design moderne dans les jeux de plate-forme.

Et le post de ce week-end de Ishi sur l'implémentation des bateaux dans son projet en cours: Leiliani's Island me rappelle (encore une fois) que je n'ai pas encore de solution convaincante pour faire ce genre de chose dans GEDS.

Calling them 'a new trend' would be a misnomer. Big Level OBjects are a major trait in many modern (post-3D) platformers. It is pretty obvious if you start playing Rayman Origins after playing the original Rayman game: the level is no longer split into a static grid of tiles versus few movable things on which you can walk anyway -- platforms. Now it looks like the very substance of the level may be moving freely. Movable objects may be significantly larger than your character and yet not looking significantly different from the rest of the level.

Having something large that you can walk on already existed in the original Rayman game, but you would have a clue that it introduces a temporary and distinct gameplay.

If you're in your level editor, you can easily make that cymbal look like 'here be cymbal' icon just like there are 'here be Robo Red' in Commander Keen's TED tool.

Pour moi, ces objets devraient être construits dans l'éditeur de niveau. Idéalement même en même temps que le niveau lui-même pour que les choses s'assemblent bien.

Et bien sûr, il y avait eu des précurseurs avant Rayman Origins. Le meilleur exemple étant peut-être les plate-formes qui s'enfoncent dans la lave et prennent feu dans la Marble Zone de Sonic 1.

Les BigLevelObjects sont plus gros qu'une simple plate-forme et s'intègrent normalement mieux dans l'environnement qu'une plate-forme mobile.

De par leur taille, ils sont à la fois plate-forme mobile, écrabouilleurs, du sol qui s'écroule

In contrast, when you add what I call a Big Level Object, you want the level editor to show precisely how big it is. You may also want to have the flexibility to change its look like you'd change the look so that the level doesn't look repetitive and artificial despite it's using lots and lots of Big Level Objects.

Having them integrate one key element, another one is that their function can no longer be described by a single trait. Platforms can be walked on, and that's it. The big moving rocks of Rayman Origins can be walked on, but they also block your path, they can be climbed on -- just like normal rock structure in the level --, and they can crush you.

They can host other decorative elements (the big palmtree) or interactive elements (the red thing), just like normal ground would do.

Notez aussi qu'ils peuvent être gros assez pour qu'on y mette des objets décoratifs (les palmiers) ou interactifs (le truc rouge).

Bien sûr, dans le code de Rayman Origins, il n'y a pas besoin de se demander si on va faire ça avec des sprites comme dans Sonic ou avec un plan de tiles dédiés comme dans le niveau-écrabouilleur de Super Mario World: que les blocs soient fixes où mobiles, ils sont tracés avec des polygones et il n'y a pas de raccourci possible avec une tile map (enfin, je crois) pour les collisions avec les blocs fixes.

Of course, part of the original 'structure vs. platform' split comes from the technical restrictions of tiles + sprites video hardware that prevailed in the 8-bit and 16-bit era.

There had some BLObs in 16-bit games too, though. Like those sloped ground that dip into lava in Marble Zone or the yellow layer in Donuts Plains 2. Likely, it was done with a dedicated second tiles plane that is scrolled up and down independently from the base tiles plane of Mode 1 and the yellow things doesn't seem to need more than 3 colors + transparency.

(that would mean that the parallax background of that level uses the same plane as the HUD and that an interrupt will have to change priority and scrolling on the fly, unlike what happens with other areas of the game).

Nowadays, with most games using polygons-based hardware, the distinction doesn't hold anymore.



Saturday, January 16, 2021

La bannière du désert

 

Ça fait un paquet d'années, maintenant, que cette bannière verte vous accueille sur mon blog, avec comme message "rendre le rêve réel". Et j'ai déjà expliqué à plusieurs reprises: voir ce pas-si-p'tit Bilou sur le point d'atterrir sur sa souche, ça me motive à continuer, jusqu'à ce qu'on puisse voir Bilou amortir sa chute sur Nintendo DS, que le Dumblador se mette à marcher ou qu'on puisse sauter d'un encrier à l'autre pour continuer son ascension.

I need to find daily motivation to bring life to the pyramid level in Bilou's Dreamland. I had no only little issues designing for the School Zone because it was easy for me to imagine talks and accidents featuring school supplies. Plus, any random errand could make me bump into some supply I hadn't thought about so far, which in turn triggers more game design ideas. But we're a bit short on lost temples and pyramids around here.

So given how many times the former, green banner pushed me forward making things become real, let's try to make a new pyramid-themed banner with what I already have and see whether that pushes me to make that level turn true, will we ?

Et bien que je sache depuis la fin de School Rush que c'est la pyramide qui m'attend, je n'ai pas encore vraiment démarré. Alors voilà: pour me donner du coeur à l'ouvrage, on va changer la bannière pour quelque-chose qui mette en scène les prochains objectifs: la pile-zombie, le serpent-de-sable et la possibilité pour Bilou de rester suspendu à des choses.

On verra bien si ça marche ou si la perte de verdure me fait fuir encore plus ...

En tous cas, ça plaît.

Friday, January 15, 2021

Les démos

 Après la bafouille sur "Titanic Death by a Worm", vous avez peut-être l'impression que la démoscène, c'est une page que j'ai tournée depuis longtemps. Dans un sens, vous n'avez pas tort, mais n'allez pas croire que j'aie coupé tous les ponts pour autant.

Bon, d'accord, depuis 2005, je n'ai clairement plus un PC capable de faire tourner des productions récentes, et depuis que youtube a débarqué dans l'équation, j'avoue me contenter de regarder des vidéos des démos plutôt que les démos elles-même. Le fait que j'utilise mon PC aussi pour les paiements en ligne et qu'il tourne Linux n'y est pas complètement étranger.

J'essaie aussi de me tenir à la page, et de ne pas sombrer dans le nostalgisme à ne regarder que Heaven Seven ou Second Reality. Non, chaque année je creuse comme je peux pour essayer de trouver les pépites publiées dans l'année. Pour 2020, selon moi, c'était Apex par Bitbendaz

Je salue bien sûr tous les afficionados de l'Amiga et du Commodore 64 qui continuent à donner de leur temps pour que leur idole survive. Mais je dois reconnaître que ce n'est pas l'esthétique qui m'interpelle. En 2018, ma démo-fétiche, c'était par exemple "Reboot" d'Umlaüt Design.

Et la découverte de 2019, c'était "ninjadev" avec des titres plus exotiques les uns que les autres comme Construct (bravo les Légos), Flat shade society (bravo le jeu de mots) ou What are you syncing about (bravo la bande son)

Thursday, January 14, 2021

Flexible!

I remember how adding bounciness to the erasers bumpers felt and how I immediately wanted to have some erasers all over the games to be bouncing as much as I could. So wouldn't it be a shame if the branches of the Green Zone were all static platforms while they could be slightly bouncing you higher instead?

Les gommes qui rebondissent, c'était bien gai. Surtout quand elles se sont mises à bouger en réagissant à notre présence, au point que j'avais envie d'en rajouter partout dans le jeu. Du coup, en repassant sur le level design de la green zone, je me suis dit que ce serait dommage que les branches des arbres restent raides comme des piquets alors qu'elles aussi pourraient nous propulser dans les hauteurs. Oh je ne parle pas d'un bumper à la Sonic, mais si ça pouvait nous faire monter déjà de 1.5 blocs de plus que le saut standard (3.5 blocs), ce serait chouettos.

 Note that I don't meant to change them into Sonic-like bumpers. I said "slightly higher", like your jump would be 5 blocks high rather than 3.5, but still high enough to make the trip fun, and the top of the trees higher to reach without cluttering the screen with leaves.

I don't know yet whether I can do that with animated tiles alone or whether I need to switch to sprites while animating, and then back to tiles à la Super Mario brick blocks.

And before I'll dig deeper into such technical thoughts, I wanted to check what it'd look like. Apparently, just lifting tiles up and down by 1 pixels would produce a decent effect. That was quite some month ago. (you can't notice it, but there are two frames (one full-low and one full-high) merged into that picture).

Après un petit essai en torturant une ancienne capture d'écran, la première question sur laquelle je me penche c'est "tiles ou sprites". En clair, la branche va-t'elle se comporter comme un 'monstre' fort peu mobile ou une pente un peu bizarre. Avec un effet correct rien qu'en décalant d'un pixel de plus à chaque prochain tile, que je n'ai malheureusement pas 'filmé'.

Depuis, j'ai eu l'occasion de faire un test avec AnimEDS -- beaucoup moins concluant -- et de recompter le nombre de fois qu'une telle "branche" est présente dans les différents niveaux déjà réalisés pour la Green Zone. A savoir un maximum de 4. A ce stade-là, je peux franchement tolérer une approche "100% sprites". Même pas besoin de passer d'une image "décor" à une image "sprites" à la demande comme pour les bloc-question de Super Mario quand on les bouscule. En tous cas, pour Bilou's Dreamland, je vais prendre le risque de supposer que je n'ai pas besoin de faire des optimisations là-dessus.

Last week, I did some more tests with AnimEDS but I couldn't come with a convincing animation for the branch (modeled as some set of green balls). Also, I counted how many such 'branches' I have in existing Green Zone levels, and there is at most 4 of them per level. So there is no real pressure to do this 'made of tiles' rather than 'made of sprites', so the upcoming Bilou's Dreamland game will be a test of whether doing such level elements with sprites is a working strategy.

Et du coup, si c'est du "tout Sprite", pourquoi ne pas se faire plaisir et coder quelque-chose à base d'une animation d'un 'squelette' qui indiquerait où placer les sprites plutôt que d'animer à la main ? Avec un angle égal entre chaque segment, on a un rendu assez fidèle de 'branche qui plie'. En variant la valeur de l'angle, on peut redresser la branche, etc. tout ça fait des schémas assez sympa à dessiner...

I think I'd also check whether such things can be animated based on a coded skeletton rather than with pre-built pixels. Or at least I could be tempted to do that, but it could turn out to be a bad move, despite it having some definitive appeal. Dedicated pixels could provide better motion that code-driven shifts of still pictures.

I mean, look at those neat diagrams where adding a constant alpha angle at each segment produces a nicely curved branch, and how applying a weight at the middle of the branch only curves one half, and let the other half unchanged. And how having a maximum-alpha threshold will affect how easily the branch bends with weight.

But ultimately, the object isn't that big. It might turn out that weight-at-the-edge only differs from weight-in-the-midle by a few pixels. And similarly, a 'big bounce' and a 'small bounce' might differ only by not using extreme frames.

Mais ce n'est pas forcément l'approche qui donnera l'animation la plus sympa. En particulier compte tenu du fait que la branche à animer n'est pas bien longue.

Cogitons un peu. Si je donne une pente d'1 pixel de dénivelé au bout de 8 pixels en avant pour le premier segment, le 2eme segment, devrait avoir un dénivelé de 2:8, puis on sera à 3:8, et ainsi de suite. Avec cette valeur de alpha, une branche de 6 segments de 8 pixels peut déjà s'approcher d'une pente à 45°.

Mais surtout, ça me donne une manière facile de tracer ce genre de courbe dans SEDS et de tester des animations de baguettes diverses (raides comme une latte ou souples comme une branche de sapin) à partir de 4 valeurs de courbure et une inclinaison maximum à 4:8 (valeur à partir de laquelle il faudra 'raccourcir' le traît de 10% pour tenir compte de sa diagonale).

Saturday, January 09, 2021

Intrepid Izzy

 Bon, je vais devoir présenter d'avance des excuses au Senile Team: Intrepid Izzy n'est pas franchement un jeu dont j'attends la sortie. Ne vous méprenez pas, hein: ça a l'air plutôt bien fait, en plus c'est prévu pour être un homebrew dreamcast et c'est un jeu de plate-forme. Ils font même des vidéo devlog et ils ont même un blog. Donc, en fait, je devrais être fan de leur travail. Mais voilà: je n'y arrive pas.

Il y a un quelque-chose dans l'animation du personnage que j'assimile à l'époque des jeux flash, qui trouve aussi des échos dans certains choix artistiques comme les contours noirs autour de l'herbe ou les fleurs à la tige raide comme une baguette. Le fait d'avoir choisi une caisse en bois comme objet à pousser dans le temple perdu ...

I guess I should have expected it. See, there are people doing homebrew on 32-bit Dreamcast console. Although we're at the border between homebrew and indie here, with Senile Team envisioning Steams sales in addition to a SEGA homebrew.

There's a good deal of qualities in that ongoing development platformer, that's un-deniable. Unfortunately, while checking the videos, I fail to get that excitement that Giana: twisted dreams or Ziggy triggered. I don't feel like detailing the why. They aren't really flaws, just mismatch of tastes, I presume. I could summarize by saying that the look reminds me of Flash animations, and I've never really been a fan of flash games. But they have nice art, including art in the desert. And All platformer references showing desert environment without going for super-cliché Egyptian Pyramid is welcome for my own Desert Zone ...

 Je sais, c'est peu de choses par rapport au travail fourni et indéniable (regardez-moi ces rochers et ces sapins!). C'est bien pour ça que j'ai passé le truc sous silence jusque-là: le projet mérite qu'on le soutienne, pas qu'on en critique les petits détails perfectibles.

Alors pourquoi en parler maintenant ? Eh bien à cause de leurs couleurs pour l'environnement "temple/pyramide", évidemment!

#300030 + #5c2744 pour le mauve sombre dans la partie "morte" du niveau,

#532041 + #6d3046 + #5b2a39 + #915c51 pour les blocs servant de décor de fond à l'intérieur du temple, 

#ffc463 + #ce9362 + #7b4251 pour les blocs "solides" dans le décor.

Je continue à caler sur la conception de la zone du désert pour mon prochain jeu Bilou et quelques couleurs à essayer ne feraient probablement pas de tort.

Thursday, January 07, 2021

Titanic death by a worm

Petit retour sur une lecture de Cactuceratops contre Conquer (bad fur day), qui cherche à comprendre pourquoi les voix du personnage principal 'rippées' hors du jeu sonnent différemment. Pour info, c'est un des premiers jeux à utiliser de la compression MP3 pour les échantillons vocaux. Au milieu de ses investigations, elle met le doigt sur un fait intéressant: certains blocs de son dans le MP3 sont marqués 'copyrightés' et les autres pas. Si on retire les blocs 'copyrightés', le son est parfaitement normal.


Le bit de copyright est justement celui qui distingue de l’entête le plus fréquent celui qui apparaît seulement pour la voix de Conker. Son dernier octet est en effet égal à 0xC8 plutôt qu’à 0xC0 (les quatre derniers bits valant 1000 au lieu de 0000). 
Et ce quelque chose, c'est les mouvements de la bouche de Conker, ce qu'on appelle le “lip-sync”. Ces 9 octets ajoutés viennent de l'outil développé par Mike Currington pour faciliter le travail des animateurs et rattacher ses nombreuses expressions aux articulations de sa voix
En clair, les développeurs de chez Rare ont improvisé un fichier avec entrelacement audio/data en tirant parti du fait qu'ils avaient leur player "à eux" et donc l'opportunité de travailler avec leur propre solution de multiplexage. Et après avoir vu des formats .LBM qui embarquent leur aperçu dans une section .TINY, des .MODs avec des e-mails planqués dans le 6eme instruments, etc. Je me dis ... "c'est bien le genre de hack auquel j'aurais eu recours, si j'avais été dans la boîte".

En fait, je pense bien que j'ai déjà réellement voulu utiliser un truc pareil. Retour en '99

Début de l'année, je me suis acheté mon premier PC perso: un AMD K6-II, premier à avoir je ne sais plus trop quelles extensions 3DNow! auprès d'un étudiant quelques années au-dessus de moi, ci-dessous Gino. Comme il avait voulu attirer mon attention dessus, je fais au téléphone "oui, j'ai vu. Comme je code en assembleur, c'est le genre de chose que je note tout de suite". Et lui "ah!? Tu fais de l'assembleur! Tu vas à la Inscene, alors ?"

Et de fil en aiguille, on se retrouvera avec mon frère dans la voiture de Gino avec nos tours (plus ou moins grosses), nos écrans (pas plats), le synthé de mon frangin (iirc), des sacs de couchage et quelques blocs-notes. C'est là que sera présenté Crazy Brix et El Ritmo Latino.

Pendant que mon frère participe à toutes les compétitions-surprise de musique et graphisme, que Gino fait du photoshop et retouve des connaissances, moi, je suis plongé dans le code source Visual C++ de notre Grrand Prrojet: "Titanic Death by a Worm" qu'on avait largement pré-produit depuis la fin des examens.

Je m'étais déjà bien lâché sur les p'tits personnages, contrairement aux Worms qui sont tous les mêmes (mais auxquels on donne une personnalité), nous on leur a donné à tous un look perso et des attaques spécifiques.

Mon frère avait fait un .IT avec toutes les actions prévues dans le script (ou il avait fait le script dans Impulse Tracker, en fait. Je ne sais plus trop). Restait à trouver comment aligner les actions des pixels avec le replay du module. Eh bin, puisque dans un .IT, y'a moyen d'utiliser plus de 26 effets différents (arpeggio, glissando, vibrato ...), on aura qu'à se réserver un effet qui ne changera pas le son, mais qui pilotera l'avancement dans le script visuel.

Bon, par contre si vous avez déjà fait une game jam, vous devinerez la suite, hein. Avec à peine une coquille où on sait passer en 320x200 dans DirectX (merci Gino) et charger mikmod.dll au moment de monter son PC et qu'on bloque sur le choix de comment créer des classes dérivées à partir d'une classe de base et d'un script texte ... eh bin, je me serai beaucoup pris la tête, et il n'y aura jamais de pworms.exe ...

edit: et pourtant, le projet pworms n'était pas trop démesuré comparé à "Kid, show me your dreams" et "Comin' to my Haus" (ne parlons même-pas de l'intro du jeu polycosmos, hein ;)



Tuesday, January 05, 2021

DKC - quand les bonus étaient gratuits

 J'ai donc eu un p'tit moment l'abonnement Nintendo Online à la fin de l'année dernière, l'occasion notamment de me refaire un p'tit peu de DKC, un de mes jeux favoris. 

J'ai été surpris de me rendre compte d'une différence fondamentale entre cet épisode et tous les suivants dans la série au niveau du rythme et du rôle des salles bonus

Vous voyez, dans tous les DK qui ont suivi, les salles bonus sont chronométrées, introduites par un écran descriptif de mission qui permettra de choper une pièce passe-partout. Il s'agit plus d'un challenge secret que d'un véritable bonus, dans un certain sens.

ça passe pas trop mal tant qu'on est dans des niveaux à la difficulté moyenne, mais quand on commence à entrer dans des niveaux plus nerveux, la pression peut en devenir essoufflante.

I got some weeks to try the Nintendo Online Service last year. And it should be no surprise that I played some original Donkey Kong Country, as it is one of my favourite games. It made me realise that there was something radically different in the rhythm and role  that bonus rooms play in that game compared to any other game in the series.In all the subsequent DK games, bonus rooms are  timed. There is a mission statement screen at the entrance of the room, and if you don't perform well enough, you will not get the expected reward . In a sense, it is a secret challenge room rather than a secret bonus. (very similar to the extra-life challenges of Rayman, to some extent.)

Par la suite, la formule est reprise aussi dans les Rayman Origins et Legends, puis aussi dans Splashers. Bref, plus ou moins un incontournable du platformeur à degré de complétion. Jusque dans NSMB avec ces cachettes à pièces-étoiles.

Bin au risque d'aller à contre-courant, je trouve que les salles bonus étaient plus valorisantes dans le temps où elles étaient "gratuites", où elles nous donnaient juste un paquet de bananes ou une vie ou un power-up et où on pouvait prendre le temps de les ramasser (enfin, sauf quand le jeu en entier était sous chrono, évidemment)

Vive ces bouffées d'air pur au milieu de tant de haine. 

As long as we are in the early levels, it works quite well. But as we get to levels that are more technical and more demanding, it adds pressure where we don't really need it. The formula of DKC2 hidden challenge rooms will later be featured in Rayman Origins and Rayman Legends, and then in Splashers. To some extent, it became a mandatory figure of the platformer genre. Even NSMB will use the idea in some of their star coin hideouts. Well, maybe my way of thinking is obsolete, but I think that bonus rooms were more pleasing when they were *free*,they were just throwing a bunch of bananas at us and we could take our time to collect them (unless the whole level was timed, of course). These were welcome resting moments. You could still decide to challenge yourself and get all the room's bananas by bouncing on the tire, but there would be no penalty if you changed your mind.

ça n'exclut pas d'y glisser un challenge en plus, "attrape toute les bananes avec le pneu qui bouge", mais sans stress. et sans pénalité si je décide que 'rho non, stop'  à l'avant-dernière.

Et quand on y repense, il y a une similitude entre ces "nouvelles" salles-bonus de DKC2 et les stages spéciaux de Sonic sur MegaDrive qui nous mettaient sans doute encore plus la pression que le niveau avant qu'on ne puisse choper les précieuses émeraudes du chaos...

Starting with DKC 2, we' ve left the "SuperMarioBros." bonus rooms model to embrace the Sonic 2 "Chaos Emeralds" model.

Saturday, January 02, 2021

Only 6 releases and 2.5 years behind

Believe it or not, that's actually a pretty up-to-date devkit I was running (by my standards) when I encountered a weird GCC bug that would turn a for loop into an endless one. I'm not super-hot about upgrading the toolchain while I just managed to have all my tools working again, but it should be safe to give them a try, at least.

There is at least one trick I'd have to fix or revert: I tried to override the _jp2uc function to save some room in the binary, but with devkitARM release 54, the trick doesn't work anymore. (well, the trick saves 14K. It wouldn't be such a big deal to drop it).

/opt/devkitpro/devkitARM/lib/gcc/arm-none-eabi/10.1.0/../../../../arm-none-eabi/bin/ld: /opt/devkitpro/devkitARM/lib/gcc/arm-none-eabi/10.1.0/../../../../arm-none-eabi/lib/thumb/libg.a(lib_a-jp2uc.o): in function `_jp2uc': (.text._jp2uc+0x0): multiple definition of `_jp2uc'; .//outnds/Demo/shrink.o:.//Demo/source/shrink.cpp:22: first defined here collect2: error: ld returned 1 exit status .//common.mk:360: recipe for target './/Demo/Demo.elf' failed 

That trick is based on the idea that symbols from libraries are weak, and thus can be overridden from the linking application if the application decides so. Maybe that assumption doesn't hold anymore ?

  • apart from that trick, no breaking errors occured while rebuilding
  • there is now V=1 support in ds_rules. I'll have to check to what extent that allows common.mk to be simplified.
  • Both LEDS and SEDS seems to work with the new release.
  • I couldn't reproduce the odd bug with latest gcc.

Note: I had tried to solve an issue with the editor getting stuck when using that Zap! command since early 2019, which is in the middle of the "devkitpro update" started in September 2018.

It's not that it crashes when we hit 'Zap!' on the palette windows: the code stalls. That's not helping to track where the bug is, of course. On alternate palettes, it doesn't it keeps working (on emulator) but extremely slowly... sometimes.

The amount of steps performed during this operation is too high to make step-by-step debugging in desmume any practical. And when it hangs, it is in the middle of nowhere, with no code to execute...

It also explains why attempts to use natively-compiled code to unit-test the issue kept useless.

Friday, January 01, 2021

Compiler error ?

wait .. why did my compiler ignored the 'ntiles' argument and compiled an endless loop instead of the N*32 iterations requested in the source code ?_? (10:07 PM · Jan 1, 2021) ... 

Slightly changing C++ code finally make it produce proper code. I wonder whether @devkitPro updated the GCC version shipped within #devkitarm lately ... (using 8.1.0, dkA release 49) (hint: they did)

 

(context from 2024) That happened while I was trying to repair the "zap" function of the SpriteEditor, which identifies unused entries in the color palette and clear them up. Likely something that popped up as I was scanning last year's todo items and pick one that seemed simple enough to tackle (/context)

Du QuickBasic? ça !?

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

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

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

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

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

Bilan sur DreamLand : première année

2020 s'ouvrait sur un constat: il y a quelque chose de bien vu dans la formule de Kirby's Dreamland, un équilibre entre sophistication et simplicité, qui pourrait être un bon intermédiaire entre les petits jeux comme SchoolRush et la grande aventure.

Avoir un objectif m'a motivé à me sortir des tests unitaires à répétition qui auront pourtant continué quasiment jusqu'en juin. La deuxième moitié de l'année aura permis de remettre à jour mes outils (et LEDS en particulier) pour utiliser les nouvelles fonctionnalités du moteur de jeu en terme de propriétés du terrain

Flashback to early MMXX: there’s some successful alchemy in Kirby’s Dreamland, a balance between feature-rich yet kept-simple gameplay, and it could be the intermediate step l need between small games I’ve made so far and the Grand Adventure we once ambitioned.

Having such a goal clearly boosted my motivation and helped me to pull me out of this unit test swamps where I was. Starting with June, tools got upgraded – esp. the level editor- to enable the ‘new map’ in the engine

Entretemps, J.L.N a parfaitement adhéré au projet. Ça ne le fait pas plus prendre les crayons mais il m'innonde littéralement les oreilles de ce que les boss pourraient faire et comme LEDS est réparé, il peut même commencer à dessiner des niveaux selon ses préférences. Ce n'est pas aussi directement exploitable que le niveau gribouillé de Rémi, mais ça lui fait passer le temps.

Il faut dire que s'il y a bien un truc sur lequel je coince, c'est le fait de dessiner des bouts de pyramide ou des bouts de parcours dans la montagne pour compléter la 2eme moitié des 4 mondes prévus pour DreamLand. Le confinement ne m'a pas autant aidé que je n'aurais voulu, de ce côté-là.

Meanwhile, J.L.N. joined the project. Not that he would pick up any pencil, but I’m litterally flooded with proposals about what bosses could do. And since LEDS is repaired, he can even draw some levels when he feels so. It might not be as ready-to-use as Remi’s level was, but at least, it keeps him busy and focussed.

Par contre, je prends ici-même une résolution: je prends le risque d'avoir un mélange entre perspective 5:6 et vue frontale dans le jeu (idéalement pas au sein du même niveau quand-même), et d'en subir les conséquences plutôt que de continuer à me griller les neurones à savoir quelle serait la meilleure approche. L'expérience nous dictera comment faire pour la suite. Sans ça, je vais de nouveau faire un 'analysis paralysis' là-dessus. Les graphismes déjà dessinés resteront dessinés tels quels et ceux qui devront venir compléter un niveau s'adapteront au style du niveau en question.

You deserve honesty, here: I struggle with level design for the pyramid world. And the mountains level isn’t any easier. Even being confined did not help in that regard. Yet I still want to have these zones featured in Dreamland. 

So let me at least take a new year decision: I accept the risk of mixing 5:6 perspective in some level and frontal view in other levels of the same game. There might be some consequences but I prefer facing them rather than boiling my brain to find a hypothetical perfect solution. The game will test that, and will teach us what to do in a future game. The alternative is more months of analysis Paralysis. But whatever has been drawn already will stay as they are.

Happy new Year, blog readers

 

Top most popular posts this year ...

 

To be honest, I had completely forgot that post from 7 years ago when I said you 'happy new year' and had my posts counter of 1001 (out of which over 100 drafts).

I've been trying to polish and release drafts these last weeks between holidays and stuff. Today, there are 1370 published posts and 169 drafts (boy! so many!). Yes, that means much more than half of the posts where written in the earliest half of the blog. I suppose this is no surprise to anybody, so I won't annoy anybody by analysing once again why it is so.

May this new year help you recover the damage we've all endured over the previous one.