Thursday, February 28, 2019

Sandopolis Zone and Mega-tiles.

Ok, au départ je cherchais des références pour les couleurs et le style de la "desert/pyramid zone" de mon prochain jeu. Et je venais de découvrir l'existence de Sandopolis, région d'un jeu Sonic jusqu'à laquelle je ne suis probablement jamais allé.

At first, I was just trying to find colour references for the pyramid/desert level of my next game, and I just had discovered the Sandopolis zone in some Sonic game (where I never managed to have my red shoes around). The tileset was a big .zip where I should have found all the backgrounds, but instead of the expected 'tilesheet', I stumble upon a set of 128x128 pixels pictures.

Un beau gros .zip dans lequel était supposés se trouver tous les décors, mais au lieu d'une "tilesheet" habituelle, je tombe sur une collections d'images de 128x128 pixels. J'étais resté un peu intrigué mais sans plus. Puis en revoyant la vidéo "making of Sonic 2" de splashwave, le doute n'est plus possible: il y a un niveau intermédiaire de map, et ces blocs de 128x128 pixels sont bels et biens des morceaux de puzzle construit à la main pour servir ensuite de de bloc de construction dans un niveau. On va les appeler des "mega-tiles".

I then shifted from "puzzled" to "enlightened" while watching the Sonic 2 making of video by Splashwave. There was no more doubt to have: there is truly an intermediate level of design -- 128x128 pixels areas hand-crafted by the graphics people out of brainstorming proposals, and making best reuse of the 8x8 tiles. Level design people then use them as jigsaw pieces to get the desired chains of jumps, boosts and loops. Note how the in and out ground height is standardised over the mega-tiles, btw. The core idea of this technique is of course to improve space efficiency: levels in Sonic may get as large as 10000x2000 pixels and the machine only has 64K of RAM. A 100:1 compression ratio is more than welcome in this context.

Avec les mega-tiles, on peut atteindre ainsi un taux de compression proche de 100 pour 1. Les niveaux de Sonic avec leur taille surréaliste de 10,000 x 2,000 pixels tiennent en réalité dans moins de 64K de mémoire.
Et si on regarde un niveau construit avec suffisamment de recul, on peut commencer à trouver des correspondances. Commencer seulement, parce que c'est loin d'être complètement évident ... et j'aurai eu recours au mode "soustraction" de Gimp pour les mettre en évidence.

Yet, when you have a look at a sonic map, it isn't obvious that it is made of such mega-tiles. To see them,  I had to use the same trick I used to locate tiles in SuperFrog: duplicate the layer and turn it in "substraction" mode, so that tiled area suddenly turn as all-black squares when they overlay.

Et si on ne s'en rend pas compte en jouant, c'est grâce aux différents éléments qui eux ne font pas partie de ces blocs : les télévisions, les anneaux, les ennemis ... Et parce que contrairement à un jeu "type Mario", la disposition des blocs de taille 16x16 au sein du jeu a nettement moins d'importance. J'entends par là que Mario interagit avec un bloc de brique ou un bloc-question individuellement. Et le fait qu'un saut soit possible ou non se décide à un bloc près.

I see two possible reasons explaining why those mega-tiles remain hidden to the player. First, the level designers have an additional layer of diversity with rings, screenchests, spikes, bumpers and baddies. Second, unlike a Mario-styled game, 16x16 blocks layout within the level makes little practical sense: Mario interacts with individual blocks frequently, and a mere block may define whether you an clear a jump or not. This isn't the case in Sonic: the speed, not the layout, defines whether you make it through -- or whether you find the appropriate bumper to gain extra height/speed. And even when you aren't high enough, you can still make it through a less-impressive backup route.

Pas dans Sonic. Selon qu'on va plus ou moins vite, on passe ou non. Selon qu'on trouve le bon bumper ou non, on va assez haut. Et quand on n'est pas assez haut, il y a de toutes façons une route inférieure à suivre. 

