Friday, October 07, 2022

Finally doing some pthread stuff

For years and years, I've staid away from multi-threaded programming. Not that I dislike threads per se: I once made a multi-threaded micro-kernel myself after I spent countless hours studying IA32 Task State Segments. But who needs threads when you have two ARM cores, hardware interrupts for driving your sound DSPs and proper multi-layers video chip anyway ?

Even for network / system programming, I tend to prefer use pipes or socketpairs over threaded stuff. They strace better. You can actually see the flow of acknowledgements between entities. For most things, this is preferable over raw performance.

But a couple of years ago, I've been thrown in a pool where threads are already there and I need to swim with them. Parts of the pool use boost abstractions and are usually not too hard to work with because my colleagues did a great job at building robust RIAA things around those abstractions. But other parts of the pool use plain pthread + plain Windows thread/event/locks API. And as you can guess, upgrading corporate project to use C++11 threads is usually not easy (not that I know these any better, though).

One function that is used a lot in that code is pthread_cond_timedwait(). And there are a few things you must not do with that:

  • do not call it if you're not holding the mutex argument
  • a corresponding pthread_cond_signal is lost (not buffered) if no one is waiting on the condition at the moment of cond_signal

(more to come)


Monday, August 29, 2022

SuperMario 3D World

Oui, côté topic réchauffé, j'avoue qu'on fait difficilement mieux sans tomber dans le retrogaming. Mais voilà. Après l'avoir essayé sur la WiiU de mon frère il y a déjà quelques années, j'ai fini par craquer pour la version Switch, dans une tentative pour introduire un nouveau jeu intergénérationnel dans la maison.

Donc, oui, il y a eu la partie-de-papa (sur laquelle les enfants sont invités), la partie-de-J.l.n, la partie-de-*deline et enfin la partie-de-papa-sans-les-enfants. Parce que si le jeu à 3 est sympa, il est aussi assez décousu et ne permet pas franchement de se faire une idée de ce que le level design a dans le ventre.

Granted, there is little chance I can say anything fresh about a Mario game that has been released about 8 years ago. It's not like I had not played it until this summer, but a 4-player game in my bro's living room or a 1-player game in a quiet place doesn't feel the same to analyse the game's design. And even that way, I must confess that so far, I'm mostly writing down observations that my 9-year-old mentioned to me after he saw me playing.

And one of them connects quite well to a weird feeling I had about how the levels were 'disconnected' from one another. I mean, here are two pictures of 4 different levels. Each picture picks levels from one of the worlds: desert world or ice world. Can you relate one picture to one word ? To be honest, if you had asked me like 2 months after I'd been playing those levels, I don't think I could have answered.

