Friday, October 11, 2019

gameplay: les éthers

 Je suis retombé sur un vieux document (~2005) présentant une mécanique de jeu qui n'a pas vraiment trouvé sa place dans Bilou : les Ethers. Je venais à l'époque de jouer à Minish Cap, Kirby: Amazing Mirror et à Cave Story et je cherchais quelque-chose succeptible de fournir un gameplay intéressant tout en intégrant la "progression" des pouvoirs de Bilou.

On aurait donc commencé le jeu avec un personnage capable tout juste de marcher, lancer des trucs ou faire des sauts d'une taille modeste. On aurait aussi eu dans le jeu des petits éléments à la forme indéfinie, mais brillants et colorés, qui influencent les actions possibles.

Comprenons-nous: les pouvoirs évolutifs font partie intégrante du synopsys depuis sa première écriture en '94, mais à l'époque ils concernent essentiellement des "pouvoirs technomagiques" comme un tir laser, voler, paralyser les ennemis, etc. Et en plus, ils "consomment" de l'énergie magique que l'on doit ramasser ici ou là.

Les éthers doivent bien être ramasser pour octroyer le pouvoir correspondant, mais ils n'auraient pas été "consommés" quand on s'en servaient. Ils devaient aussi servir de points de vie (pour les Ethers bleus) ou invoquer Bouli (ethers jaunes) et utiliser des attaques combinées (ethers rouges). Les autres (cyan et verts) devaient principalement permettre de booster les capacités de mouvement de Bilou, plus que ses facultés d'attaque.

à la place, ils sont perdus quand on se fait toucher ... et plus le choc est violent, plus on en perd. L'objectif étant de récompenser le joueur qui parvient à passer un obstacle sans dégats en mettant certains ethers uniquement avant l'obstacle et un secret/bonus nécessitant ces éthers de l'autre côté -- de la même façon que Kirby va nous inviter à traverser une zone tout en gardant un marteau qui sera nécessaire pour débloquer un coffre dans Amazing Mirror.


Seulement voilà. Je n'ai jamais trouvé un moyen convainquant de faire "gagner" des ethers à Bilou. Contrairement à Cave Story, ici, on est pas attaqué par des vagues de mini-monstres qu'il faut dégommer à toute vitesse. On est plutôt dans un jeu où "les bonus se dandinent à environ 1m du sol". Et les idées pour en obtenir à partir des p'tites pommes et des fleu-fleurs m'ont semblé 'anti-Bilou' sur le principe ... donc le tout est tombé dans l'oubli.


Wednesday, October 09, 2019

[done] remove import statement

Bion. Voilà une chose de presque faite. On pourra donc faire le nettoyage des commandes "import" (définissant les ennemis, etc) directement à partir de LEDS. De quoi permettre un peu plus facilement de passer d'un type de niveau à un autre en mode 'gamedev nomade'.

Je suis encore loin d'un outil qui soit "game-jam friendly": c'est pas avec SEDS+LEDS que vous allez remporter la Ludum Dare (mais si vous y arrivez, postez-moi le lien vers votre jeu, hein ^_^), même comme ça. Et avant de mettre ça sur ma DS, je devrai au minimum prévoir un message du type "êtes-vous sûr" ([done]), parce qu'en revanche, je n'ai encore rien pour permettre de rajouter des blocs définissant les machines d'états (ou autres) dans LEDS ^^"

---

Ah. Vous êtes toujours là ... je vous dois peut-être bien des excuses, du coup. C'est vraiment du micro-posting, je le reconnais. Le fait que j'aie commencé à parler de la feature il y a deux mois ne rends pas ceci beaucoup plus intéressant. C'était du micro-coding, aussi. Je dois m'y faire. Euh, bon, c'est vrai: je joue beaucoup à la switch ces derniers temps. Et j'ai repris une série de bouquins (Hyperion / Endymion) que j'adore depuis près de 20 ans, vu que ma collègue-et-les-méthodes-de-la-rationalité ne les avaient pas encore lus...

Tuesday, October 01, 2019

Ori and the Blind Forest


J'ai des screenshots d'Ori and the Blind Forest dans mon répertoire de fonds d'écran depuis Septembre 2015... Ce jeu est tout simplement une pépite, et depuis ce week-end, je peux enfin y jouer sur ma switch. Youpie.

Que ce soient les graphismes, l'animation ou la bande son, ce jeu est juste sublime. Le personnage se contrôle assez agréablement, à l'exception des atterrissages sur des zones étroites que la physique du jeu rend assez ardus (d'autant qu'il s'agit généralement de plate-formes suspendues qui se mettent à se balancer quand on arrive dessus).

Ori and the blind forest is another of those indie (?) games I've been longing for, hoping that one day it might be ported onto a system I'd own. I've been in love with the game's look since September 2015 (according to my Pictures/backgrounds/ timestamps) and now at last, I can play it. After watching some speedruns of the game, I even tweaked the screenshots I had so that they start giving me advices to be a better programmer.

Les enfants étaient sous le charme, évidemment, mais la progression de la difficulté est particulièrement éprouvante pour eux. Faire un saut à partir de la course, ça demande mine de rien pas mal de timing et de confiance en soi. *deline, du haut de ses 10 ans, restait régulièrement immobile pendant plus d'une minute avant de se lancer pour un saut délicat.

Autre petit clin-d'oeil: pendant que j'attendais de pouvoir jouer au jeu, j'ai progressivement "customisé" les économiseurs d'écran pour qu'ils m'aident à prendre de bons réflexes de développeur en équipe, à adopter les "coding guidelines" de mes collègues quand ce n'était pas automatique pour moi.

J'ai évidemment mitraillé le jeu pendant mes premières heures. J'espère revenir dessus en mode "pixel study", même si je risque de souvent être dépassé. Le seul point qui me déçoit un peu, c'est le "bestiaire", principalement constitué de blobs ou de choses qui vont trop vite pour qu'on les distingue ...

I'll have to make more detailed posts about it later on. So far, I can just confirm that the kids loved it (10yo. girl + 6yo. boy), but struggled with almost every new obstacle to pass, be it a jump over a deathly pit, climbing a wall or whatever.

Saturday, September 28, 2019

owlboy: monkey feedbacks

J'étais arrive au continent volant, convaincu qu'avoir pris conscience que je jouais à un shoot-em-up allait enfin rendre le jeu plus facile à aborder. Malheureusement, ça n'a pas suffi. Je me débats avec le tir explosif du personnage secondaire, je peine contre des mouches carnivores invisibles pendant des heures pour finalement découvrir dans un let's play (après avoir laborieusement passé la zone) qu'en réalité elles sont juste déclenchées par un timer quand on reste trop dans le noir, et qu'il faut trouver d'autres torches pour les tenir à l'écart, et non essayer de les vaincre.

Je ne peux pas m'empêcher de penser que quelque-chose lié au temps devrait clairement indiqué comme tel au joueur. Ok, l'idée des mouches carnivores est merveilleusement intégré à l'histoire, mais rien ne les lie au temps, au fait d'être dans l'ombre, ni même ne nous renseigne sur ce qu'elles sont réellement.

d'autant que juste après ce dialogue sur la peur des mouches, on tombe sur un buisson avec des insectes qui tournent autour et qui se mettent à nous tourner autour. On ne sait pas les toucher, mais si on brûle certaines lianes (le personnage au "briquet" vient de nous dire qu'il ferait de son mieux pour les tenir à l'écart, c'était assez gros comme tutoriel déguisé), elles quittent les lianes pour se réfugier dans le buisson voisin.