edit: a nice document entitled 'a level map is assembled with 64 parts' shows up in interview. Note that the width of a meta-tile allowed one loop to fit one meta-tile (and that the loop is actually made of one background tile and one foreground tile)

Thursday, February 21, 2019

L'ère post-desktop

Bon, soyons clairs: être sur un PC - un vrai, avec une souris, un clavier, une connexion réseau et un écran - ça ne m'arrive plus qu'au bureau. La bricole homebrew, ce sera de temps en temps sur le laptop ... avec tout ce que je peux préparer hors-PC hors PC. Le "engine design" dans un cahier atoma -- pour pouvoir mettre en vis-à-vis les idées et leur conséquences -- la documentation UML dans un cahier A4 quadrillé à spirale, etc. J'ai même tenté une sorte de 'bullet journal' pour suivre ce qui devait aller sur le blog, les posts en standby etc, qui est tombé plus ou moins dans l'abandon depuis que je me suis installé Wordpress sur mon Boox.

Let's be honest: being on a true PC -- with a mouse, a keyboard, a screen and an Internet connection, that only happens at the office. Homebrew devin' nowadays, that's on a laptop, and everything that can be prepared off-screen is welcome. So game engine design happens in an Atoma notebook (so I could put an idea side-by-side with its outcome), UML documentation goes in friendly A4 notebook, and I even started a 'bullet journal' to track what blog posts should be updated, those waiting for sketches to be scanned, and those who are waiting for translation (although installing Wordpress on my boox helped with this)

I level'd up these offscreen tools this year, with a dotted-paper notebook where I scribbled "proudly powered by CreaCorner" that somehow became my true (offline) blog until I shoot a picture and share it on twitter. 

 This is where I collect my todo lists, things to be reviewed, things that should be done when I spent an hour on the laptop, and so on. And I'd rather keep going, since I'm in half-zombie state when I'm finally done with dish-washing these days. Without dotted paper help, I'd be browsing from one abandonned forum to the next one and not even having enough energy to start reading what people have posted.

Et depuis cette année, je me suis trouvé un super petit cahier pointillé à la fin duquel j'ai écrit "proudly powered by CreaCorner (en fait, c'est un Bullet Journal Toga) ... c'est plus ou moins devenu mon vrai blog, sauf qu'il n'est pas en ligne... allez, quelques photos de temps en temps sur Twitter.

Je me fais aussi mes petites "todo listes" dedans. Les choses à relire dans du code converti en e-book. Pourtant, une bonne partie des 'todo items' auront besoin de repasser sur PC. Parce que vu l'heure à laquelle j'en ai fini avec la vaisselle ces jours-ci, quand j'ouvre mon portable, je suis en mode demi-zombie ... je passe de forum vide en forum vide sans vraiment avoir l'énergie de lire ce que les gens y ont mis.

Donc, bin je vais me les ré-encoder ici, histoire d'avoir cette liste sous la main dans les rares cas où je suis sur PC :-P

  • Q: où est-ce qu'on en est avec LevelModel, pourquoi ::SaveCommands() est vide ?
  • Q: pourquoi avais-je introduit "MonsterGeneration"
    • A: cette classe apparaît en même temps que le système de tri des 'blocs' de texte pendant les liens entre objets ... sans doute une tentative avortée qui sera restée au moment du commit faute de reviewing correct du code.
  • Q: pourquoi est-ce que je n'ai aucune doc sur EditorLevel::scanSubFile() ?
  • [todo] Refaire un coup de -WeffC++ sur le code, et trouver les #pragma push qu'il faut pour que le code incapable de supporter 'effective C++' se taise une fois pour toute et que ça devienne le mode par défaut pour la compilation.
  • [done?, merged] transférer des captures d'écran des outils dsgametools à l'intérieur de la doc doxygen
  • [todo] faire en sorte que SpriteRam apparaisse dans la doc du SpriteEditor
edit: voilà. je viens de terminer d'écrire ça et mon GSM me rappelle à l'ordre façon Monkey Island: "maintenant éteignez votre ordinateur et allez vous coucher".