Pourtant, c'est J.l.n qui m'a fait observé que, même si on a droit à un monde du désert et un monde des glaces (d'après la carte), une fois dans les niveaux, ce n'est vraiment pas évident qu'il y ait le moindre élément thématique. C'est vrai au niveau du choix des ennemis, de l'habillage des objets, du décor de fond ... tout. Le premier niveau de chaque monde est jusqu'ici (monde 3) le seul à vraiment jouer la carte du thème.

Tenez, chacune des images de ce post correspondent à quatre niveaux venant d'un même monde. Lequel est celui de la glace ? Lequel est celui du désert ? Il faut déjà avoir bien mémorisé le jeu pour pouvoir répondre.

Now let's be honest: there have been desert and ice worlds in Mario games since SMB3. They are present in NSMB, NSMB2 (checkme), NSMBWii and NSMBU. It is perfectly fine that we (at least?) see something new and different. It is perfectly fine that levels are located in the game according to their relative difficulty rather than according to some arbitrary theme. But still, the game designers insisted that we're taken back to a map showing snow or sands after we crossed that moving-grids-aerial-level. It isn't bad enough to break the player's illusion that it shares the adventure with Mario, but if you ask me on the next day "oh, so you're just in front of the Ice Castle. Was there anything interesting in the Ice World, then ? I can only remember of the 1st level in that zone" ... well ... I'll be pretty much in the same situation, because none of my memory of playing world 3 really relates to "snow" or "ice" or whatever.

Alors est-ce que le jeu est moins fun pour autant ? Pas forcément. Les niveaux restent bien trouvés et intéressants, mais il se peut que ça contribue au sentiment de "design décousu" que j'ai en reprenant le jeu.


Thursday, August 11, 2022

Funghi v2.0

 Bon, il est temps que je blogge les cogitations de nouvelle année, vous ne croyez pas ? Je m'étais installé pépère dans le canapé pour récupérer un peu, agenda-cahier sur les genoux histoire de faire un peu le tri de ce qui doit encore être dit et ce qui doit être transférer dans la nouvelle année, mais c'était compté sans J.L.N.

Le p'tit bonhomme venait de se rendre compte qu'une SpongeBop, si on la repeind en vert, ça fait comme une branche d'arbre et que donc on pourrait en mettre dans la forêt! Il n'a pas tort, mais j'ai voulu vérifier ce qu'il connaissait déjà des autres habitants de la forêt de Bilou. Après tout, à part quelques parties de Apple Assault, il n'a pas encore eu beaucoup de contact avec la green zone.

Il y a Funky Funghi, notamment. Le champignon sauteur. Si je permets de ramasser les applemen à la manière des dumblador dans School Rush, que se passe-t-il quand on lance une pomme sur un Funghi ?

Sketches in this post were actually drawn on January 1st, while I was brainstorming Green Zone with my nearly-9-y.o. son. He's been mostly playing the School Zone so far, and only bits of Apple Assault. So little that he suggested I put a green spongebop as a spidey-branch platform of some sort.

At my first drawing of Funky Funghi, he'd almost immediately suggest that we can jump on his hat and use it as a platform to climb higher. Not a bad idea, but completely incompatible with the Commander Keen-inspired, decades-old setting where the whole funghi is highly toxic and that any contact should be avoided. But that was at a time where a Manic-Miner clone was considered.

L'idée de base, celle de la version BASIC, c'était que le champignon était ultra-toxique. Tiré assez directement de Commander Keen, je dois bien dire. Le moindre contact est dangereux pour Bilou. On ne peut même pas lui sauter dessus.

Mais bon, avec le recul, pour un premier niveau, c'est peut-être un peu exagéré. Je n'irais pas pour autant jusqu'à proposer que l'on puisse monter sur la tête de Funky Funghi et s'en servir comme plate-forme. Ce n'est pas franchement dans le caractère du personnage d'accepter ça.

Pas question non plus de permettre à Bilou de simplement 'pousser' Funky Funghi comme il le ferait avec un encrier (même si je n'ai toujours rien implémenté de la sorte ^^")

Faire se déplacer un ennemi sauteur invulnérable en visant correctement, voilà qui promet d'être fun. En tout cas, c'était fun dans Rayman.

I still would like to avoid a platform-like behaviour -- I even already have another mushroom design for that. And I now have throwable monsters in the rest of the game, meaning it would be good that we could pick up and throw applemen in Green Zone (that was the plan from long ago, before I came up with Apple Assault mechanics). That means something fun is bound to happen if you throw an apple at a funghi. Right ?

I bet being able to knock the otherwise-camping mushroom to an alternate location should be both fun and interesting (I take it from Rayman). But beware, said my bro: we don't want to end up locking the progression by poorly "chosing" where we put the funghi. And with an all-toxic one, chances that we lock ourselves are much higher. Especially with limited supplies of applemen in the level.

Mais contrairement à Rayman, on joue ici avec des "munitions" limitées. Il ne faudrait donc pas que l'on bloque un Funghi dans un coin du niveau où il peut nous empêcher définitivement d'avancer! Une solution pratique contre ça, évidemment, c'est de placer un 'trou à champignon' au bout de la zone-bac-à-sable dans laquelle il est prévu de le déplacer. Quoi qu'on fasse, il ne peut aller plus loin et on a remplacer "passer par-dessous l'obstacle" par "passer par-dessus l'obstacle", qui est en théorie plus accessible.

Final thought: if Edward is true claiming that goomba were picked mushroom-bumper-shaped because that should suggest the players they'll be safe jumping on them, making my bouncy-funghi hurt you when you stomp him won't be a neat way to teach the players they're in a traditional platformer when they're playing level 1 of Bilou's Dreamland. (not to mention that mushroom=bumper has been over-used in all platformers after that, to the point that it's almost more natural to try using them that way than trying to eat them and expect to grow or shrink, nowadays).

So let it be bouncy. But only his hat (foot is still toxic and you shouldn't try to push Funghi like you'd do with inkjet). And bumping you to the side as well. If you want to have a Funghi ride, you'll have to master it first. Else all you'll get will be a funghi-rodeo. 

Mais tout ça devient secondaire si - une fois déplacé - Funky Funghi devient utile. Bon, comprenons-nous: ça reste un PNJ peu fiable et dangereux sous les bords. Disons par exemple que son pied reste toxique (on ne le pousse pas à la main) et redoutable (on ne reste pas trainer en-dessous). Mais son chapeau, lui, avec sa jolie tête de bumper pourrait ne réserver aucune vacherie et agir effectivement comme un bumper. Mais un qui soit susceptible de nous propulser vers l'arrière ou vers l'avant si on ne le prend pas bien comme il faut. Bref, un bumper qui amène une touche d'imprévu pour le joueur inexpérimenté, une touche de challenge pour le paddawan, et une variable supplémentaire à intégrer pour le Maître.

A méditer.


Saturday, August 06, 2022

scanf %ms ou scanf %n?

 it should have been quickly done. Almost trivial. Edit "DHud.cpp", revive calls to the MuadDebug class, change the GOB number so that it tracks the scorpeye rather than Bilou, and make it rewind time

  • when the shell's horizontal speed turns to zero
  • after it has been thrown (there's a flag telling us that)
  • after it has been picked up (need a new flag for that).

Except that however I tried to do it, and regardless of the amount of instruction-by-instruction stepping I made, I couldn't get the second condition to trigger. The optimizer did a great job at packing the expression evaluation code -- I mean there, that you can't tell anymore where you're in the source while doing it, and thus mostly can't set a breakpoint on a specific instruction.

Hopefully, there's the B opcode (not D, which is for Detach) to break at the script expression level. That one at least allowed me to realise that the expression for that second condition was indeed evaluated. But for some reason, the part I was interested in, with flag-setting, never got executed. A 'all done, bye' opcode always showed first. Mysterious...

Faire des essais dans le jeu pour essayer de reproduire un 'trick' pas fréquent, et avoir programmé un critère d'arrêt qui nous permet de passer en débugging pas-à-pas mais en revenant une image en arrière dans le temps, donc en revivant exactement l'évènement qui fait que tout est parti de travers en bullet-time pour pouvoir le comprendre et savoir ce qui doit être corrigé. J'appelle ça le muad-debugging, et c'est vachement pratique.

Enfin, surtout quand ça marche.

It turned out the reason was the expression got truncated even before it was turned into bytecode. Such a thing is not viable to extend the game to "Bilou Dreamland" level.

The code to parse an expression basically looks like

siscanf(base+cont,"[%64[^]]] (%64[^)])",predicate, axion)

And both 'predicate' and 'axion' arrays are static-sized. I know there's another way you could do the 'same' thing, but with any-sized arrays. That'd be something like

siscanf(base+cont,"[%m[^]]] (%m[^)])",predicate, axion)

in which case the siscanf function will allocate some memory by itself and you'll have to invoke free(predicate) when you're done with it. It is sure the way to go in most of your production code, but to be honest, I do not want this within GEDS script parsing code. Parsing a level already takes too much time. Adding dynamic memory for strings processing will only make things worse. Not to mention that it will fragment memory with temporary strings requested while we're making big blocks for the 'tank'.

But there's another trick I could (and likely will) use:

%n Nothing is expected; instead, the number of characters consumed thus far from the input is stored through the next pointer, which must be a pointer to int. This is not a conversion and does not increase the count returned by the function

Combined with the fact that %*s scans a 'string', but does not store it, I should be able to write

siscanf(base+cont, "[%n%*[^]]%n] (%n%*[^)]%n)", &predistart, &prediend, &axstart, &axend);

Now, I'd have start and end pointers for both expressions (if they're actually there), plus that would be copy-less and I would directly perform ascii-to-bytecode conversion. The conversion code would have to be adjusted, of course, so that it takes two pointers instead of one and that it does not expect a terminating \0 character at the end of the expression. So that will be a new "todo" item for when ongoing things are cleared and time is right to start something more experimental.

Oh, yes. And I could just grow the static arrays, of course. That's what I did in the past when they were 32-character long each, and I thought "well, 64-bytes predicates ought to be enough for everybody, right ? ". In another context, I could pick ridiculously large arrays (like 2048 bytes each) and forget about the issues for decades until it strikes back with some auto-generated script. But that would be a bad idea on the Nintendo DS with its fairly small stack. And nah, I won't make the arrays global either. That would sure break so many things in the ability to run that code out of its current context that it has even been considered as an evil thing to do by the former generation of developers.

Wednesday, July 27, 2022

Oh!? A post! A shell !? Progress ?

I know it's been a long time. Would you like an explanation ? It's a nice one, with Persian princes and oversea travels and unicorns. Maybe even a dragon!

Anyway, I finally got some code refactory completed so that more 'controllers' can record impact speed into script-friendly variables. That at last allow me to code whether a scorpeye shell should bounce or not when it can no longer keep moving the way it was.

Salut! Vous êtes toujours là ? Bien! Merci ^_^ Allons-y, alors. J'ai enfin repris mon projet NDS, finalisé cette classe GobImpactController dont dérive maintenant GobGravityController, mais aussi GobFreemoveController, ce qui devrait (enfin) permettre à cette satanée carapace de scorpion de faire demi-tour quand elle se prend un mur.

Enfin, ça aurait suffi sur un sol lisse et infini. Mais j'avais justement un trou dans mon miniveau de test, j'ai donc pu chipoter un peu plus avec les testpoints, pester sur le fait que le contrôleur de chutes signale un event quand on se prend un mur (plutôt que d'annoncer l'échec du mouvement, vu qu'on peut toujours continuer à tomber ... dans un sens, c'est logique).

Je vous aurais bien mis une vidéo de tout ça, mais à 1Mo la vidéo de 10 secondes ... les plus irréductibles sont invités à la regarder sur twitter.

Oh, granted, there's been pitfalls. The fact that moving along the ground fails when you hit a wall while falling down and hitting a wall just creates an event, wasn't exactly welcome-back-to-coding-friendly.

But well, there it is. There it bounces. Unless you throw it straight into a floor+wall corner or on some odd location on the sand. I'll need more runME+InspectorWidget to find out what is going on there. Or maybe some more muad'dibugging ?

Monday, June 27, 2022

gdb, intel flavour

J'ai beau avoir de nombreuses heures de gdb derrière moi, la syntaxe AT&T opcode source, destination, ça reste quelque-chose de complètement non-naturel. Quand on s'est habitué à écrire du code assembleur avec opcode destination, source, on y reste. Pareil pour les 42(%eax,%ebx,4) vs. [eax + ebx*4 + 42].

Et voilà qu'à travers le wiki du projet "gdb-dashboard", je découvre qu'il est possible de passer gdb en mode 'intel' d'une simple commande.

set disassembly-flavor intel

là. c'est tout.

Et si on veut la même chose en sortie d'objdump, ce sera

objdump -M intel -mes-autres-options

[ sauvegarder et continuer ]

Attention: gdb-dashboard et ddd sont mutuellement exclusifs.

Et si jamais le débuggeur insiste sur le fait que "No function contains program counter for selected frame", on peut toujours forcer disas address, +size ou utiliser set disassemble-next-line on

Sunday, June 05, 2022

Nova the Squirrel

She's created some games on the NES and now she's creating a sequel for her best title on the SNES. How could one be more awesome than this? Well, she could be doing it in open-source 65* assembly, for instance ? Check: she does that too. She's Nova, likes world building and character design and her mascot character is a green squirrel going also under the name "Nova". I've been following her twitter account for a handful of years now, and it's really about time I give her platformer a try, be it only to tell you about it.

I can't deny a mario-worldish aesthetics to the world in which Nova the Squirrel takes place, but it would be reductive to claim it to be a Mario clone. 

Elle est plus jeune que la NES, plus jeune que la SuperNES, et à son âge, je me disais que finalement, en programmant sur GBA/NDS je pourrais probablement faire mon jeu sans avoir besoin de reconstruire un OS en premier. Elle, c'est Nova. Elle a décidé de faire son jeu en assembleur 6502 sur NES puis de lui donner une suite sur la reine des 16-bits. Tout sa dans son propre univers, avec ses propres graphismes. Et en open-source, s'il vous plaît. De quoi faire péter le compteur de génialitude.

Ne vous laissez pas endormir par l'aspect Mario-like de ses graphismes: considérer "Nova the Squirrel" comme un clone de SMW serait réducteur. Les comportements des adversaires sont plus variés, et le personnage peut 'emprunter' les techniques des monstres qu'elle rencontre. On rencontre des bumpers, des briques destructibles, des items à ramasser ... tout le panel d'interactions avec l'environnement qu'on pourrait attendre d'un jeu peaufiné et ambitieux des années 16-bit répond présent.

From what I've been able to test from her demo, there's an interesting variety of monster motions, power-up that come as a sort of 'copy ability' flavour (triggered by UP+SHOOT, which I always seem to forget ^^"), bumpers, breakable bricks, collectibles and such. And slopes.

Your default attack is just stunning monsters, copied abilities may defeat them. Although not all power might defeat all monsters (conway's Glider deletes the red stompers, but bombs just stun them, for instance).

Since it's a demo, i can't really tell the story yet, but it could go like some fastfood-king has invaded squirrel-land and over consuming fastfood twisted the mind of inhabitants making them dangerous to anyone. If you see a flying burger in this game, remember: it is not trying to heal you.

The game smartly comes up with a sort of level selection screen that acts as a mini-map. Some of the levels come up with so many mechanics that I fail to find words to describe them, producing avalanche of block-changes, with crates-that-turn-into-bumpers-that-then-disappear, or blocks that disappear into arrows that destroy more nearby blocks.

Seriously, there's significant amount of work in the game engine here.

Si son jeu NES est aujourd'hui achevé, l'épisode Super-Nintendo est toujours à l'état de démo. Il faudra imaginer soi-même le pitch du jeu et on pourra sans vergogne passer en revue toutes les armes prévues dans le jeu. Il faudra se débrouiller un peu aussi pour découvrir les commandes disponibles et les mouvements du personnage, y compris le "copy ability" assez cruxial pour avancer. Mais à part ça, la démo propose déjà des environnements variés et des niveaux bonus en mode 7. Possible que l'aspect sonore soit toujours en grand chantier... je n'ai plus la mémoire très précise à ce sujet (traduction écrite plusieurs mois après la version Anglaise)

And just when I thought I had discovered enough to write a post about it, Nova surprises me with a mode-7 bonus round (?) possibly inspired by chip challenge.

And I was also about to miss that START takes you to an inventory where the demo-mode pre-loaded all sort of powers for you to toy with. From the fire and bottles-throwing you can already find in-game to exotic devices like a sword or a fishing rod.

Seriously, the amount of work and love in here is amazing. (yeah I know, you expected 'insane' instead, but that wouldn't be respectful at all. This is dedication).

Seriously, girl/miss/ma'am/squirrel, you rock. I hope you'll keep rocking for long and I'd better start coding again so I can be up to the challenge and get at least half as amazing as I see you are.




Tuesday, May 24, 2022

Flop ...

Aaw. un câble de portable trop tendu, et j'ai toutes les prises de mon bureau-à-NUC qui se retrouvent sans courant. j'avais justement bien besoin d'un contretemps comme ça pour me remettre à bilouter, tiens.


(et comme de bien entendu, impossible d'avoir un professionnel qui réponde à mes appels au secours :-/ )

Wednesday, May 11, 2022

freemove ou pas

Bon, le week-end était bien chargé et la semaine qui commence risque d'être du même accabit, mais j'avais quand même trouvé le temps de modifier la configuration de runMe pour corriger l'affichage des sprites 32x16 et du même coup pouvoir utiliser InspectorWidget convenablement. Il est temps que je trouve pourquoi les carapaces de Scorpeye ne font pas demi-tour quand elles rencontrent un mur.

Et on dirait bien qu'une des raisons, c'est que j'ai utilisé pour cet état-là le contrôleur "freemove". (oui. encore;) Et freemove n'a pas le code C++ qu'il faut pour 'rapporter' la vitesse à laquelle on se déplaçait au moment où une collision avec le terrain a empéché un déplacement d'avoir lieu. Or c'est cette valeur qu'il faut utiliser pour faire le demi-tour.

Despite a week-end with a good deal of events, I managed to fix runME so that it could too display 32x16 pixels sprites properly. That unlocked the use of InspectorWidget to find out why scorpeye shells won't bounce when they hit a wall.

Apparently, the core reason for that is that the GobFreemoveController I use for sliding shells is unable to tell at what speed it was moving when there had been an impact with the wall. As a consequence, the script handling state transitions cannot properly program the new speed. And yes, that is very similar to an issue I've had with 'swimming' state for Bilou not so long ago. That sounds like I should refactor something so more state controllers can report impact speed...

Bref, soit un contrôleur comme 'walker' ferait l'affaire, soit il faut que je prévoie quelque-chose d'autre. peut-être que 'sauver la vitesse actuelle si le déplacement en cours n'est plus possible' devrait en soi être un contrôleur autonome dans la chaîne ?

Ou je met une vitesse 'hard-codée' pour l'instant ?
 

Monday, April 25, 2022

Silence, on tourne ...

 J'ai repris un tour de Harry Potter et les méthodes de la rationalité. Dès le 1er chapitre, j'avais envie de le faire connaître, mais les gens qui ont le temps de tourner les pages ne sont pas légion autour de moi. Par contre un audio book, ça a l'air plus commun. En particulier pour mon frangin.

Du coup, c'est logique que je lui chipe son enregistreur Zoom. Evidemment, il y a déjà des enregistrement de l'excellentissime version originale. Ici, je m'attaque à la traduction française, en réécrivant des p'tits bouts à gauche ou à droite pour avoir un rhytme qui me plaît mieux.

J'ai encore du chemin avant les Sparkling Unicorn Princess, mais on devrait voir débarquer Drago d'ici un week-end ou deux.

Lucky you, English speakers. Harry Potter and the Methods of Rationality reads so well. But for most of my family, reading a novel in English is far beyond their level. And well, there is a translation in French, but every here and there, you stumble upon some sentence that sounds awkward, or not like something someone would have said. The meaning is almost always preserved, but the rhythm is lost. Can I do better ?

(tout ça ne booste pas la vitesse de développement de Bilou's Dreamland, mais que voulez-vous: il faut maintenir son équilibre psychosophique aussi, non ? ;)

PS: pour le chapitre suivant, il faut obligatoirement que je prépare un faux-guru-meditation-screen sur le thème "Fundamental Attribution Error"

PPS: on dirait bien que hpmor est en 'creative common' ... ça va plaire à mon frangin, ça.

Behaviour edition on DS. ?


I'd like to be able to edit state machines (for Bilou and monsters) on the Nintendo DS itself. That'd be the pinnacle of on-the-road game making. There's a significant drawback to address before I can do that, though: usable state machine scripts currently heavily rely on GCC pre-processor to turn into engine-compatible text. Most of it is just providing nicknames for things that the engine solely knows as numerical identifiers.

So I'd need at least a sort of token-parser that can handle some of the substitutions on the DS itself. Both for potential Behavour Editor on DS and for runMe. Only the compiled .nds that embed the game would still use PC-pre-processed scripts (and see only numbers).

I've been toying with that idea summers ago, digitized and kept-as-draft the best part of it for seasons. It's not yet time I start implementing it (I don't think so, at least. It's irrelevant to the 'dreamland' effort), but it may be time I stop being silent about it...

Tuesday, April 19, 2022

des sprites 32x16 ?

Le support des sprites rectangulaires, c'est pas encore une grande réussite dans GEDS. En chipotant un peu, on parvient à avoir une planche de sprites verticaux ou horizontaux dans SEDS. Ils sont quand-même édités sur une grille carrée, mais soit.

Les choses sont déjà un peu plus louches dans AnimEDS, où de curieux résidus viennent se placer par-dessous un sprite 32x16. ça gâche un peu l'effet, mais disons qu'on s'en serait accommodé le temps de d'un ennemi ou deux.

There is somehow way to introduce non-square sprites in my SpriteEditor (with those 'new W(ide)' and 'new H(igh)' buttons), and the NDS hardware definitely has support for them, but let's face it: none of the game engine or Animation Editor was half ready for a 32x16 scorpeye 'shell'

Mais le moteur de jeu a l'air de perdre complètement les pédales, lui.


Une petite réactivation de l'afficheur-de-sprites finit par me pointer le problème: je suis déjà au bout des 1024 sprites possibles dans ce nouvel environnement... enfin, pas exactement. Je n'ai pas encore saturé les 128K de mémoire disponibles pour les sprites, mais seulement les identifiants disponibles.

J'ai déjà joué avec ça pour l'éditeur de sprites, mais le moteur de jeu, visiblement, n'était pas prêt non-plus pour ça ... ça va faire un gros commit ...

You see: it really doesn't make sense. We get parts of Bilou heads instead of getting our expected shell, and the shape isn't even rectangular. Part of it is because the engine cannot change the shape of a 'limb' for a compound character while playing (changing states doesn't let you break that rule). If you're rectangular on your frame one, you're rectangular all your life long. Another part of it is because I'm hitting the tile number limit. I thought SchoolRush was already using 128K of VRAM for sprites, but it seems I was wrong and everything used to fit the default 64K. Only the background tiles had been increased. Anyway, the Makefiles didn't like it, but it is now expanded to 128K. Anything else ? Yep. size = 16 + mode = wide gives you 32x8 sprites. Not 32x16. That explains the lone stripe I had in the final attempts.

Un autre soucis visible sur l'animation: les tailles de gobs pour une page donnée ne peuvent pas être changées en passant d'une animation à l'autre. Et j'avais gardé la première version 32x32 pour l'animation "immobile". Du coup, les autres animations tentaient aussi d'utiliser du 32x32 même quand les images à charger étaient en 32x16.

Ah, et j'ai probablement sous-estimé l'existence des sprites 32x8, ce qui fait qu'encore après tous ces patches, il me manque la moitié de ma carapace ...

Tuesday, April 12, 2022

La castle zone

La 'castle zone' n'a pas été retenue pour "Bilou's Dream land, mais ça reste toujours bien un des environnements prévus pour la "grande aventure". D'ailleurs, quand je tombe sur ce genre de petits croquis dans mes carnets, je numérise... Bon, celui-ci est resté "à blogger" bien longtemps, je le reconnais. Au point que lors de ma tentative annuelle de produire des fichiers epub à partir de mon blog, je me suis rendu compte qu'il avait disparu ...

Castle... Not the fictional author, but the zone in Bilou's Adventure. It might not have been selected for the Dreamland project, mostly because I already had 2 'indoor / artificial' areas with school + pyramid and that I wanted an 'outdoor / natural' area to balance the 4-areas game, that doesn't mean I forgot it.

From times to times, I might encounter such small sketches of potential characters to encounter in the castle zone... although I admit scanning and 'publishing' was a long road. So long that when it showed up in my yearly check that my blog-to-epub chain was still working, the picture was gone. It was scanned with my fairy's tablet before I got my own android boox. But last year, I migrated most of my bilou-ish shots out of her google photos quota and links went broken ^^". Well, at least, I had backups. and filenames to help me locating the 'lost' file in my own google drive.

C'était au temps où je n'avais pas encore ma liseuse-androïd et où Blogger-pour-androïd marchait encore sur la tablette de ma fée. Je l'avais donc ajoutée elle comme rédactrice virtuelle du blog histoire de pouvoir poster des brouillons avec les images scannées que j'aurais ensuite complétés sur PC.
Mais du coup, au moment de migrer mes bilouteries hors de son compte 'google photos', les liens sont devenus invalides... voilà voilà.

edit: got to open-in-new-tab, save and upload the picture again so it could show up in the post. Apparently, copying the URL of an in-drive picture is a bad idea altogether.

Tuesday, April 05, 2022

Codons du scorpion

J'ai fini par avoir un petit temps creux avec le cube allumé. J'en ai profité pour faire deux animations-bidon du scorpion dans AnimEDS et les transférer par wifi hors de la Nintendo DS. Du coup, en reprenant le comportement de base de dumblador (seul autre ennemi que l'on puisse ramasser pour le moment), je peux *enfin* voir ce que donne le fait de ramasser une carapace de scorpeye pour se promener avec.

Eh oui, vous aviez reconnu les pieds de bladors qui s'échappent, hein. On ne vous la fait pas. A terme, ils seront remplacés par les pinces du scorpion, évidemment. Avec à la clé une question de game design: est-ce qu'elles devront pincer Bilou ou non?

I've been creating dummy animations for the Scorpeye with existing pixels and beamed them out of my DS so I could start toying with the ennemy in the playground level. The dumblador state machine provided a neat template to start with, and despite there are still many rough edges, I could get a proof-of-concept within a couple of hours.

Mais bon, un dumblador, ça s'arrête net quand ça arrive sur le sol. Moi, je veux un comportement de carapace de koopa. quelques petites modifications dans le script permettront ça en moins d'une heure: deux nouveaux états $LSLIDE et $RSLIDE au lieu de $STUNSTAND

Les transitions du style 

$STUNFALL->$STUNSTAND on fail [t] ($8000 F $vPlatform(1));

sont maintenant remplacées par une paire de transitions

$THROWN->$LSLIDE on fail [v2 1 & v0 0 <= &] ($8000 F $vPlatform(1));
$THROWN->$RSLIDE on fail [v2 1 & v0 0 > &] ($8000 F $vPlatform(1));

Un petit rappel de la syntaxe ? l'expression entre crochets [] est la condition à vérifier pour que la transition puisse avoir lieu et l'expression entre parenthèses, l'effet de bord à appliquer en plus de la transition. (ici, j'ai du nettoyage à faire, puisqu'une carapace ne devient pas une plate-forme quand elle touche le sol. $vPlatform() ne sert donc à rien)

Les expressions utilise la notation polonaise inverse, donc soit vous ajoutez des valeurs sur une pile (v2 qui empile le résultat des test-points, v0 qui empile la vitesse horizontale, les nombres qui s'empilent eux-même), soit vous retirez des valeurs pour faire une opération (comparer deux valeurs et les remplacer par vrai/faux avec <= ou >, faire un ET logique avec &).

I'd like to tell you that I've got more animations done on the DS and that they are going to be integrated soon. The reality is somewhat different. I've lost several improvements attempts while animating yesterday and I'm not 100% sure of what got saved and what didn't. Apparently, there are still many combination of altering the 'animation structure' and returning to edition that need to be unit-tested and fixed. But that's not done yet. I'd like to be able to give you a 'meet you on saturday afternoon for a updated demo', but IRL struck again, and fairies only know where I'll be by then.

Tuesday, March 29, 2022

Les piles momies animées.

Au milieu d'un mois de dingues, j'ai quand-même réussi à améliorer un peu les graphismes de mes piles-momies et à faire une petite machine d'état qui fonctionne.

En fait, maintenant que j'y pense, pour ceux qui arrivent à atteindre la plate-forme là-haut, on peut même essayer de voir ce que ça donne de sauter par-dessus. Allez, ça mérite une démo téléchargeable, ça.

It's been a tough month. Let me tell you, when release-day came out on 24th, packing a binary with some new stuff to offer to you all was the last thing I had in mind (just before I'd fell asleep. Or maybe just after). But I still managed to improve a bit the undead-cell graphics, mirror the animation and give it a state machine so that it can be placed in levels. It isn't interacting with anything yet, just checking whether it should turn back at the edge of platforms, but there it is. You can practice tricky jumps if you feel so ;) The downloadable .nds finally made it to the Internet.

Friday, March 25, 2022

try { week(); }

 


try {
   week();
   homebrew();
} catch(BirthdayException&) {
   cake--;
   year++;
} catch(UnpluggedFreezerException&) {
   while(!freezer.empty()) {
      cook(freezer.front());
      freezer.pop_front();
   }
   freezer.clear();
} catch(SparklingUnicornException& su) {
   return new friend(su);
} catch(UnexpectedWindowUpdate& wu) {
   money -= wu.price();
   light++;
   // FIXME: headache
}
Mais sinon, ça va. Pardonnez l'absence de release-d-anniversaire, du coup.

Friday, March 11, 2022

Animating the Undead Cell

 

I admit one of the reason for playing Epic Mickey again was to see how they had dealt with the sands and desert things in the Agrabah level, but I was far from imaginating that it would unlock my animation issue for the UndeadCell. One of the ennemies we face in the game is a mushroom species that has level-themed variation.

J'avoue: une des raisons pour lesquelles j'ai rejoué à Epic Mickey, c'est parce que j'ai réalisé qu'il y avait là la meilleure version graphique de l'univers d'Aladdin, tout en sable fluide et pierres jaunes. Quoi de mieux comme source d'inspiration pour ma pyramide bilouteuse ? Mais je ne m'attendais pas à ce que ce soit le champi-turban qui me serve le plus de source d'inspiration.

Conveniently enough, the sprite table was available on the Spriter resource, but let's be clear: if you can rebuild the animation from the sheet, you're the original animator. But at least, there was one thing I could extract from it: the sine motion for the pot of the character and the fact that the 'hat' more or less follows the slope of the sine. Colors for the turban are h30s18v99, h31s40v87, h27s51v75, h29s60v62, h25s59v55, just in case I wouldn't be satisfied with the current ones.

So I tried to sketch that and it looked nice on paper. I redrawn it in my SpriteEditor and it looked interesting (although I couldn't loop 'walking' animations properly). Getting it to work in AnimEditor was a bit harder: you can lock a sprite in the world while you're animating the rest, but the undead cell has no thing such as a foot that could be locked and moved backwards (pushing the rest of the character forward) like dumblador had.

C'est que, voyez-vous, l'animation actuelle de la pile-momie est tellement peu concluante que je ne l'ai toujours pas intégrée dans le niveau-test. Mais ce champi mélange pixel art et technique d'animation "cartoon-ancestrale" qui me montre la voie à suivre. Je gribouille donc une sinusoïde qui servira de repère. Je note que dans leur animation, l'orientation et l'étirement du chapeau suit la pente de cette sinusoïde. Je fais de même.

Il y a encore une 'pose iconique' dont je veux m'inspirer: cette manière dont le personnage fait une courbe montante au moment de se redresser. Comme s'il se déplaçait en utilisant le poids de sa coiffe qu'il laisse d'abord tomber vers l'avant puis qu'il doit courir pour la redresser telle la pile de livre de Lagaffe.

Hopefully, while animating in SEDS, I made the character actually move within its 32x32 frame. Part of why it moves now is because I kept that, but scrolled the frame backwards so that the eye always remained at the same spot within the bounding box.


So here it is, in a "how it started / how it is going" sort of animation (from a file beamed before I could fix the forward motion). As you can see, it still need to be significantly polished, and I got barely any time to work on it this week, as my kid had to finish a show-and-tell for school.

ça me fait pas loin de 11 étapes d'animation pour la pile qui avance. de 32x32 chacune, mais bon j'ai 256K de sprites à ma disposition... ce serait dommage de faire le gripsou et ne pas en profiter à ce stade-ci.

J'ai du chipoter un peu pour trouver comment adapter le mécanisme de 'verrouillage de sprite' qui avait bien marché pour dumblador sur un personnage qui ici n'a pas de pied. Est-ce la bonne vitesse ? Bah, dans le pire des cas, je la mettrai sur du sable qui coule, et ça justifiera une vitesse plus élevée, hein ;) La voir revenir en arrière dans les premiers temps de son développement m'a donné l'idée que la vitesse d'écoulement du sable devrait être telle qu'elle reste immobile à contre-courant.

edit: ouaip. C'est bien beau tout ça, mais une animation qui "marche" dans AnimEDS n'équivaut pas forcément à une animation qui marche dans le jeu. En particulier, l'éditeur joue en réalité l'animation à la vitesse indiquée, forçant le déplacement correspondant. Le moteur de jeu, au contraire, asservit l'animation au déplacement. Ce qui donne ici une pile qui reste immobile un long moment puis joue presque toutes ses frames d'un coup parce que j'ai abusé du 'mov#1' et du 'mov#0' (enfin, je crois).

Saturday, March 05, 2022

Illusion.2: les PNJ

J'ai passé Agrabah, et ce n'était pas de la tarte:

  • la densité d'ennemis augmente significativement;
  • la plupart des ennemis ont un nombre de points de vie quasi prohibitif; (10 ennemis à 6 HP sur le premier segment du niveau ... et j'ai le 1er bonus de dommage pour les sauts)
  • le design des niveaux réduit notre marge de manoeuvre avec des couloirs étroits où on trouve des pics, des sables mouvants, etc.

La caverne des miracles ? C'est pire. Des pics partout. Il faut à la fois surveiller les approches d'ennemis sur l'écran principal et les objets invisibles de l'écran du bas, au risque d'avoir loupé le tapis magique qui devait permettre de passer l'obstacle. Ou louper un PNJ.

Triumphing of dangers untold as well as countless trials, I finally made my way through Agrabbah to the Cave of Wonders to claim NPCs Mizrabel had jailed. Compared to the previous part of the game, ennemies density raised significantly and most of them require a ridiculously high amount of hitpoints (up to 6 hits, even for apparently low-level baddies). Plus the level design now features a large amount of narrow corridors, spikes and quicksands. Oh, and many of the baddies are throwing things at you, too.

The cave of wonders itself isn't any better. Spikes everywhere. You've got to keep an eye on the upper screen to see baddies coming in and another eye on the bottom screen to spot hidden platforms to activate while you jump. I'm failing again and again, and if the game decide I have to redo a level, I'll also have to rescue all the NPCs again -- a bit like NSMB star coins aren't 'validated' until you hit a checkpoint. If you want to bring everyone back at the fortress, you *have* to one-life the level. 

Bref, je meurs, je meurs et je re-meurs. Et le jeu ne mémorise pas quel PNJ a déjà été sauvé quand il nous renvoie au début d'un niveau. A l'instar des pièces-étoiles de NSMB, il faut faire le sans-faute pour ramener tout le monde à la forteresse.

Le message du jeu est clair, pour moi: "t'as pas le niveau. Fais des quêtes pour augmenter tes stats!". Parce que des stats, il y en a. Et pas qu'un peu. Jauge de vie, de peinture, de dissolvant, puissance des attaques par saut, par tornade, par peinture et par dissolvant. Coût de la peinture et du dissolvant pour les dessins et pour les attaques. Tout ça peut être amélioré chez l'Oncle Picsou, mais dès la 2eme mise à jour, on arrive à un tarif de 1500 crédits/upgrade pour encore monter à 4500 pour le niveau 3. Vu que je fais au mieux dans les 600 crédits en traversant un niveau, comme je l'ai dit, on va espérer que les quêtes des PNJ vont me simplifier la mise.

In terms of game-to-player communication, this is as plain as can be: "you're not ready for that level. Go farming, level up and then come back". You thought Epic Mickey was a platformer ? Hah! See how many stats can be improved by purchasing items at Scrooge Mc Duck's shop! Health bar, ink (shots) bar, thinner bar, damage level for every possible type of attack, ink cost for all the various ink-related moves. And at prices above 1000 credits as soon as you want a second upgrade (nearly 5000 for the 3rd upgrade) while you can expect collecting 500-600 credits in a level. The side-quests NPCs offer better have to improve that or I'm done with playing. But unfortunately, that's precisely where the game experience degrades.

Et c'est là que l'expérience de jeu commence à sombrer sérieusement.

Avec le 2eme monde, un nouveau type de quête est débloqué: faire l'entremetteur de PNJ. On va
emmener Donald voir Picsou, puis Dingo. On va chercher du bois chez La Bête pour que Picsou puisse avoir une pancarte annonçant sa boutique, échanger des livres et des peignes entre Raiponce et La Bête ... vous voyez le tableau. On est à peine au-dessus de la quête des cocottes. ça pourrait avoir un petit goût de Point-n-click à la Day of the Tentacle, ... sauf que non.

Starting with world 2, a new kind of quest appears: "trade" items between NPCs within the fortress (a sort of hub world). Find Donald Duck, take him to Scrooge, then to Goofy. Get some wood at the Beast's place so that Scrooge can have a sign for his shop. Swap books and hairbrushes between Raspunzel and the Beast. etc. Barely above the interest level of cuccoos quest in a Zelda-inspired RPG. It could have had the funny taste of a Day-of-the-Tentacle (point-n-click) game, but it doesn't.

In a (great) point and click, there's quite few things that could trigger an NPC's behaviour to change -- beside your own actions in the game, that is. Does Ed needs something that belongs to Ben? Well, you'll discover that by the time you discover where Ben stands. You don't know yet how to pick/steal/be given the item Ed needs, but you can anticipate Ben will be part of the solution and start searching for ways to reach your objective. And having anticipated things makes the solution interesting to find (and possibly fun, if it somehow breaks some of your assumptions). Looking for the solution is made fun by allowing plenty of things to be tried with no penalty on picking the wrong option (plus using a bit of humour to comment on player's silly attempts).  

Dans un P'n'C, il y a relativement peu de causes extérieures au changement de comportement d'un PNJ. Ed a besoin d'un truc mais c'est Ben qui l'a ... on découvre ça en débloquant (ou juste découvrant) l'endroit où Ben se trouve, on anticipe que la solution sera de prendre le truc de Ben et on commence à chercher comment parvenir à cet objectif. C'est cette anticipation qui fait que la solution est intéressante à trouver. C'est parce qu'on peut essayer plein d'actions différentes sans pénalités (et avec un peu de chance, avec une pointe d'humour dans le signalement de nos échecs) que la recherche de la solution est distrayante.

Mais rien de ce genre dans Epic Mickey. Juste déplacer une icone sur une carte avec des contrôles "qui accrochent" et chosir 'Parler / Améliorer / Quitter'. Les personnages qui cherchent quelque-chose sont marqués d'un symbole jaune, et quand une quête est validée "Une arme de fille -- trouvez une poële à frire pour Raiponce", un symbole vert est ajouté à côté de la pièce où se trouve sa solution (enfin, si on a sauvé le personnage correspondant). Autant pour l'anticipation.

You won't find anything alike in Epic Mickey sidequests. All you're doing is moving a mouse-shaped curor on a generic map with unresponsive controls and pick "talk / improve / leave". Characters who need something have a yellow sticker next to them and when a quest is validated, a green sticker is added in the room where the solution is (given that you've rescued the required character for that room). So much for anticipations.

And even more unfortunately, there are annoying loading times every time a character has to be shown. Over a 20-minutes gameplay session, you'll spend easily up to 5 minutes navigating menus to unlock things with NPCs.

Ajouter à ça des temps d'attentes à chaque fois qu'un personnage va parler pour faire apparaître
son portrait dans l'interface et vous commencez à comprendre comment 'faire des quêtes' va s'annoncer aussi gai qu'une opération choco un jour de janvier pluvieux ... Sur une séquence de jeu de 20 minutes, la partie dédiée à la navigation dans la forteresse et aux "dialogues" avec les PnJs représente quand-même 5 bonnes minutes. C'est loin d'être négligeable!

Pour enfoncer le clou, comme si ce n'était pas encore assez bancal, il est impossible de découvrir un des personnages ou des objets à ramasser dans le niveau tant qu'on a pas activé la quête correspondante depuis la forteresse: la cachette en question sera tout simplement un recoin vide du niveau. Ou éventuellement on y ramassera quelques crédits. Et Mickey ne dispose pas du 6eme sens de Princess Peach pour deviner dans quel segment d'un niveau un objet/personnage se trouve. Jimini non plus, d'ailleurs. Allez, au moins on peut leur reconnaître que le level design est construit pour qu'on ait (le plus souvent) la possibilité de voir qu'on approche d'un personnage-quête quelques écrans avant qu'il ne soit nécessaire de le délivrer.

Could it be even worse ? Sure! Some of the items and characters you could rescue from a level aren't present in a level before you trigger the quest for them. You could travel London Skies 3 times in a row, if you haven't been chatting with Wendy Darling first, you might never encounter her brothers. Instead, the (hidden dead-end) place where they'd be hiding is instead an empty spot -- optionally offering you a few credits as 'reward'. And Mickey doesn't even have a 'sense of magic' like Super Princess Peach that would tell you whether some NPCs are being held prisonner in a specific area of the game. The only help you'll get is that the level is somehow twisted in such a way that you're being shown that there's someone to rescue ahead of the spot where you have to prove your skills to go rescue them.

Friday, March 04, 2022

Shikadi Walk

There's 120 ms between two frames of the Shikadi walk. They cover 1 full block in one full step (2 frames -> ~240ms for a full step). 

En gribouillant quelques idées de level design, voilà qu'apparaît la possibilité que les piles-momies de la pyramide de Bilou puisse déclencher des pièges sur leur passage. Par exemple électrifier des piliers qui soutiennent les plate-formes que Bilou emprunte. Mais il ne faudrait pas qu'elles fassent ça trop vite quand-même, histoire que le joueur ait le temps de réagir... voyons ... Omégamatic ?

Comparatively, the 'wander' state of the zooming bot (Sparky) covers 32/20th of that distance.
And keen runs at 37/20th of the shikadi walk speed. Almost twice as fast. Since I'm considering giving UndeadCells the ability to trigger electricity sparks when they reach some level elements, I'd like to ensure I at least don't make Bilou a game harder than Commander Keen in the Armageddon machine ...

Ah, and by the way, the dumblador (currently the slowest hazard in Bilou) needs 880ms to cover half a block. When walking, Bilou takes 8/60th second (133ms) to do the same. And he can run twice as fast.

J'ai donc ressorti Keen5.exe et tenté de recalculer la vitesse de déplacement des Shikadis -- ces personnages fait d'électricité -- qui ont un comportement similaire à l'approche d'une de ces barres auxquelles Keen peut s'attacher. Eh bien on est à 240ms pour un bloc de l'éditeur de niveau, soit 90% de la vitesse de marche de Bilou et 54% de la vitesse à laquelle Commander Keen se déplace.

ça reste relativement lent par rapport aux autres ennemis du jeu. En mode 'surveillance', le robot Sparky ne met que 150ms pour couvrir un bloc (et non, je n'ai pas mesuré la vitesse de Sparky en mode 'attaque').

Saturday, February 26, 2022

Power of Illusion

 Bon, il y aura bientôt 10 ans, maintenant, que j'ai joué à Power of Illusion (le jeu Epic Mickey) sur 3DS et il est sans doute grand temps que j'en parle ici. Ça peut même paraître étonnant que je ne l'aie pas encore fait: c'est un platformer, sur console portable Nintendo et avec une généreuse dose de bon pixel art (pour les sprites. Pour le décor, on est plutôt dans du digital painting, je dirais). On devrait avoir tout ce qu'il faut pour être heureux, non ?

I first played "Power of Illusion" (starring Epic Mickey) on 3DS about 10 years ago. I wanted to make a post about it but it never turned real. It may sound surprising: it's a platformer, it runs on a nintendo handheld, it's colorful with a good deal of well-done pixel art. Why not playing it ?

I definitely was enthusiastic in the first few levels, but then went through neverland woods with an increasingly annoying taste in my mouth, and finally dropped the game somewhere around Agrabbah, where things started to be too demanding for the amount of entertaining the game offered.

Bin ... pas franchement. J'avais commencé enthousiaste, traversé la forêt de Peter Pan avec un goût de chou de Bruxelles en bouche et fini par lâcher l'aventure dans Agrabah où ça devenait trop exigeant pour servir de divertissement. C'est avec la musique que ça commence à sentir le manque de rythme. Mickey n'a pas vraiment percuter que dans 'secourir', il y a 'courir'. Le seul moyen de lui donner un coup de boost, c'est de s'appliquer lors des innombrables séances de précision au pinceau sur l'écran tactile, mais soyons clairs: ça casse tellement le gameplay comme évènements qu'on ne va certainement pas décider de redessiner quelque-chose juste pour courir plus vite, hein.

A l'époque, *deline avait 3 ans ou quelque-chose comme ça, elle était en plein dans sa phase "je suis une princesse, je chante pied-nu en haut des tours des chateaux de plaine de jeux et quand je serai grande, j'aurai des longs cheveux", et tout. Mais il faut bien reconnaître que suivre l'aventure avec elle, c'était nettement moins idyllique que dans le blog de papacube. Trop nerveuse pour parvenir à dessiner elle-même les passerelles ou même effacer les canons, je me retrouvais régulièrement à court de peinture. Ne parlons même pas de lui faire prendre le contrôle de la souris. Avec 2 boutons d'attaque (dont une dont on peut épuiser les munitions), un saut où il faut appuyer une 2eme fois sur le bouton pour faire des dégats aux ennemis en retombant, ce n'est clairement pas un jeu à essayer avant d'avoir un niveau correct à Kirby. Bref, il doit y avoir une tranche d'âge où la gravitation lunaire et les ennemis retors correspondent juste à ce que les joueurs aiment, mais je ne suis pas encore tombé dessus. J.L.N, peut-être ?

Mais si j'en reparle, c'est surtout à cause de son mode 'forteresse'. Non, ne vous attendez pas à un catch-the-flag, je veux simplement parler de cet espèce de hub où on téléporte tous les personnages Disney rencontrés sur le chemin. C'est à travers eux qu'on va pouvoir améliorer ses statistiques, sa barre de vie, son réservoir de peinture et sans doute plein d'autres choses. Pour ça, il faudra discuter avec eux, utiliser des étoiles pour débloquer des quêtes annexes, accepter les quêtes ce qui fera apparaître des personnages à retrouver dans les niveaux (je pense).

C'était d'ailleurs le truc qui m'avait un peu saoûlé à l'époque: outre le côté "rigide" de la navigation dans la forteresse, on pouvait très bien faire un niveau une première fois, trouver des zones cachées vides puis discuter avec un PNJ qui nous demande de retrouver un de ses compagnons (Lumière ? Michel Darling ?) et tout d'un coup, hop. il y a quelqu'un dans le recoin que vous aviez trouvé la fois dernière. Débrouillez-vous pour parvenir à vous y rendre à nouveau. Je viens de refaire une partie et jusqu'ici (combat contre Crochet), rien de ce genre ne s'est reproduit (ouf), mais probablement que ça me tombera dessus prochainement. J'espère que ça peut juste être évité en parlant le plus tôt possible avec le PNJs.

Bref, moi qui avait imaginé en 2002 que Bilou serait génial parce qu'on pourrait discuter avec Flower Power pour lui emprunter la cassette qui ferait danser les Funghis, il faut bien admettre que c'est ce jeu qui m'a convaincu que ce ne serait pas forcément l'idée du sièce. Et l'idée d'avoir dans le monde 3 un PNJ qui te lance un défi sur un des niveaux du monde 1, ça ne marche pas terriblement bien non plus, en fait.

Si vraiment je veux introduire quelque-chose de ce genre pour la Grande Aventure, il faudra que

  1. ça ait un dynamisme plus proche de Day of the Tentacle, avec plusieurs personnages dans une même salle et la possibilité de discuter avec l'un puis l'autre avec un minimum de délai.
  2. ça tienne compte de ce que le joueur a déjà accompli
  3. ça reste un 'à côté' pour la quête principale, sans en casser le rythme
  4. accepter une quête liée à un niveau puisse nous téléporter directement dans ce niveau.

 


Thursday, February 24, 2022

Devant ou au-dessus ?

 Pas mon masque, hein. La carapace de scorpion quand Bilou la transporte. Celle qui doit me permettre de faire quelques petits moments-koopa dans la pyramide. La logique voudrait qu'on la transporte au-dessus de la tête de Bilou, comme les Dumbladors et les éponges dans School Rush.

Mais voilà, je me souviens bien qu'un des trucs que je trouvais dommage dans Super Princess Peach, c'est la manière dont elle ramassait les carapaces pour les tenir par-dessus sa tête avec son ombrelle, la laissant du coup vulnérable à une attaque frontale du plus élémentaire goomba. Je préfère de loin la technique de Mario qui peut se protéger (voire foncer dans un ennemi sans hésitation) dès qu'il a ramassé une carapace.

Should Bilou carry throwable scorpion shells in front of him, like Mario and Diddy or should he carry them over is head like Donkey and Princess Peach ? Both Twitter and my bro agree: over-the-head is better. It sure looks better: the shell is too large to be handled any other way. Plus, other carry-me items in the game already gets carried I can't forget however that I preferred the experience of in-front in all the games I played so far. It shields you against incoming foes, let you find hidden areas without taking any risks and avoids functional blind spots when you're throwing them.

Idem dans la série DKC: une des choses qui fait que j'ai toujours préféré jouer Diddy plutôt que Donkey, c'est que Donkey porte ses tonneaux au-dessus de lui. ça les rend à la fois moins utile comme bouclier et comme détecteur de passages secret: Diddy peut se contenter de s'approcher du mur alors qu'avec DK, il faudra s'approcher pas trop et lancer le tonneau (ou alors, on se baisse et on dépose le tonneau, quitte à le reprendre si on a fait chou blanc)


Du coup, j'ai fait un p'tit poll sur twitter pour voir un peu vos avis ... Majoritairement en faveur du 'par dessus la tête', visiblement. ça paraît raisonnable. J'imagine qu'on devrait pouvoir garder un côté "bouclier" en s'abaissant pendant qu'on porte la carapace, façon Blues Brothers / Tic & Tac. Il faudra par contre que je sois attentif à ne pas laisser trop de "zone morte" au moment du lancer pour éviter le défaut de DK, en particulier si je veux être efficace contre des ennemis à peine plus hauts que Bilou.

I think I can fix the shielding issue with some duck-while-holding that would reduce Bilou's hitbox and increases the odds that the shell takes the hit instead.

I'll need to take care of the functional blind spot. The shell should leave at a speed high enough that it feels 'fast' to the player (might be the other issue with Super Princess Peach's throw move). I sure can't afford the blind spot to be as large as in DKC (anything between Kong and banana on the picture above is out of the barrel's reach)

edit: Maybe my memories of Super Princess Peach are skewed. Re-playing it a few minutes didn't give me that feeling that koopa shells were broken, and one reason for that is that Peach also gives a (short-range) umbrella attack while throwing. 

Possibly the real issue is with button mapping: you use PICK UP to take the shell, but if you use the same button again, you'll drop an harmless shell rather than throwing it as a long-range attack. And if you press the ATTACK button instead of PICK UP when you don't have the shell with you, you risk of destroying the shell instead of getting a weapon. None of this should occur with Bilou, hopefully. And when you see that the shell in Princess Peach has lowered by more than 1 block within the first 4 frames of animation. Low enough to hit any possible monster with almost no build-up time.

Saturday, February 19, 2022

Big Caterpillar

There has to be boss fights in Bilou Dreamland. I cannot work around that: my son won't let me do with a puzzle part where you're trying to avoid sting-like and claw-like hazard and pretend that 'yeah, the boss was behind the wall. You made it!".

The first encounter in-game will have to be against Big Caterpillar, holder of the Growth Stone, one of the eldest design for the game. Its design hasn't evolved that much over the years: it still should have some reds and greens. It still should look angry and crawl towards Bilou to squash him. But I'm wondering how it should best attack and what should be its weakest points. I might want to make its overall shape look more like the "chenillard" monster that my brother used here and there in his original levels.

Bon, pour ce prochain jeu, pas d'échappatoire: il faudra des Boss. Pour le premier qu'on rencontrera, au moins, j'ai de la matière. Depuis le tout début du personnage, il y a des croquis de chenilles géantes. Il a même eu droit à sa bande son! C'est dire ! ... Et il faudra qu'on les combatte. Je ne m'en sortirai pas avec une course-poursuite ou une salle-super-puzzle pleine de pinces qui sortent des murs. J.L.N voudra un affrontement en bonne et dûe forme! Alors autant ne pas attendre la dernière minute pour s'y mettre.

In the comic much like in the BASIC game, you knock the boss down by stomping its head. Various attacks would protect the head with the rest of the body, forcing you to wait for an opening, and when you eventually land your stomp, the boss turns red for some time and can't be attacked again before it cools down.

But as you noted, Big Caterpillar has sorts of bull horns. If form fits function, that means you should rather try to avoid jumping on its head. I need to find something else. Hours spent fighting against Moldorm in '90s Legend of Zelda titles immediately suggest aiming for the tail, which would be fine if the only way you have to attack is jumping. But Bilou can also throw things, and aiming for a grounded target will likely not be a very interesting task. I'd like to have something more subtle.

Par contre, ça ne donne pas forcément une réponse aux deux questions critiques: comment attaque-t-il et comment fait-on baisser sa barre de vie ? Dans la BD (ou le combat dure royalement deux pages) et dans le jeu BASIC, le point-faible de Big Caterpillar, c'est sa tête. Sauf que depuis la BD, il a chopé des espèce de cornes de taureau, et donc c'est le signe pour les joueurs de ne pas se risquer à lui tomber dessus.

Quand j'ai voulu proposer un nouveau design pour le "chenillard" (une monstre figurant dans les premiers niveaux dessinés par mon frère, sans nul doute inspiré du monstre-chenille de la Marble Zone), j'ai suivi mon instinct de chevalier d'Hyrule et j'ai mis son point faible sur la queue: taper sur sa tête ne sert à rien d'autre qu'à l'énerver. Ça ne marchait pas trop mal tant qu'on limite les attaques au saut, mais après School Rush, Bilou a acquis assez définitivement la possibilité de lancer des ennemis à la figure d'autres ennemis. On ne va pas revenir là-dessus. Comme je prévois de permettre à Big Caterpillar de se dresser façon Pokey avant d'attaquer, ça rend son point faible très vulnérable à un lancer de pomme pépère depuis le sol. Je dois cogiter un peu tout ça, donc.

When it comes to the 'look', Big Caterpillar depicted in the comic isn't very refined. Rough clay balls of alternate shade and only then a horned head. But that was years before 'bubble bats' turned into 'berry bats' ... And a stunning piece of art by Franek last year made me realize that my boss could look gorgeous if I tried to make it made of berries too.

I'll have to try tonight and see whether I can come with something along these lines...

Reste le look. Celui de la BD était très générique. Celui du jeu BASIC tout autant. On aurait pu affronter une chenille faite de boules de plasticine verte que ça n'aurait pas fait une grosse différence. Mais ça, c'était avant l'introduction des berrybats (ou, comme J.L.N aime à les appeler, les chauves-souris-baies :D). Pourquoi du coup ne pas essaier de faire comme si notre boss-chenille était lui aussi fait de fruits vivants ?