Monday, January 31, 2022

Bouc-bumper

I did so much monster design during the holidays that I struggle to process the backlog of scanned notebook pages :P

This was actually one of the first ones, before I figured out the trees-and-ropes trick. Just the idea that how aggressive the 'goats' will be will depend on how annoying you've been in first place. But an aggressive goat may kick you far away as soon as you bump on their back, or charge you and coincidently smash into a pile of boulder, revealing a cave entrance. So it might turn handy. Just make sure you make proper excuse afterwards ;)
 

Saturday, January 29, 2022

Les bonus s'emmèlent...

J'étais tout content de voir que Bilou savait aller dans l'eau, et je ne me suis pas rendu compte qu'il y avait un soucis avec les bonus: on pouvait carrément marcher dessus. Quelque-chose lié à la nouvelle propriété F_START_FALLING, sans doute ... sauf que non. c'est surtout lié aux bytes 'regarde à côté'.

C'est que l'ancien moteur de jeu utilisait le numéro du 'bloc spécial' pour décider s'il devait être solide ou non, et la fonction qui indique la 'hauteur du sol' essayait toujours de faire comme ça. L'ennui, c'est que j'ai utillisé les codes 0xfc à 0xff pour les fameux 'regarde à côté' qui permettent aux blocs spéciaux d'être des blocs, et pas juste des pavés de 8x8.

Jan.24. Managed to have Bilou switch to 'swim' state when it gets in contact with F_WATER tiles. It's as swimple as $LFALL->$INWATER on fail [H WATER ?] ...

Jan.25. It uses the new H GobExpression 'operator' that puts type of the tile under character's hotspot on stack, where it can later be compared with a constant flag (WATER). That operator will expect an elevation value on the stack first. like [2 H WATER ?] to tell "check 2 pixels above the hotspot"

But this is not the point of this post. The point is, looking at the video I captured (bottom left on the toot panel below), I noticed I was walking on disappeared apple before going into the water.

Jan.29. When you pick up a bonus, a MapAnim is spawn, that will edit graphics to get that sprinkling animation. It should clear "properties" as well, as soon as you get in contact with the collectible.

Yet, the change to newmeta changed what 'cleared' means on the map. Now, the clear value 0 means 'lookup World::properties[0] to know what you can do'. Another trap was that, when checking ground height, you might find yourself on one of the new "lookup one tile left" or "lookup one tile up" that are used to make special *blocks* of adjustable size (not just special mini-squares of 8x8 pixels). If that happens, code was still lacking "locate the actual block defining corner" and then use that special blocks's properties set to decide whether it has ground or not.

Pas le choix, donc: ici aussi, il faut retrouver le 'coin actif' du bloc spécial et aller chercher ses propriétés dans le BlockInfo correspondant.

