Sunday, June 02, 2019

Iconoclasts


I could hardly point you to the old "wish-to-play-that-game" blog post about Konjak's "Iconoclast" game, because I've been post-poning writing that post since 2011, hence the "#veryOldDraft" tag. 

From the very first notice on the tigsource blog, I've been in love with the pixel art used. I loved the gameplay as well, which I managed to get running through Wine on my old laptop ... but It wasn't comfortable to go much further than the first true boss.

But yesterday, I just noticed it was available on the Nintendo Switch, so this is my second indie download, and it's a marvel to experience the game at full frame rate with responsive and friendly controls. Plus, the switch has a "snapshot" button, and a separate galery mode, meaning that I'll be able to do pixel studies when I'm not playing it.


Bon, il y a 8 ans que j'aurais dû commencer cet article, parce qu'il y a 8 ans que Iconoclast de Konjak m'avait tapé dans l'oeil. Il y a même 8 ans presque que j'y ai joué pour la première fois, dans le salon de mes beaux-parents sur un portable Linux tournant laborieusement Wine. J'avais apprécié, mais l'expérience n'avais rien de comparable à avoir la chose au milieu de son D-PAD et calibré pour tourner à pleine puissance sur la Nintendo Switch. Je ne regrette pas l'attente et je ne regrette pas la dépense (vu que la version PC avait été gratuite :P)

La bande son est de toute bonne qualité aussi (sans pousser jusqu'au niveau d'un Shantae ou d'un Fez quand même), et je suis assez surpris de constater qu'elle est signée également Konjak! "Pixel" avait fait de même dans "Cave Story", mais ça reste suffisament rare pour le mentionner.

Bon, je vais quand-même faire une petite intro du jeu pour ceux qui le découvriraient ici: Robine est une jeu passionnée de mécanique. Elle n'hésite pas à donner un coup de clé à gauche ou à droite pour dépanner les gens de sa colonie. Elle se débrouille aussi assez bien avec un flingue, et ça va lui venir bien à point, parce que dans son monde, le carburant est considéré comme une manne divine et seuls les prêtres assermentés peuvent intervenir sur les équippements alimentés en carburant sans être pourchassés par les agents du Projet et "jugés" pour hérésie.

Je pourrais être tenté de dire qu'on est face à un métroïdvania, vu qu'on se déplace librement dans des niveaux un poil labyrinthique, qu'on débloque des mises à jour de ses armes pour continuer à progresser dans le jeu et qu'on dégomme tout ce qui bouge sauf si ça nous adresse la parole avant de nous charger. Mais ce serait une insulte de ne pas préciser la présence d'une forte composante RPG, étant donné la quantité de PNJ qui nous distillent leur connaissance du monde, de ses intrigues et des relations curieuses entre les différentes factions. De nouveau, c'est de Cave Story qu'on se rapproche le plus ici.

Encore que Konjak a veillé à choisir des mécaniques de combat qui permettent aussi des phases de puzzle entre les séquence de combat pur -- chose qui colle tout à fait au caractère du personnage, ce qui ne gâche rien.

Saturday, June 01, 2019

touchInit()

J'espère que ce sera la dernière surprise dans la branche "mise à jour de mon kit de développement DS"... Après avoir enfin réussi à avoir des programmes qui tournent à nouveau sur la DS (et dans l'émulateur, au passage), je finis par me rendre compte que plus aucun de mes widgets ne fonctionne. Au point que j'en viens à soupçonnner quelque-chose dans le code qui relaie les mesures depuis le composant SPI en charge de l'écran tactile à travers le processeur ARM7 pour être exploité sur le processeur ARM9. D'autant que tous mes programmes utilisent un code ARM7 "custom", chose qui ne sera forcément pas testée lors des mises à jour de libnds, devkitARM et leurs sbires.

Mais mon code ARM7 voit toujours bien son gestionnaire d'interruption appelé, recompiler un des programmes d'exemple avec mon code ARM7 au lieu de la version officielle marche toujours ... Ou en tout cas, c'est l'impression que ça donne au premier regard. En débugguant de plus près, je constate que mon code sur l'ARM9 reçoit bien des 'touchPosition' en bout de chaine, mais chose curieuse, deux paramètres (px et py) sont toujours nuls. Il s'agit des valeurs traduites en pixels, à l'aide des paramètres de calibrage. Et le programme d'exemple fait pareil: il ne nous donne que les valeurs "brutes".

En réalité, il faut maintenant appeler une fonction "touchInit" pour appliquer les données de calibrage, et la version du devkitpro que j'avais installée avait fait la mise à jour correspondante dans le "code ARM7 par défaut", mais pas encore dans les programmes d'exemple utilisant du code ARM7 custom ... On va finir par y arriver.

Monday, May 27, 2019

.arm7.elf

écran tout blanc sur une DS, cascade de message d'erreur "MMU7 write32 to undefined register 044xxxxh = 00000000h (PC:00000000)" produits par desmume, avec des valeurs xxxx commençant je ne sais pas trop où et qui continuent de 2BD4 à 3A34 au moins, et ça même si j'essaie d'attacher un débugueur sur le processeur ARM7.

Il y a clairement quelque-chose qui va de travers avec les programmes recompilés sur mon NUC et sur le nouveau portable avec la dernière version téléchargée de devkitPro. Pourtant je parviens sans difficultés à recompiler les exemples. En essayant de retrouver la commande qui fait appel à ndstool -- cet outil permettant d'emballer deux programmes jusque-là tout à fait classiques (format ELF) en une image de ROM nds. Et en relisant la ligne de makefile produisant "lib/ppp7.arm7" à coup de copie de section de fichier (outil GNU 'objcopy) je suis pris d'un doute: et si la technique passant par objcopy était devenue obsolète pour l'ARM7 aussi. Après tout, j'ai réussi à compiler les sources avec le nouveau devkit, mais est-ce que j'ai essayé de les faire tourner après ? pas sûr.