Tuesday, February 19, 2019

Cupido power!

To be honest, the "Cupido" power of Kirby's adventure is one thing that I almost never used, and certainly almost never enjoyed. But things are apparently fairly different for J.L.N-6yo, who enjoys it enough to prefer losing a life over going forward without it.

Peut-il y en avoir encore ici qui ignorent que Kirby -- cette petite boule rose qui vole la vedette à Bilou depuis 1993 -- est capable d'acquérir de nouveaux pouvoirs en avalent des ennemis ? Parmi eux, il y en a un que j'ai personnellement boudé : Kirby-cupidon. Si par hasard je finissais par l'avoir équipé, il était rare que j'apprécie l'avoir et je ne l'ai probablement jamais recherché (contrairement à Kirby-Link, Kirby-Marteau ou Kirby-Soucoupe). Mais pour J.l.n, c'est apparemment le pouvoir idéal, et il préfèrera perdre une vie pour recommencer le niveau et récupérer son pouvoir-cupidon plutôt que de continuer le jeu sans. Analyse...

Cupido has ranged attack, making the other monsters less intimidating. Interestingly, the other power he enjoys a lot is metal, which also makes monsters harmless. And I find it excellent that the same level just features them at the start of two contiguous rooms. Just as if those rooms were thought as sandboxes to have fun.with those powers.

Kirby-cupidon attaque a distance. Avec lui, tous les monstres deviennent du coup beaucoup moins inquiétants. Ce n'est sans doute pas annodin puisque l'autre pouvoir qui a les faveurs de J.l.n n'est autre que "Kirby-Métal", que je trouve personnellement trop lent et trop lourd pour être agréable, mais qui passe tel un tank à travers (presque) tous les obstacles... et qui annule tout inquiétude que les monstres pourraient produire.

Cupido also makes floating even simpler. Normal kirby requires you to flap with A like when Mario is swimming. cupido, once in the air, remains at the exact pixel it was until you press the D-Pad. It makes many precision challenges completely. undermined and lots of timing challenges much easier to focus on.

Last but not least, the details making the arrow fun is admirable: it sticks for some seconds where it landed, including on monsters, making them look grotesque and stupid since they keep wandering around as if they didn't realised what happened to them. This is reinforced by the fact that arrows are weak compared to most other attacks, making the weakest monster need two hits.
Note, too, than those sticky arrows provide valuabe feedback to the young player: it gives lots of time to analyse why a shot failed and where to move to make the next shot a hit.


Note amusante : après avoir rejoué sur mon ancienne partie (où on peut faire son marché-des-pouvoirs et où j'ai débloqué le pouvoir du fantôme), J.L.N. m'a fait lui-même sa petite analyse de "pourquoi il aime bien kirby-ange et kirby-métal" ^_^

Sunday, February 10, 2019

La face cachée de Bubsy

La video "Did you know gaming" au  sujet de Bubsy, est surprenante, et d'une certaine manière digne des meilleurs articles de Pix'n'Love. Le premier Bubsy - le seul réussi de la série - est l'oeuvre d'un employé d'Accolade qui voulait faire un jeu à la Sonic dans une société où ce qu'on attendait de lui, c'étaient des jeux d'aventure (eh oui, on ne faisait apparemment pas que des jeux de course chez Accolade). Mais son analyse de "ce qui fait de Sonic un bon jeu " est d'une telle qualité que la direction s'incline et donne son feu vert .

En résulte le très bon jeu que nous connaissons bien, sorti en '93. Drôle, captivant et plein de charme sans pour autant être parfait ni nécessairement un exemple en matière de gameplay.

Mais vu le budget de la production et de la promotion du jeu, ils décident d'en rester là, et l'employé de quitter la compagnie. Sans la license de son succès. Quand l'heure viendra malgré tout de faire un Bubsy2, ce sera avec la consigne de limiter les frais mais surtout en contraignant de s'y atteler une équipe qui préfére les simulations sportives habituelles de la société et déteste devoir travailler sur Bubsy...