Mais non. Ce n'était pas ça.

Le mouches en question sont noires, et invisibles dans le noir. Et je ne suis pas le seul à m'être tout d'un coup dit "eh ? que se passe-t'il ? pourquoi je perds ma vie, tout à coup ?". On aurait pu être dans une impasse, et être forcé d'apprendre. Les mouches auraient pu être visibles si on est mis game-over. Mais en réalité, si on va suffisamment vite, et qu'on va de l'avant, on reste assez proche des lucioles innoffensive jusqu'à ce qu'on atteigne un 'fruit-lumière'. On a donc pu passer et les mouches vont passer au second plan. Le problème se reproduira plus tard dans le niveau, quand les fruits-lumière se feront plus rares. C'est là que j'ai dû faire appel à un wiki pour comprendre de quoi il retournait, à quoi ressemblaient ces "mouches", etc. personnellement.

Je suis tenté de raccrocher ça au fait qu'on est en face d'un jeu indé, avec une équipe trop restreinte pour qu'à un moment quelqu'un de suffisamment influent et avec assez de recul sur le développement ait dit "non, ça ne va pas. Les joueurs ne comprendront pas". Peut-être bien l'origine de ce que Kirby Kid appelait "that indie feel" ...

Tout ça me donne l'impression que la communication des objectifs et des avertissements n'est pas aussi claire qu'elle le pourrait. Et le deuxième boss dans la lave a tendance à me renforcer dans cette idée. Ici, on se fait régulièrement attraper par un des singes et plonger dans la lave, ce qui met fin au combat. 30 à 40 minutes de jeu plus tard, ça n'avait toujours pas changé. Je ne m'attend plus à passer un boss du premier coup dans le jeu: je sais qu'il faudra que je sacrifie d'abord quelques vies pour comprendre ce qu'on me veut.

Ici, il aura fallu une vidéo youtube pour que je réalise qu'il était possible de se libérer de ce genre de prise. Et non, je n'aurais jamais pensé utiliser le bouton "Saut" pour ça! Ni qu'un tel mécanisme puisse être introduit si tard dans le jeu sans un indice sur l'action attendue. D'autres évènements en cours de combat (comme le fait d'être enflammer) sont annotés avec l'action à faire pour se "soigner". Pourquoi pas ici ?

Iconoclasts perdait peut-être parfois un peu en immersion avec ses icônes, mais au moins les intentions des développeurs étaient claires. Ici, on dirait qu'il manque le message "RELOAD" d'un rail shooter.

Et ce genre de problème de communication va se généraliser jusqu'à ce que l'on trouve le troisième personnage et que le jeu s'écarte un peu du fait de tirer sur des cibles. Mais Alphonse et son arme dont on ne voit ni la portée ni la direction de tir va nous faire passer un désagréable milieu de partie...

https://www.spriters-resource.com/fullview/78065/ {alphonse}
https://www.spriters-resource.com/pc_computer/owlboy/sheet/84737/ {monkey}

Thursday, September 26, 2019

Charly et le Poisson-Rêve des playmobils

Link's Awakening, c'est peut-être bien mon jeu préféré. C'est en tous cas mon "Zelda" préféré depuis 25 ans et j'y ai rejoué à de nombreuses occasions. Donc oui, évidemment que je me suis chopé une cartouche du jeu dès que possible. Bien entendu, que j'avais l'oeil sur sa date de sortie dès qu'elle a été annoncée. Naturellement, je bidouille nettement moins mes p'tits éditeurs DS le soir.

Ce mois-ci je joue à Link's Awakening dans son incarnation switch... "au pays des Playmobils", comme je dis avec J.L.N et *deline. En mode héroïque (pas de p'tits coeurs à part au village, pas d' petites fées à part dans les fontaines), vu que j'en étais arrivé sur GB à essayer de finir le jeu sans épée L2 et sans boomerang. Mais un Zelda, c'est quand-même plus intéressant quand on doit chercher plus que quand on doit chercher moins.

Et je me suis même fait un 'fork' de la partie où je ne m'autorise les sauvegardes que si j'ai réussi à débloquer un objectif sans perdre de vie.

I'm not 100% sure this is my favourite game ever, but it is clearly my favourite RPG ever. Next month will be #linktober for me. And I'm collecting some screenshots to improve my pyramid level if I can.

Adventures in LVM

I had issues resizing the / partition of my system some time before creating the last VM I was using at work, so apparently I though "oh yeah, I'll enable Linear Volume Management (or whatever LVM stands for) this time".

Everything worked fine as long as I was running on that VM. And I don't remember having to grow the partition (I'm unsure the disk backing it would have allowed it to grow a lot, anyway).

But then I had to make the same virtual disk working on a new root filesystem, likely because the new VM has UEFI boot enabled by default and the previous disk image was for MBR-boot only... https://www.svennd.be/mount-unknown-filesystem-type-lvm2_member/ helped a lot to recover stuff.

Do you think that would make it.

No. Of course not. I managed to screw my enlightenment window manager configuration, and end up with nothing but black-on-black windows (with nice blue shadows when I switch focus, though). Since all the enlightenment configuration files are "encrypted" now, I unfortunately can't vim me out of this mess, so I thought "never mind: I'll mount a second instance of that hard disk and recover files from there ... haha. Nice try.

Of course, the two disks have the same LVM identifier, so none of lvscan and friends allow to use both at the same time >_<

some shutdowns later, I copied back my configuration and have a working window manager again. pfew.

Next time, I'll remember to archive contents of ~/.e/ before feeling adventurous... enlightenment nicely makes up to 10 backups of your files, but when one more is lost about everytime you start a new session, apparently. And one quickly makes lots of sessions while trying to fix such issues :-/

Monday, September 23, 2019

owlboy: drôles de contrôles.

Les graphismes d'Owlboy sont superbes, les musiques plantent une ambiance idéale et j'adore l'histoire. Pourtant, pendant tout le début de l'été, je n'ai pas ressenti cet effet d'appel à jouer que j'ai pu avoir avec hob ni meme flinthook. La progression est laborieuse, j'ai la sensation d'être brouillon et de ne pas bien comprendre ce que le jeu attend de moi.

J'ai commencé par penser qu'il s'agissait d'un problème d'interface: si seulement je pouvais
forcer le jeu à tirer quand je pousse sur Y plutôt que de réclammer un ZR, tout irait beaucoup mieux, non ? Ça me remettrait dans une configuration identique à celle d'Iconoclast et de Flinthook auxquels j'étais aussi en train de jouer. Les choses deviendraient enfin naturelles. D'autant qu'en y regardant de plus près, c'est aussi le mode de fonctionnement que j'ai utilisé sur Super Mario World et Donkey Kong Country.