Deuxième farce (voir l'animation): une fois le bonus effacé, il a laissé derrière lui un bloc à travers lequel il est possible de continuer à tomber, mais aussi de continuer à marcher. La faute cette fois au tableau des propriétés pré-encodées pour les blocs à définition indirecte (prévus pour les physiques particulières, essentiellement).

edit: if you don't have a twitter account, here's what the videos looked like:

Friday, January 28, 2022

when the going gets panic, the tough goes kdump

NOTE: kdump is a service that can use kexec tool to create a log-and-core dump into some place in case of kernel panic by pre-loading an additional (rescue) kernel somewhere in memory

I discovered that last year because Red Hat Linux was doing it automatically when a crash occurred (and well, being developing drivers rather than embedded device, it is bound to happen again), but if I remember correctly, one can also --install  and ./configure it on Ubuntu.

When the kernel isn't entering PANIC, though, it could raise a WARN, where you still see a registers and stack dump, but things keep rolling. It might be telling you that something is unsafe and might have triggered a deadlock if we weren't so lucky, though. Better listen to them.

Wednesday, January 26, 2022

à l'eau ?

J'imagine que ça devait être la prochaine chose à faire: s'assurer que Bilou sache rentrer dans l'eau et que les mouvements quand il s'y trouve soient différents de ceux dans l'air. C'est encore assez primitif, mais ça commence à marcher.

Let's dive in: the last demo was nice, but it sure felt awkward to have the water behave as a solid platform. I suppose it's a mandatory to-do item before I release something new: make sure the water feels more like water. It will be perfectible, of course. I don't intend to make it look more like water at this iteration, but at least ensure that I can detect when Bilou is entering water and make him act differently. And that is slowly getting in shape... 

J'ai finalement pris l'approche envisagée dans mes notes de l'an dernier (ou 2 ans ?): une bande de tiles haute comme Bilou qui autorise à la fois de tomber et de nager. La surface est dessinée à peu près à mi-hauteur de cette bande.

Du coup, quand Bilou rencontre enfin de "l'eau profonde" dans laquelle il n'est plus possible de tomber, il est déjà capable de nager là où il se trouve.

ça ne fonctionnerait pas aussi facilement avec un personnage plus gros comme ce poisson, mais on y est pas encore, au gros poisson (je n'en ai même pas dans mes cartons pour 'Dreamland', alors ...)

trivia: the animated gif above is about 100KB. The one I initially captured was over 1.5MB due to scrolling. I had to create a 'dontmove.cmd' object and give it the focus so I could capture the proper sequence. If you look carefully above the water surface, you can spot it.

There's one thing I'd like to get fixed soon: when you reach back the surface, you're stopped straight. That should not happen, but I do not seem to be able to fix it with a transition. This is a job for a revived "muad-debugging" session: it would let me see step by step why no transition is taken by re-playing the think() function after I detected yspeed == 0.

edit: I'll have to write a dedicated 'in-water' controller: hacking with 'increase' and 'freemove' doesn't produce anything convincing even after freemove is fixed so that it fails at the surface.

Monday, January 24, 2022

ça boume, vieille branche ?

Bonne nouvelle: j'ai enfin ma branche rebondissante. Je suis plutôt satisfait du résultat. A un détail près: les couleurs. Je pensais au début que j'avais pêché la mauvaise palette parmi celles de green.spr, mais j'ai du me rendre à l'évidence: ma petite animation utilise les couleurs de l'autre fichier. Je n'ai encore utilisé que des sprites "tout simples" en dehors de l'école, et j'ai forcé leurs palettes directement dans le script qui définit leur comportement. Pas moyen de faire ça avec les animations binaires de MEDS. Et si je désactive cette astuce, j'ai aussi des couleurs bizarres pour tous les monstres précédents.

Yeah. I've got one first objective met: I have branch-that-bump bumping. Just one last thing to be fixed: it doesn't use the proper palette. I thought I was merely missing some adjustment number in my script, but I had to admit the bare truth: the only reason why school zone had proper palettes for monsters is that Bilou's palettes were split from the School Rush file. It took a few tries to get palette patching working right, but it ended up easier to do than I had foreseen.

ça paraissait improbable, cela dit: après tout les animations du niveau 'school zone' s'affiche correctement. Il doit forcément y avoir une ruse de chargement que je n'ai pas encore prise en compte. Bin non. bilou.spr et school.spr partagent la même palette, c'est tout. C'est aussi bête et sot que ça.

Modifier les palettes au chargement dans l'animation n'est pas trop difficile, heureusement.

Tuesday, January 18, 2022

Keen sur Switch!

Oulah! On se calme tout de suite, les gars. Je vous vois déjà bondir sur le store, cartes visa dehors ... Il ne s'agit que de Keen Dreams, le poussin noir de la couvée. Le lost-levels 3.5 qui marque la transition entre le classique "invasion of the Vorticons" et le cultissime "Goodbye Galaxy".
Mais bon en promo à 2 euros, même si c'est le seul épisode pour lequel j'aie jamais dépenser un cent (bin oui, les épisodes 2,3,5,6 étaient introuvables dans mon rayon d'action et les épisodes 1 et 4 étaient redistribuables librement :-P), même s'il est affublé d'un scénario discutable, de graphismes meilleurs-mais-un-peu-à-l'arrache et d'un gameplay franchement perfectibles, je tente.

K1 : classique.
KD : meh.
K4 : cultissime

Allez, je remets un petit comparatif pour ceux qui étaient ailleurs dans les années '90. La première trilogie, c'est un personnage de taille modeste dans un environnement aux graphismes minimalistes: à-plats de couleurs, perspective frontale, décor épouillé ... mais c'est le tout premier jeu de plate-formes à scrolling sur PC alors on se l'arrache.

Overview: There are gems of game design in the 'Commander Keen' franchise. Okay, likely fewer of them in the 'Keen Dreams' episodes. And unfortunately, this is precisely the one for which we can find sources on the Internet and a port on the Nintendo Switch game store. It could have been a nice idea, but given how the original material was processed, it should rather have "crime scene ** do not cross **" banners around.

La suite "Goodbye Galaxy" prend le pari d'une perspective pas-complètement-cavalière (influence de Prince of Persia ?), offre un personnage plus grand et des décors nettement plus riche. Elle amène aussi une musique de fond et des effets numérisés (K1 devait se contenter de bruitages au PC-Speaker. Oui, ça fait mal aux oreilles).

Au niveau du gameplay, passer de K1 à K4, c'est un peu comme passer de MegaMan à MegaMan X: de 2 directions de tir, on passe à 4. On ajoute des pentes, la possibilité de s'accrocher aux rebords des plate-formes et de monter/descendre à des barres de pompier. Le jeu gagne ainsi énormément en souplesse. On rajoute aussi un saut plus ou moins haut et qui réagit au millipoil. Le saut minimum couvre les 2 blocs au-dessus de Keen. Le saut maximum (sans pogo) en prend 3 de mieux. (Keen faisant lui-même 2 blocs de haut).

Si graphiquement, on pourrait pardonner à Keen Dreams d'être un cran en-dessous du niveau de K4, le fait qu'on ne sache pas encore s'accrocher au bord des plate-formes fait nettement plus mal. En introduisant une perspective ou le sol apparaît presqu'aussi large que le personnage n'est haut, on introduit aussi une incertitude sur notre capacité à atteindre une plate-forme donnée. Comme en plus on nous a retiré le pogo, ça donne un jeu où on va souvent rater ses sauts. De plus, si KD réagit aussi au millipoil, il n'a qu'une hauteur de saut (peu s'en faut) à l'instar du classique "Invasion of the Vorticon". On ira donc souvent se manger le plafond ou finir dans les pieds du monstre situé au-dessus de nous, sur une plate-forme jump-through. Vérification faite: le jeu d'origine n'a pas ce problème (il y a 1 keen de différence entre le saut le plus bas et le saut le plus haut), pas plus que Keen 1. Avoir forcé une seule hauteur est une spécificité de la reprise sur switch.

#SHOOT: commander Keen's primary mean of defence is to shoot at baddies, in all episodes. 'Keen Dreams' shots significantly differ from all other episodes' neural stunner shots, though. They're affected by gravity rather than shot straight, but most of all, their effect is temporary. That wouldn't be so hard to stand if we had not such a limited stock of amno. The switch port of the game makes that even worse by resetting the amno counter when you enter a level. No more way to use the first levels to hoard amnos so you've got more shots allowed in a later, harder level.

Let's make it a lesson learnt for Bilou Dreamland: if you permanently consume something by shooting, then the effect of shooting should be permanent as well. As often as possible.

La dernière grosse différence entre Dreams et le reste de la série, c'est qu'ici Keen n'a pas un pistolet, mais qu'il lance des pastilles-fleurs affectées par la gravité. Vu le nombre d'années depuis ma dernière partie de Keen "canoniques", on va dire que je devrais m'y faire. En revanche, leur effet est limité dans le temps. A l'époque, ça m'avait valu quelques morts évitables. Ici, ce sera l'occasion de voir ce que les joueurs de Bilou: Dream Land ressentiront. Verdict: des munitions limitées avec un effet temporaire = panne sèche assurée. On veillera donc à ce que Dreamland garde "munition consommée = effet permanent" tout comme SchoolRush.

Que dire de l'adaptation sur Switch, donc ? Eh bien, figurez-vous qu'ils nous ont ajouté des musiques. Si si. En gardant un style assez proche des sonorités adlib de l'époque (bien), mais assez moyennement inspirées sur les thèmes. On est plus dans l'ambiance de Keen 6 que de Goodbye Galaxy et ses thèmes inoubliables, selon moi. Il nous ont aussi rajouté des petites bulles de texte ça et là, avec des polices de caractères improbables ou des menus avec des icônes douteuses. Jugez plutôt! Mais sinon, à part le fait que les vies semblent illimitées, on est dans une adaptation assez fidèle du titre original ils ont complètement ruiné l'intérêt principal du jeu.

Je m'explique: le coeur de Keen Dreams est de s'assurer qu'on a assez de bombes pour affronter le boss final, insensible au FlowerPower. Ces bombes sont cachées dans des recoins des niveaux (de certains niveaux, en fait). Et comme on ne peut visiter chaque niveau qu'une fois sur une partie, se ruer sur la sortie n'est généralement pas la bonne option. Pourtant, dans certains niveaux, atteindre la sortie est assez simple, voir trivial.

Je peux comprendre que les éditeurs du 'remake' aient décidé que les niveaux soient librement revisitables, mais avoir 'sucré' purement et simplement l'objectif premier, c'est à se demander pourquoi reprendre le jeu.

#game design: The ultimate goal of the original Keen Dreams episode is to find and collect Boobus Bombs. There are a few in many levels (but not all) and a warning is shown when you enter the level. If you've already played enough to reach the final boss' castle, most likely you've realised that you were short of those bombs, and that they were the only thing that could affect the boss. You can more or less start the whole game anew and be more careful not to rush for the exit of bombs-featuring levels.

Granted, this is an arguable game design choice by 202x's standard. It already was when I played it after DKC! But it is the keystone of the whole game. Levels in Keen Dreams aren't SMB-like course to complete left-to-right. They aren't either key-and-locks mazes of earlier "Invasion of the Vorticon" episodes. You may have a tall waterfall level where the exit is a few hops ahead to the right, but that has depth and heights to explore for you to find the precious bombs.

The switch review allowed levels to be re-visited freely, killing the thrill of not finding enough bombs. It revealed secret passages with a changed color. Worst of all, it adds a 'RUN' mechanics that means some of the jump-puzzles were you where teased with bombs but then had to figure out how to reach them got completely undermined. Oh. And they screwed the *JUMP* mechanics.

Autre point douteux: l'ajout d'une mécanique de "course" ... à savoir la possibilité pour le
personnage de doubler sa vitesse, ce qui casse évidemment certains puzzles basés sur les sauts. Dans la ville des patates, par exemple, on pouvait voir assez facilement la position de ces bombes, mais elles sont hors d'atteinte. Pour les choper, il va falloir aller jusqu'à la fin du niveau, remarquer une libellule-plate-forme parmi les autres libellules, grimper jusque tout en haut et réussir un sans-faute dans un enchaînenement de sauts. Puis revenir.

Comme si ça ne suffisait pas, tous les passages secrets vous sont révélés. Oui, vous m'avez bien entendu: alors que les passages cachés (et où vous êtes invisible) sont une des pierres angulaires de Goodbye Galaxy (et donc de Dreams), ici, on a marqué leur emplacement par du sol plus clair. Plus aucun mystère, du coup.

#COLLECT: Keen games have always featured lot of sweets to pick up. ultimately, they would grant you 1-UPs, and with a game where any hasard means insta-death, 1-UPs are key to success. That was balanced with 1) perma-completion of levels 2) exponential target (next 1-UP will cost higher) and 3) positioning of high-value sweets in dangerous spots. The switch edition breaks this completely. Levels can be re-visited at will, but there is no 1-UP any more (they aren't even replaced with something else) because you've got infinite stock of retries. The only thing you could earn for picking a sweet is ... increasing the completion meter for the level. This is actually frustrating because of the high-value (lost) high-danger (preserved) hidden sweets: you'll get something more only if you find 100% of the sweets in a level, but even a 10-years-old can see that goal is actually unreachable (especially since the level doesn't remember collected sweets if you die).

Est-ce qu'il y a encore quelque chose à dire ? Circulez, m'sieur-dames: y'a rien à voir.
oui! Les munitions! j'ai déjà expliqué en quoi la combinaison tir-qui-assomment et munitions-limitées font mauvais ménage. La réponse de gamer à ce problème épineugle est d'utiliser les premiers niveaux pour maximiser son stock de munitions tout en contournant les ennemis, évidemment. Une grande partie des maps des niveaux qui ne contiennent pas des bombes ont des cachettes à 'graines de fleur' en dehors du chemin principal, histoire de quand-même récompenser la récolte. Mais dans cette version sur switch, votre compteur de munitions est remis à 10 chaque fois que vous entrez dans un niveau. Aucun intérêt, donc.

Resterait-il les bonus-à-points ? même pas! Ils servent normalement à gagner des vies, mais on l'a vu: les vies sont ici illimitées (et donc les 1-UPs retirés des maps). On pourrait se dire que 'c'est pas grave: ce sont des gougouilles, ça reste sympa de juste essayer de les attraper toutes. Oui, sauf que chez ID, ils aimaient bien mettre une part de gateau derrière un obstacle bien chaud, et comme on a qu'un seul point de vie, on est en réalité invité à décider si on se sent capable de prendre le risque ou pas. Tenter le 100%, c'est la mort assurée. Du coup, même J.L.N s'en rend compte: c'est nul.


Le fruit-bouffi

Dans un ancien post, j'avais des piafs-saucisses-plate-formes. Dans un autre, j'ai des piafs-copains-qui-nous-transportent-à plusieurs...

I've got an old post where birds have been stretched and helium-inflated so they could be used as walkable platforms, and another, more recent one where birds have birdish shapes and use ropes to carry the player -- but you need many of them if you don't want to fall down.

What if I could get the new-one turn into the old-one for some specific locations, as result of a key-and-lock interaction ? A possible key would be something you can feed the bird with, but isn't exactly part of their diet. Maybe a raw berrybat ?

Et si on pouvait faire transformer un piaf-copain en piaf-plate-forme ? par exemple en lui faisant avaler quelque-chose qu'il ne digère pas vraiment ...

Une chauve-souris-baie pas mûre, par exemple, qu'on aurait été pêcher dans une caverne de la montagne ...

à creuser.

It would introduce a valid reason for having caves in addition to peaks within those mountains (bats like caves more than peaks).