Et effectivement, en utilisant ppp7.arm7.elf directement, ça marche beaucoup mieux. 'faudra que j'aille corriger tout ça.

Wednesday, May 01, 2019

HoB: les combats

Les combats dans HoB ne sont pas simples. Pourtant, même après avoir découvert qu'il était possible d'en ajuster la difficulté, je n'en fais rien: chaque fois que je parviens enfin à venir à bout d'un monstre, je sens que c'est parce que j'ai mieux joué que les fois précédentes.

J'apprécie assez l'équilibre entre le système de sauvegarde (respawn rapide, sans temps de chargement) et les effets permanents/temporaires du jeu. Ainsi, quand vous éliminez un monstre, il est éliminé à jamais, mais les points de vie retirés à un monstre plus costaud lui sont rendus si vous mourez. Il m'a fallu du temps pour m'en rendre compte, mais ça devient évident dès qu'on commence à affronter des ennemis en armure.

Inutile contre certains ennemis de rester planqué derrière son bouclier en attendant l'ouverture: leurs attaques sont tellement puissantes qu'il n'a presqu'aucun effet.

La solution n'est pas non plus dans une plus stricte observation d'une boucle "narguer - esquiver - bondir - frapper (un coup) - esquiver" : ce genre de tactique rend le combat trop long et finit par me conduire à la faute ... et comme en début de partie on peut tomber sur des monstres qui vous tuent en un coup, mieux vaut éviter.

La clé, je pense, réside dans la mobilité: parvenir à éliminer d'abord les monstres de moindre importance sans attirer l'agressivité du "boss", utiliser à bon escient la roulade (ou la téléportation quand on l'a débloquée) pour pouvoir battre en retraite un peu plus tard. Pour ça, il est indispensable d'apprendre les distances de sécurité et d'action, et de garder la tête froide, histoire de ne pas se retrouver juste devant un caïd quand on espérait passer derrière. Plus tard, dans le jeu, on pourra aussi se servir du terrain pour empècher ces caïds d'utiliser leurs attaques, ou les faire se frapper les uns les autres pendant qu'on esquive.

Fort heureusement, la caméra nous laisse largement de quoi voir les antagonistes, et évite de nous balancer dans un plan serré et confus comme dans un Wind Waker.

Mais bon, je vous raconte tout ça depuis ma première partie où j'ai tardé à trouver des mises à jour pour mon épée, passé une bonne moitié du jeu avant de me rendre compte que je pouvais défoncer certaines armures et tardé à utiliser le bouton "courir" pendant les combats. Il est fort probable qu'une fois les subtilités du jeu maitrisées, il n'y aura plus autant de challenge (mais là, ma deuxième partie est plutôt en mode 'esquive' pour ne pas voir mon fiston commencer à mettre des coups de chaise à tous ses camarades de classe).

On est pas non plus dans un jeu où le système de combat était le coeur de l'attention des développeurs et où il faut presqu'autant de concentration pour jongler avec les mouvements possibles que dans un Street Fighter. Mais aller dire qu'il a été ajouté "parce qu'il fallait bien" ? non, ça serait pousser trop loin. Ne serait-ce que parce qu'une grande partie des items cachés servent à tenir plus longtemps en cas de combat, et pas vraiment à obtenir des "clés" pour avancer dans l'aventure comme ce serait le cas dans Fez.

Friday, April 12, 2019

HoB, btw.

I've been fascinated by HoB's design since the first trailers I've seen. I collected as many wallpapers as possible, I've done style analysis, but unfortunately, I had no hardware compatible with the game ... that is, until I logged in the Nintendo shop last week and discovered a promo on HoB definitive edition!

That was the best possible conditions to play it. I could drop the adventure at any time, and resume exactly at that point. I hadn't to fight against "where is [] again?" because I've trained myself to the ABXY with the Mario & Luigi series. I wasn't fighting against my glasses because I could just keep the console in my hands. I'm even surprised I am not feeling any eye strain despite I added about 2 or 3 hours of play every evening in addition to my work hours, but it lasted only for one week...

I think I haven't played a game that intensely since Fez! About every moment in the day, I could feel slight excitation about getting back to the game when I'll be done with the day's tasks, exactly the same way you feel excited about continuing to read a Harry Potter book for the first time. The core difference with Fez is that I had no need for a journey log nor to scribble everything I encountered.

As surprising as it is, I could keep all I had to know about HoB's world in my head -- partly thanks to the icons feature on the map that will automatically pinpoint collectibles the minute you have them onscreen, so that you can track and collect them later on. I should mention that I played the game in "normal" mode, not in "definitive mode" (which would have provided more signposting and hints about quests, if I'm correct). I used the map a lot, and I found it interesting that only the overworld has a map, and that I got a different feeling when entering a cave where I would have to rely solely on my brain to know whether I've visited a room already and never know how far away I was from the exit.

I'll keep the game design analysis for other posts. I must confess that I did encountered some glitches while playing: mostly walls disappearing when the camera angle got too extreme, but also getting stuck into trees where I wasn't supposed to be ... The game even crashed once, which I really wasn't expecting on a console system. But let's be honest: compared to the huge amount of bugs PS and PC users reported at game launch, that Switch version is clearly much cleaner. I was also stunned to see the game lagging that much on earlier releases. The switch port seemed to run at full frame rate most of the time. I don't recall I had to blame lagging for any missed jump or failed fight.