Puis je me suis rendu compte que ce serait incompatible avec le système de visée du jeu et j'ai commencé à prendre conscience de tous les raccourcis prévus dans les actions du joueur. J'ai alors commencé à reconsidérer le jeu, non plus comme un jeu de plate-fomes où on sait voler, mais comme un shoot-em-up avec des phases au sol, et à laisser le jeu en mode "tir automatique" par moment pour me concentrer sur mes mouvements d'esquive.

Et des "raccourcis", il y en a des fameux. Voyez, en bleu la séquence d'actions que j'effectuais jusqu'à la fin du deuxième "donjon" pour pouvoir tirer: d'abord commencer à voler puis invoquer mon partenaire, et enfin, viser et tirer. Il y avait aussi une autre possibilité consistant à faire apparaître d'abord le partenaire, puis à le 'ramasser'.

Tout celà est rendu encore plus compliqué par le fait que certaines pressions de touches peuvent nous faire revenir en arrière, et que lorsqu'il est au sol, il faut être assez près de son partenaire pour pouvoir le ramasser. En clair, dès que le boss va venir vous mettre la pression, c'est fini. D'autant que la plupart des coups qu'on encaisse projettent notre personnage et son partenaire dans des directions différentes. Mais heureusement, si on se concentre sur le côté "shoot-em-up" du jeu, bin le réflexe quand on s'est fait toucher n'est plus de sauter mais bien de se remettre à tirer. Et là, bonne nouvelle: utiliser le bouton de tir nous "téléporte" instantanément dans l'état "en train de voler avec son partenaire accrocher qui se met à tirer dans la direction indiquée par le 2eme stick. On peut dès lors oublier toute la partie bleue dans les phases d'action et se concentrer sur l'essentiel: un stick pour bouger, un stick pour viser, une gâchette pour changer d'arme et une gâchette pour tirer.

Je pensais plus ou moins jusque là que les noms "plate-forme", "beat-em-all" et "shoot-em-up" n'avaient d'utilité que dans un catalogue ou un magasin, mais après plus de 20 ans de pratique du jeu vidéo, on dirait que ça va plus loin. Le fait de penser "c'est un shoot-em-up" semble activer un autre ensemble de réflexes, y compris un mode de vision plus global pour surveiller les trajectoires de plusieurs projectiles à la fois.

Et pourtant, pendant une bonne partie du jeu (et en particulier presque tout ce deuxième donjon), le fait de tirer est beacoup moins impliqué: on va essentiellement résoudre des énigmes en transportant et lançant des objets (ennemis-bombes, nuages ou cruches d'eau pour éteindre les monstres de feu, etc). De quoi endormir le peu de réflexes qu'on aurait pu se constituer dans les phases d'action du premier donjon.

Bref, Owlboy a fait le pari d'un jeu multi-facette, qui alterne des phases de shoot-em-up, des phases de puzzle "à la zelda" et des phases (rares) de réel platforming ("Attention: ces gnomes ont une ouïe super-fine. Ils t'entendraient battre des ailes à 100 mètres. Quoi qu'il arrive, ne t'envole surtout pas!"). Une richesse indéniable, mais pas toujours claire à appréhender pour le joueur. Et qui va vous demander -- tout comme le personnage doit le faire dans le jeu -- d'abandonner derrière vous vos a priori si vous voulez continuer à aller de l'Avent.

Saturday, September 21, 2019

owlboy

I should have made a "game to watch" post about DPad Studio's "Owlboy" game since I saw the first screenshots in my Google Reader feeds (possibly as early as 2008?), and if I had made another "show me what you (wanna) play, I'll tell you who you are" post, I would have been featured just like Iconoclast and Ori. I haven't said much about them yet mostly because I had no hope to see those games coming to either Linux or NDS. It all changed with their announcement on the Nintendo Switch.

Owlboy fait partie de ces jeux que je surveille "en secret" depuis le début de leur développement. Rétrospectivement, j'aurais aimé en avoir un post déjà écrit depuis 2008 ou 2011 qui explique ce qui m'attire dans le jeu, comme ça j'aurais pu commencer à poster des "critical owls" dès que j'ai commencé à jouer ... Mais voilà. Je devais avoir la tête ailleurs et me dire qu'il était peu probable que j'arrive à le faire tourner sur mes machine jusqu'à ce que je passe en mode #sijavaisuneswitch.

Voilà donc un jeu au pixel art de Snake Pixel époustouflant, d'un niveau capable de se mesurer à celui de Henk Nieborg dans Shantae. Et évidemment, c'est le premier point qui m'avais conquis. En plus de ça, il était présenté au départ comme un jeu de plate-forme (je reviendrai là-dessus), mon style de prédilection, garanti 100% 2D. Et si côté blog je suis resté assez discret, en revanche, j'ai commencé à ajouter des images de Snake à ma collection "pixelstudy" depuis 2015.

https://twitter.com/pypebros/status/1155462780259991552
Maybe you wonder then why I didn't start playing it straight as I got the Switch ? Well for the exact same reason I'm not playing Link's Awakening remake right now: I wanted to find a physical support for it. I don't want it to be in competition with other newer titles in a too-small, un-expandable storage.

J'ai finalement mis la main par pure chance sur une copie physique dans un magasin ayant pignon sur rue(lle) et même si j'ai eu beaucoup de mal avec son gameplay au début, j'ai continué à y jouer par-ci par-là tout l'été parce que moins éprouvant pour les pouces, et aussi parce que c'était devenu l'histoire-de-papa pour J.L.N, pendant que sa soeur lisait seule le 4eme tome de Harry Potter.

I've been using the 'shoot picture while playing" a **lot** with this game, and I barely started pixel-studying all the things I gathered. I've been into places I expected and into many more places I wasn't expecting at all.

And the story ... boys, the story is just gorgeous. It's not just a rescue-your-pals theme. From act 1, there is a strong artistic sense in how the game play make you feel how the character feels miserable and struggles to find his place in the society although he's not as actively rejected as in Secret of Mana. I love how DPAD studio speaks about the dormant sense of doom and lack of proper reaction from people in charge of our destinies, the underlying risks of pushing science to the limits. If there was a "Meaningful Theme" award for a video game, Owlboy (much like Iconoclasts) truly deserves to be nominated.


Et franchement, autant au départ c'est pour le côté léger de son graphisme que j'avais laissé voir mon fiston que je commençais à y jouer, autant je trouve le jeu riche en enseignements. Sentiment de solitude, déception d'avoir déçu, difficulté et importance de l'amitié, de la franchise. Responsabilité quand à l'emploi des avancées scientifiques. Et il ne s'agit pas ici de simples effets dans les dialogues. C'est vraiment l'intrigue principale, c'est renforcé par le gameplay.

A un moment j'ai été tenté de laisser la console de côté sur l'air de "bah, pourquoi est-ce que je me fatiguerais à essayer d'atteindre la 3eme relique avant les pirates ? de toutes façons le script va faire en sorte qu'ils arrivent les premiers quoi que je fasse: c'est perdu d'avance". Puis j'ai pris un pas de recul, et j'ai réalisé que c'était exactement le genre de réaction que le personnage était succeptible d'avoir, puisque quoi qu'il fasse, on trouve toujours qu'il a fait les choses de travers et que c'est de sa faute si tout va mal.

Friday, September 20, 2019

Sloppy Mouse vs. Windows 10

Huuuge thanks to winaero blog author! I can now have the desired mouse behaviour on my freshly-installed Windows 10!

Having the focus follow the mouse rather than having to click to focus windows is already hidden enough in Windows ('Make the mouse easier to use' in the 'old Control Panel), but not raising windows when you hover them while still giving them the focus is completely arcane wizardregistry: we'll have to locate UserPreferencesMask under  HKEY_CURRENT_USER\Control Panel\Desktop, and then clear bit 0x40 in the first bytes of that binary blob.

Miles away from the convenience and flexibility of enlightenment (see picture), but at least it exists now.

I cannot blame my colleagues for finding the resulting behaviour weird. But it's definitely more comfortable for me.

 - - -

That was for the nice part. Unfortunately, despite they have had 20 years to improve their operating system, they still manage to suck. Sometimes for trivial things, sometimes for much more important things.
- How do I customize colors in Windows 10 ? You cannot. You may switch between white-on-black or black-or-white. And that's it. You're uncomfortable with large, white areas because you're an IT professional and would prefer black-on-lightgrey instead ? too bad. You could use some tints on the idle-window-bars because white title bars over white windows backgrounds just feels like hide-and-seek ? too bad.
- You would like to keep using your previous virtualization solution rather than going for an unknown Hyper-V service ? Good luck. If you remember trying to install another browser than Internet Explorer at the edge of the millenium, welcome back. In case you wonder why I'm unhappy with hyper-v,
  - it has no video card / audio card support : everything will go through the Remote Desktop Protocol
  - it sucks dealing with SHIFT+< or ALTGR+$ to produce symbols we use a lot in programming
  - it steals some key combos like CTRL+ALT+UP which I've been using for ages to control my window manager.

Even the 'windows menu' is trying to drive me mad. Hit the windows-key then type a word and you'll be allowed to search for that word in all the programs / configuration items / whatever. That part is good. Click the icon and there's a random (?) chance that typing will have no effect. I mean not at all. Even hitting the ESC key no longer closes the menu!

More substantially, that O.S. is still unable to write a new file when a process is using it, of course.

Edit: hopefully,  following https://ugetfix.com/ask/how-to-disable-hyper-v-in-windows-10/ + https://github.com/kubernetes/minikube/issues/4587 (now that my PC has a repaired .Net 3.5 framework) let me run a virtualbox VM again. Hope I'll get rid of those hyper-v horrors ASAP.

Tuesday, September 17, 2019

ImportsWindow::render()

Bion, la nouvelle garde-robe est installée ... j'ai eu un peu de temps pour regarder comment m'y prendre pour avoir les images des différents personnages du jeu sous le contrôle de la nouvelle "ImportsWindow" et en tracer les grandes lignes dans le code
[done] utiliser les ImportBlocks pour choisir quel état afficher où
[done] mettre en place une matrice de scaling pour les éléments secondaires d'une ligne 'import'
[don't] sauver les noms ? 

Je vous en raconterais bien plus, mais je suis à la recherche du truc électrique responsable des coupures de courant à répétition dans la maison ...

Saturday, September 07, 2019

272 sprite pixels / line.


Si faire une image sur DS c'est un peu comme monter une bibliothèque-étagère contre un mur, alors faire une image sur Super Nintendo, c'est pareil. Sauf que le toit est en pente, qu'il y a un conduit de cheminée qui dépasse, des poutres de toiture apparentes et une tablette d'appui de fenêtre dans le chemin.

Bref, il y a des contraintes à gogo et il faut tenir compte de toutes ces contraintes-là en même temps. Une qui m'a particulièrement perturbé, c'est la limite à 34x8 pixels de sprites par ligne horizontale en plus de la contrainte d'un maximum de 32 sprites par ligne (sur un total de 128 sprites, quand-même. ouf.)

En clair, la console a beau être capable de faire le rendu d'un sprite de 16x16 ou 32x32 pixels d'un coup, ça ne lui donne pas plus la possibilité d'utiliser les sprites pour faire une ligne de vagues couvrant tout l'écran (256 pixels) avec 8 sprites de 32x32. Enfin, si, mais vous n'aurez plus droit qu'à deux personnages sur la même ligne, et pas 24 autres sprites.

Je me suis donc mis à essayer de comprendre comment la structure du chip graphique de la Super Nintendo pouvait bien expliquer ça. L'idée de base, c'est que la console n'a qu'une bande passante limitée à sa mémoire graphique, tout juste suffisante pour aller chercher assez d'informations pour construire une ligne d'image sur le temps qu'une ligne de graphisme est tracée à l'écran par le canon à électrons. J'avais déjà appris que c'était vrai pour les décors -- c'est ce qui explique qu'on doive descendre à 4 couleurs par plans si on veut ajouter plus de plans -- reste à comprendre ce que ça implique pour les sprites.

Pour chaque pixel que le contrôleur du signal d'écran produit, il va falloir tester les sprites actifs et pour certains (peut-être chacun) d'entre-eux, il faudra regarder si le pixel correspondant est transparent ou opaque. Le premier pixel opaque dans l'ordre de priorité défini par le hardware gagne le match et les autres ne seront pas pris en compte. Ce genre de chose peut être réalisée efficacement avec un bus à collecteur ouvert et un circuit de contrôle des sorties de chaque unité "pixel pour le sprite S" dépendant du résultat des circuits précédents. Mais ça suppose qu'on ait, pendant toute cette phase de génération d'image, accès à l'ensemble des pixels de tous les sprites pour la ligne en cours.

La bande passante de la mémoire n'est pas suffisante pour aller regarder chacune de ces valeurs à chaque pixel, il faut donc supposer qu'il y a à l'intérieur du chip graphique un cache de 8 pixels de large (d'où le x8) pour chaque comparateur et que ce cache est rempli une et une seule fois lors du traîtement de la ligne.

Il me restait à comprendre comment ce genre de préparation est compatible avec des sprites dont on peut modifier la position en cours d'image. Et là, surprise: selon Upsilandre,

[...] Tu peux pas modifier la [Sprite Attributes Table] pendant l'affichage, ça veut dire pas de multiplexage software possible contrairement à la megadrive.

Le principe des sprites au raster c'est que les 34 patterns sont chargé en amont pendant le Hblank dans des registres internes. Ensuite c'est un jeu de priorité cablé dans le hardware qui va fait que tel pixel de tel registre aura la priorité sur les autres.

En arcade c'est mieux, t'as un (double) line buffer donc ils peuvent charger les pattern pendant toute la durée de la scanline précédente (et pas juste pendant le Hblank) c'est ce qui leur donne ces performances bien supérieur

J'aurais cru que la technique de multiplexage -- classique sur C64 ou NES et possible sur NDS -- était omniprésente sur console, et sur la 16-bit de Nintendo aussi. Visiblement non.

Et pour creuser un peu plus loin, les chiffres sont sur http://folk.uio.no/sigurdkn/snes/timing.txt. C'est un peu difficile d'en tirer un nombre d'instructions possibles par ligne retracée à l'écran, mais les chiffres annoncés me portent à croire que le 65xxx dont la Super NES est équipée garde une architecture interne très proche de celle du 6502, avec un bus unique entre les différentes unités internes et du "microcode" qui s'exécute à la fréquence de la master clock de la clock processeur mais qui peut nécessiter un nombre de cycles d'horloge variable (de 3 à 6) pour exécuter une instruction, ce qui donne entre 200 et 500 50 et 73 instructions par ligne retracée à l'écran.

On comprend mieux du coup les ruses de sioux du style "on ne va pas tester toutes les collisions à chaque images" qui régnaient en maître à l'époque..

Friday, September 06, 2019

Feedback in Iconoclasts

I've been playing a few shooting-based games lately. Iconoclasts, obviously, where you shoot, run, fight bosses, talk to NPCs and solve some puzzles. Flinthook, too, where you shoot, zoom through levels, shoot again, explore, die, repeat in another ship. And Owlboy, too. I'm ashamed I haven't posted anything about that one for so long, as I've been waiting for it since around 2015!

Bon, je ne suis pas grand consommateur de jeux-à-flingues en général, mais cet été, je viens de m'en faire quelques uns. Iconoclasts, bien sûr, qui mélange les traditions des run-and-gun avec ceux des castlevania pour donner une sorte de successeur de Cave Story avec une dimension RPG plus prononcée. Il y a eu ensuite FlintHook, mon premier roguelike qui m'aura bien tenu en haleine avec sa bande son sur-vitaminée. Puis Owlboy, plus zen sur le long terme et moins succeptible de m'envoyer à la pharmacie chercher de l'anti-inflamatoire que les deux autres grâce à son auto-fire. Owlboy aux graphismes superbes dont j'aurais dû parler depuis 2015, mais au gameplay améliorable.

And with the mix of all these, I start to better appreciate the way feedback information is conveyed in those games. I'll use Iconoclasts as an example of how it can be made right. Granted, they somewhat overdid it, but they allowed player to immediately know whether they picked the right action and to reduce the feeling of the game being unfair to them.


There are 3 main weapons in Iconoclasts plus a few alternate ways of attacking monsters. And frequently some monsters are vulnerable to some weapons and shielded against others. The feedback here is pretty simple: a small red skull moving away from the monster denotes a successful hit while a blueish cross indicates that the monster blocked our attack.

Ce mélange me permet de mieux apprécier les choix de certains jeux: parfois j'aimerais que l'un se comporte plus comme l'autre pour tel ou tel aspect. Et en particulier les choix de feeback visuel dans Iconoclasts qui me semblaient discutables montrent toute leur force de design tandis que je me casse les dents sur les ennemis de Owlboy.
Vous voyez, les explosions des armes de Iconoclasts sont assez impressionnantes. Peut-être à l'excès. Et elles pètent tout pareil que votre tir fasse mouche où qu'il ait été dévié par les défenses de votre cible. Heureusement, Konjak nous a prévu un petit symbole discret mais efficace qui évite qu'on ait l'impression que le jeu était vraiment trop injuste. Une petite croix bleue en cas d'échec, une petite tête de mort si on a "blessé" notre adversaire. On peut donc rapidement changer d'arme si on se rend compte que celle qu'on utilise n'est pas appropriée.

Cette convention est appliquée à l'ensemble du jeu, du plus petit blob aux boss les plus gros. D'une certaine façon, c'est une version plus rapide à traîter (parce que sans lecture) des chiffres et des statuts du genre "manqué" ou "blocage". Ça s'intègre mieux dans l'univers du jeu, aussi.

This convention is applied game-wide, from the smallest critter to final bosses, and they work even though most our shots create pretty huge explosions. To some extent, this work a bit the same way than the "blocked", "hit", "severe hit", "missed" etc. statuses and damage numbers  that got shown in action-RPG games, but more integrated into the game's universe by not requiring reading.

The last sort of such feedback is how some attacked are telegraphed to the player, namely those that must require a parry with the wrench. They are identified with a big green circle and small icons depicting rotating wrenches just before the shot. Again, it is applied game-wide, letting the player quickly react rather than requiring fail-and-retry learning with every new monster we encounter.

I'm not completely fan of that one, though. Although I agree with the idea, it is too obvious, and poorly integrated with the game's universe.


Par contre, il y a un type de signal qui ne me convainc pas. Ce style de cercle vert accompagné de petites icônes représentant une clé à molette qui tourne indique que l'ennemi correspondant est en train de préparer une attaque qui pourra être parée en faisant tourner notre clé à molette (normalement utilisée essentiellement pour activer des portes, etc.) ça m'a sauvé la vie dans plusieurs combats et c'est impossible à louper, mais on a un peu l'impression d'être dans un logiciel ludo-éducatif tellement c'est "Captain Obvious". C'est mieux que pas de feedback, mais tout juste.

Monday, September 02, 2019

Super Bilou ?

Because yeah, I can't help: the SuperNES draws me like a magnet. No matter how many times I refrain myself from looking deeper into it, I keep wondering how school rush would feel on the 16-bit queen.

But there is no easy answer. The SNES means only 128 colours for all 3 tiled layers. It means that either the ink or the owl must be patched to work with only 4 colours per tile. And it most likely mean that the twin playground layers of School Rush levels must be merged into a single one, with sprites automatically used where Bilou must enter objects like big binders.


Parce que oui, il n'y a rien à faire: la Super Nintendo exerce un magnétisme sur moi, et quelque soit le nombre de fois que j'aie décidé de ne pas m'attarder dessus, je ne peux pas m'empêcher de recommencer à me demander comment Bilou tournerait dessus. Après tout, le jeu a été conçu à une époque où les 16-bits régnaient en maîtres, et faire tourner le jeu sur une vraie machine 16-bit, ce serait la consécration. Et la Super Nintendo est à mon avis la seule machine grand-public qui serait capable de faire tourner un portage correct du jeu. La Mega-Drive et l'Amiga manquent tous les deux de couleurs ... puis je me vois assez mal demander à mon frangin de travailler sur une bande-son Mega Drive, même si l'assembleur 68000 est définitivement plus sexy que le 6502+ de la SNES.

Mais tourner sur SNES, ça veut dire tenir sur 128 couleurs pour l'ensemble des décors, retravailler l'encre ou le hibou du décor parallaxe pour qu'il ne prenne que 4 couleurs par tile, et autres contraintes de ce genre. Et ça veut dire aussi que je dois fusionner les deux couches de tiles en une seule, parce qu'il n'y aura pas assez de plans sans ça. J'ai bien tenté de faire l'encre avec des sprites ou une tranche de hibou en sprites pendant qu'on bascule un des décors du hibou vers l'encre, mais les ressources de la console en terme de sprites sont trop limitées pour ça. Ce n'est pas pour rien si les vagues des niveaux d'eau dans Sonic montrent un clignotement pair/impair ... mais je ne peux pas faire ça si je veux que l'encre ait l'air opaque.

But even with all those limitations, I feel like it would be the only mass-marketed 16-bit  that could host ports of the game. Both Mega-Drive and Amiga lack colours , and I don't feel like asking my bro to give Sega FM chip a try, even though 68000 assembly has more hex appeal than SNES 6502+ instruction set.

I tried other approaches, like using a row of sprites for the owl statue if the ink approaches enough, since there isn't enough sprite resources to implement ink waves as sprites as on the DS (more on that in a later post). But I had to come to the conclusion that merging the two layers into one is the only practical thing to do. So the next question is: how much overlap between layers is there in the levels of School Rush?

Voyons donc cette histoire de fusion. Ayant un niveau modeste en pixel art et un moteur de jeu basé sur un contenu quasi-statique de la mémoire vidéo, j'avais essayé au maximum d'éviter dans School Rush d'introduire des tiles qui seraient une combinaison de deux objets (un classeur à l'avant-plan et un morceau de bois à l'arrière plan). Au lieu de ça, j'utilisais deux plans verouillés ensembles tout en mettant les graphismes sur l'un ou l'autre plan selon les besoin. Avec le GPU sous stéroïdes de la DS (si, si), il me restait encore de quoi faire tout le reste. Ramener les deux plans sur un seul est possible parce que la SNES permet pour chaque tile dans la map de fixer sa priorité par rapport aux sprites. Reste à trouver des solutions pour afficher les superpositions. Du coup y en a-t-il beaucoup dans School Rush, et où sont-elles ?

I have fairly simple tilesets in School Rush, and used overlap to make object-bridging tiles. Merging means that these tiles now need new slots in the tileset. How many of these are there ? Can they fit the remaining space in the tileset or do I need to use virtual tilesets as I plan to implement in later versions of libgeds.

In most of the game, there is only a few tiles of overlap, in corners, often with green books or binders. These could either be done with overlay sprites or merged tiles. No problemo.


Les plus fréquentes proviennent des livres et des classeurs verts. Je dis 'fréquents', mais il n'y en a pas tant que ça par écran. Ce ne serait probablement pas pratique de construire une palette qui permette de combiner 'verts et mauves', une autre avec 'verts et bruns', etc. donc je m'orienterais probablement vers une implémentation avec des petits sprites 8x8 par-dessus le graphisme de la "couche" la plus distante de la version DS. Pas de soucis en vue ici.

Il y a ensuite une série de structures où la superposition n'est pas fondamentale pour le gameplay, voire parfois carrément accidentelle. C'est le cas avec la zone encadrée en bleu clair sur l'image ci-contre. Là une simple modification de la map suffira.

Viennent aussi les graphismes qui sont réalisés avec une combinaison de deux tiles plus simples pour des raisons de facilité, comme ce tube qui rentre dans le classeur, mais qui en réalité ne se coude pas et passe simplement par-derrière. Là, on pourra probablement se contenter d'un nouveau jeu de tiles parce que les version "simplifiées" ne sont pas utilisées telles qu'elles dans le niveau.

There are other locations where overlap allows to create sophisticated tiles with simpler ones -- like with the purple areas on the screenshot next. But in the level where I find these, the 'simpler' tiles aren't used anywhere else, so I could just have these in the SuperNES vram and that's it. Then there are locations where the level could be simplified to avoid overlap (like with the cyan area) without altering the layout of the play area.

Then there is the annoying areas. Those where we don't see parallax background layer with some wooden walls. They lead to a significant amount of additional tiles, especially given the complexity of that background (16 unique tiles). There isn't much else in these areas, hopefully. And not so many structure. Stacking sprites should work, but that makes more palettes needed. Alternatively, I would have to simplify the background texture locally and have a copy of those tiles with a simple, but opaque background.

Là où les choses se corsent réellement, c'est pour les "cachettes", ces passages du niveau où on est à l'intérieur d'un banc. Ici, n'importe quel objet qui n'est pas simplement rectangulaire introduit des nouveaux tiles. Et pour corser encore les choses, la texture de "fond de bois" prend facilement 16 tiles. On va avoir des combinaisons dans tous les sens si on n'y prend par garde. On risque de manquer de palettes si on essaie d'utiliser des sprites pour tout ça. Par contre, je pourrais essayer de faire une variante de ces tiles sur un fond opaque mais plus simple, et ajouter une variante des tiles de la texture "bois" qui permet la transition vers les objets. A condition que j'aie assez de place dans mon tileset pour caser tout ça.

Likely, the last, vertical level will be impossible to port to the SuperNES, and it is the reason why I started consuming the last 256 tiles of the 1024-tiles set.

So final move. Let's pick the latest tileset. Let's clear out all the tiles that feature only opaque pixels. Then let's clear those that are mirrors of each others (maybe not that wise, but there weren't so many of them). The result is about half the free room that not implementing the vertical level leaves. I can have two alternate (opaque) backgrounds of these. Or at least, I could if the SNES had 96 or 128KiB of video memory. But it only has 64.



Ce ne sera probablement pas le cas avec la version finale de School Rush et son niveau vertical qui introduisait justement plein de nouveaux tiles-de-raccord, mais si je m'en tiens aux 4 niveaux horizontaux d'origine, il me reste un bon quart (256 tiles) de mémoire disponible. Belote.

Maintenant, voyons un peu quelle quantité de mémoire représentent tous ces tiles qui possèdent des pixels transparents. On est dimanche soir, j'ai la flemme de scripter quelque-chose de pratique. J'y vais à la main comme un bourrin. Verdict: on pourrait faire tenir encore 2 à 3 copies de ces tiles-là dans un tileset de 1024 éléments. Rebelote.





Mais la Super Nintendo n'a que 64KiB de mémoire, à partager entre les graphismes des décors, des sprites et les "maps" (comptez 4KiB pour un écran qui scrolle horizontalement, 2KiB pour un arrière plan qui reboucle), et un tileset complet en 16 couleurs pèse 32KiB. Mon décor de hibou (534 tiles et 10 couleurs) est légèrement au-dessus des 16 KiB. Les techniques de "virtual tilesets" seront donc incontournables.

Tuesday, August 27, 2019

The last Inoxcrom

Ami du futur, archéologue, passant d'un soir, écoute et apprends. En 2000, nous étions capables de faire des stylo-billes parfaits: les Sierra Inoxcrom Fine. Ces bics avaient une finesse d'écriture incomparable, leur bille toujours prête à fonctionner impeccablement dès le premier traît - et même après avoir passé plusieures années ignorés dans un pot à crayons. Ils ne demandaient pas de forcer sur le papier et fonctionnaient aussi bien sur papier très absorbant que sur papier quasi-glacé. Cerise sur le gâteau, leur bleu n'était ni trop pâle ni trop contrasté.

J'ai écrit mon TFE, débuggué mon kernel pendant 5 ans, corrigé les épreuves de ma thèse et tous mes articles avec ces bics. Puis un jour, plus moyen d'en trouver nulle part. Et quand j'ai fini par essayer d'en télécharger sur Internet, la déception fut encore plus cruelle: la société a fait faillite en 2009. Ils ne reste que quelques lots dans des pays éloignés sans même la possibilité de les commander depuis l'Europe occidentale.

Pendant des années, je lui ai cherché un remplaçant. Je commence à apprécier les 'pilot frixion 0.5', mais ils n'ont pas la même vitesse de séchage et de tout-terrain qui me permettait de faire instantanément des diagrammes UML. Et je n'essaierais sûrement pas de les utiliser pour écrire entre les lignes d'un article prêt-à-imprimer.

Au delà du côté nostalgique et de mon incapacité à entrer dans une ère du tout-numérique, je trouve regrettable que ce savoir ait été perdu, qu'il n'y ait plus dans nos papetteries que du matériel de seconde zone et que les distributeurs ne s'en préoccupent même pas, puisque pour la plupart ils ne sont plus papetiers, mais vendeu·rs·ses-réassortisseu·rs·ses, ou gestionnaires de stock H/F.

Voilà donc. Je comprends qu'il soit ridicule de faire tout un papier d'un sujet si banal, mais il reste un espoir. Après 10 ans (dont les 3 derniers sans aucun inoxcrom), j'en ai finalement retrouvé un bleu chez mes parents. Il fonctionne impeccablement. Je l'ai juste relogé dans un corps vert parce que j'avais la fâcheuse tendance à les mordiller pendant que je cherchais mes bugs et que l'arrière de son corps d'origine n'a pas tenu le coup.

Monday, August 26, 2019

MonsterPropertiesWindow

At last, I've got a first working sketch of the 'monster properties window'. It turned out quite tricky to get it working. It can report whether gobs have links and initialization expressions in addition to tehir class. There still is plenty of work, like being able to actually update state when you use the widgets, and write an expression by using the customized 'TypeWord' widget featuring the full gobscript characters set.

Trickiness came from window-to-window communication, so that the right widgets got displayed at the right time (having to hide the whole "tileset" widgets)

Wednesday, August 21, 2019

a + b = idea


+
+
= idea.

Let's just use flowing sand in desert zone as a way to test the new tile engine ideas ...

Background: there is a strong motivation that keeps me working on the GEDS project nowadays, and revising all the things I'm revising rather than just calling it done: I'd like to be able to make things like riverflows that push player around. when I say "motivating me strongly", I mean I considered replacing the banner of this blog to show Bilou pushed by such a river on a slope. As I mentioned back in 2009, I like that this picture I see every time I visit my own blog to act as a reminder of the goal I set, by showing me something I'd like to see working when I play the game.

I was a bit annoyed that the level where I'd need such rivers and the tileset / game I'm working out these days were disjoint, but seeing the 'sand rivers' tiles of Sandopolis made me realise that they could be the perfect match for trying things here already.


Il y a encore des choses dans l'étude des moteurs de jeux de plate-formes qui m'intéressent suffisamment pour me garder accroché au dévelopement de 'libgeds'. Des mouvements style "corde ninja". Des rebonds sur les murs. Toutes des choses que j'espère bien voir figurer dans 'infinite pyramid', mon prochain projet.

Il y avait par contre un truc qui ne collait pas avec le thème de la pyramide: les zones qui forcent Bilou à avancer dans une direction précise. C'est le cas avec la rivière que j'aimerais introduire dans la version revisitée du niveau 1-1 de Bilou, à la placedu tapis roulant que mon frère avait dessiné en guise de passage à sens unique. Parce que cette rivière justifie la révision du système de "propriétés des blocs", en cogitation depuis le début de l'année.

Mais c'est bon. Je me suis retrouvé avec les méga-tiles de Sonic juste à côté de Bouli expliquant le nouveau système et ça a fait "a + b = i * d" : je n'ai qu'à mettre des rivières de sables (comme tout le monde?).

Pas oublier non plus les escaliers-qui-deviennent-des-tobogans du chateau gadget. Mais à condition que ce soit fun!

Sunday, August 18, 2019

Starting a new world/level

Starting to work on a new level should be a trivial task in a game making tool. Unfortunately, this is far from being the case in Game Editors for DS, and especially in LEDS. I got this sorted out with text editing on the PC in almost every previous iteration, but now I'd like to have the tools level-up and be able to assist the game designer through this task

Bon, j'ai voulu me faire un p'tit niveau de test avec mes nouveaux graphismes pour la zone de la pyramide. Le genre de chose qui devrait être triviale dans un éditeur de jeu qui veut afficher l'étiquette "game maker". Malheureusement, on en est encore loin avec mes Games Editors for DS en général -- et dans l'éditeur de niveaux LEDS en particulier.

C'est le genre de choses que j'ai corrigées avec un peu d'édition texte sur PC dans tous les projets précédents, mais là, j'aimerais bien que mes p'tits outils passent à la vitesse supérieure et puisse permettre de prototyper plus librement, les orteils en éventail dans un transat, sans wifi et sans lecteur de carte SD sous la main.

Je n'ai pas encore de "Behaviour Editor" succeptible de créer de nouvelles machines d'état depuis le transat+DS, donc pas de "add .cmd file" à l'ordre du jour ...


  • [done] the level editor seems unable to change the tileset of the level. At best, it is replaced by ".spr", which fails to load in the game engine, obviously.
  • [todo] there is no way to indicate that the spriteset used for monsters should be changed
  • [done] there is no way to indicate that some state machine description files should be dropped, or that new ones should be used. That should be the job of ImportsWindow, a secondary window to WelcomeWindow.
  • [done]: make it know that WelcomeWindow has loaded something.
  • [done]: think about widgets and cursor to manipulate the list of imports.
  • [todo] make it easier to produce a set of *EDS tool that call each other (e.g. "cube" for those produced by the NUC)
The goal for the last item would be to use the upper screen in "welcome" mode to list all the baddies, now with the file names and the number of states used for them. At least, the blocking bug is now fixed, although I could have pushed the refactoring deeper 

Wednesday, August 14, 2019

__cxa_begin_catch

Voilà un symbole à surveiller de près. Quand mon code C++ me fera des misères et que le débugger semble me téléporter d'un bout à l'autre du code sans passer par les blocs catch(), il pourrait bien être salvateur d'aller mettre un breakpoint sur la fonction du run-time responsable de démarrer le traitement d'une exception interceptée.

Dans la même série, _dl_runtime_resolve est une vraie plaie en cours de debugging (et
LD_BIND_NOW, sa némésis, est donc notre alliée), mais j'aimerais bien en savoir plus sur son fonctionnement.

Monday, August 12, 2019

Les couleurs du désert


Un peu des couleurs que j'ai jusqu'ici, un peu de couleurs venant de Ilkke ou de Commander Keen ... quelques mélanges ... et je commence à avoir des combinaisons qui me semble intéressantes (sur la droite). Qu'est-ce que vous en dites ?

In the center, the mock-up I had previously for Bilou's desert zone. On the left, I tried using Lost Vikings, Commander Keen or one of my reference from Ilkke. On the right (and esp. in the corners), mixing of reference-based colors and current colors that imho provide interesting shades and hues. What do you think ? (I put the focus on ground tiles and background, btw. 'green' block and power-up were either untouched or got crushed in the blending process).

[x] comparer avec les couleurs d'Aladdin SNES/Genesis -- bof. Par contre le palais de Jafar a des éléments de décor intéressants.
[ ] comparer avec les couleurs de Sandopolis (Sonic) -- en fait non. Elles sont trop criardes à mon goût.
[x] essayer la palette de verts du chateau d'Hyrule qui avait inspiré les téléporteurs de Bilou's Quest ... sauf qu'ils n'étaient pas verts. (voir ci-dessous)

PS: je me suis concentré sur les couleurs des briques. J'aimerais que le bloc vert reste dans les tons verts, mais genre "masque de jade", que je n'ai pas encore réussi à reproduire. J'ai pris le temps de re-copier-coller Bilou avec les bonnes couleurs (presque?) sur chaque écran mais j'avoue que le bonus n'a pas eu droit à autant de considération

Je fais une deuxième passe. Les verts de Bilou's quest (top-right) retravaillées (bottom-right) me plaisent bien. J'ai essayé d'importer les couleurs d'Agrabah (mid-left et bottom-center) par contre, mais ça ne donne pas aussi bien.

edit: J.L.N a bien voulu laisser la NDS à son papa une demie-heure avant de rejouer un peu au niveau-où-l'encre-descend de School Rush. J'ai pu me faire une petite map, et j'ai aussi un second jet plus convaincant des "boules de poussières" inspirées des techniques de pixel-art de Fury of the Furries ...

Jeu vidéo, violence et Pirlouit

Bon, les jeux vidéos font partie intégrante de ce à quoi mes enfants sont exposés. Que ce soient des jeux auxquels je joue, des jeux plus "RPG" que je raconte comme s'il s'agissaient d'histoires au lieu de mettre un dessin animé ou les speed runs de l'ultime décathlon que je regarde en faisant la vaisselle, ils sont partouts. Et mes enfants savent bien qu'il y a des jeux vidéos qui ne sont pas pour eux (les fps -- "jeux de mitraillettes", que je ne sais pas complètement faire partir de youtube, et aussi certains 'run-and-gun' tels que Iconoclasts ou Metal Slug auxquels je jouerai/regarderai quand ils seront au lit).

Dans l'ensemble tout semblait bien se passer jusqu'au jour où l'institutrice maternelle de J.L.N m'annonce qu'elle l'a rattrapé de justesse alors qu'il s'apprétait à sauter sur la tête d'un camarade de classe qui était étendu par terre. Je tombe de haut. Le coup de "on ne frappe pas un adversaire à terre" me vient immédiatement à l'esprit ...

si si, c't'un boss ... 'faut lui sauter sur la tête
mais là, je repense au Super Mario Odyssey auquel nous avions joué tous les deux pendant le week-end. Et dans SMO, les combats contre les boss sont presque toujours identiques: on débarasse le boss de ses protections, on utilise des attaques-casquette pour l'assommer, puis lui écrabouille la tête pour passer à la phase suivante. La similitude est trop grande pour que je n'en tienne pas compte.

Alors bien sûr, les coups sur la tête, ce n'est pas nouveau dans un Mario. Mais jusque-là, qu'il s'agisse de Koopas, de Goombas ou autres, on devait juste "leur sauter dessus". Ils étaient bien debout et dans la VTJ, on ne sait évidemment pas sauter haut assez pour retomber sur la tête d'un adversaire. La violence fantaisiste restait bien cantonnée dans le monde imaginaire sans plus d'effets que si on avait lu "Jack et le Haricot Magique" dans sa version originale.

Difficile évidemment d'être sûr que c'est bien ce qui s'est passé dans sa tête. J'ai expliqué à mon fiston qu'on ferait une pause dans le jeu, le temps qu'il se mette bien en tête que c'est dangereux, que ça fait très mal et que ça peut même envoyer les copains à l'hopital, etc. Et pendant que j'essayais de faire comprendre tout ça, je me suis revu à son âge, au moment où j'étais complètement accroc au "Pays Maudit" de Peyo, où je m'identifiais tellement à Pirlouit que je pouvais être assez fatiguant à force de faire des farces ... et où mes parents ont un jour dû me tenir un discours un peu du même genre parce que je commençais à flanquer des coups de poings sur la tête, comme quand Pirlouit veut faire taire Monulf. Pour moi, ça ne devait pas être grave: dans la BD, les personnages auxquels on faisait ça étaient "juste assommés", même pas blessés. Je n'avais aucune notion de ce que "traumatisme crânien" pouvait signifier, évidemment.

Saturday, July 27, 2019

Refactoring "QuickGo" widget

I'm trying to make that "mini-map" widget better following good practice software engineering, so that I could maintain the rest of the tool more easily. I've done that refactoring one small touch at a time, in usually one-hour session while it was damn hot outside and while kids were sleeping in the living room.

It looks like I've introduced a few bugs with the refactoring, though. It's been a while since I didn't get something that messy !

edit: oh, btw, that got fixed through early August.

And yeah, I know, it's a bit odd to keep blogging such things. Likely something that is both a public version control and a social website would do the job, and 'github' would immediately come to mind. Unfortunately, A) I hardly trust Microsoft to keep running github nicely and B) github doesn't work with my boox device >_<

Thursday, July 18, 2019

documenting

My colleagues brought me from the habit of explaining lots of things through comments into the habit of writing almost no comments in my code. Explaining a lot came from my 386 assembly years, where I'd have to write code that does the desired processing on the one side, and carefully detailed what I was trying to achieve in the comments section.

The new fashion is to go from
sprtrsp(spr1, spr2); // make the sprite more transparent
into
makeSpriteTransparent(newSprite, oldSprite);

As I'm applying this over the QuickGo class to better see whether I can structure that code better, I still stumble upon code chunks that remain pretty obscure. Why the hell am I doing those computation on the map size ? and why the test with those * 4 multiplications ?

Hopefully, seeing the widget in action with up to 4 slices of the 'School Rush' level made me understand myself again.


When I want to fit a large stripe of level or a tileset into something that's closer to a square, I tend to cut it in two and put the halves above one another. If that isn't enough yet, I repeat the process. In each step, I exactly halve the largest dimension but double the other. It only makes sense to do so if I'm going closer to a square by doing so, that is if width/2 >= height * 2 when the image was currently wider than high. That exactly converts to width >= height * 4.

When that condition is false, I could still keep processing it further, but by doing so, I'd make the picture less readable. It doesn't make sense to consider it once we have reached the perfect square of course (the sprite rendering the mini-map is always square), but if we end up with a 3x2 rectangle and consider going into 2x3 instead, then sticking to 3x2 remains more readable.