Monday, March 29, 2021

3 rooms milestone.

My next first milestone for Bilou Dreamland will be to create a .nds where you can use doors to visit the 3 available environments. Ideally, each of the "room" (need not to be single-screen, but should stay simple) would feature the key gameplay mechanics I want to work on / repair before I go for more complete level designs. Sandboxes, in a sense.

On dirait bien que mes éditeurs sont maintenant prêts pour le travail sur Bilou's Dreamland. Support des nouveaux types de collisions et de pentes, support du choix de palette sur les deux plans. Et les spritesheets/tilesheets ont été nettoyées et prêtes à l'emploi aussi.

Il me faut donc un prochain objectif, et ce sera les trois portes salles. Une pour chaque environnement, pas trop grande, mais assez pour qu'on puisse y placer les différents éléments de gameplay critiques pour le jeu comme les cascades, l'eau qui change de niveau, le sable qui glisse, les portes, les plate-forme crocos, les branches qui plient, etc.

(Eh, CJ, ça fait penser à tes niveaux-téléporteurs du jeu d'origine, ça, non?)

Saturday, March 27, 2021

Dev term?

Somewhen over the winter, my "grizzly" laptop just stopped working. I think I managed to make one last backup of its content, but it just does not power up any more. So from time to time, I manage to borrow my fairy's laptop for the evening and do some nds dev 'ing, but it became increasingly unlikely these days. I've got my new boox, though, so hopefully I can still do some homebrew-ish hobby, including uploading and translating contents on my blog. 

Unfortunately, we're still milestones away of the ability to scribble patches with a stylus. The device l'm really waiting for is ClockworkPi's devterm. I think of it as a typewriter device you can use in an armchair, with just the amount of screen needed to get content and check for typos. I have hope that, combined with the NUC, it will allow me to get more freedom

But there's a catch. I preordered it, and it should arrive by Avril, unfortunately, no one seems to have received any update from Clockwork Pi people since early January. So I keep my fingers crossed and. really, -really- hope that I haven't fell for another 'noteslate'-like vaporware hoax.

Once I'll receive my devterm kit, I'll have to go downtown and find a pair of lithium batteries to power it.

Post-pandemic global chips shortage?

Yup. Global shortage. See you in May ... (hopefully)

edit: happy end: arrived on Sept. 1st. Works when plugged on USB power if you don't have batteries yet.

Thursday, March 25, 2021


 Bon, vu qu'on est re-confinés j'ai toujours une machine Windows à la maison. Elle a reçu un mingw (non sans une grosse dose de Rongtudjus). Et si en plus elle avait PERL, (pacman -Sy, mon ami), serait-elle capable de faire des échanges de fichiers avec une DS ?

Bin ça n'a pas l'air d'être le cas. Même après avoir autorisé PERL sur tous les réseaux dans le firewall ... tout au plus, le Windows parvient-il à envoyer les invitations à transmettre (en UDP sortant). Mais j'ai systématiquement une erreur 0xcafe au moment d'essayer d'établir la connexion.

Eh ? ... pas si vite. C'est quoi cette cochette à gauche du nom 'perl' ? et pourquoi est-elle restée décochée ?

Ah bin oui. Là, tout de suite, ça va beaucoup mieux!

Comme ça je peux récupérer le 'xmasdad' découpé pour faire de l'animation modulaire. C'est la branche tuto qui va être contente...

edit: et pour scripter ça, ce serait avec netsh (dont la partie utile de la doc est ici.

Tuesday, March 23, 2021

Coins everywhere ?

Sooner or later, platformers designers will introduce some collectible Coins/tings/star bits into their game.

Their role of increasing our score move or less belongs to the past how, but a game that has no collectibles feels a bit odd. I know because I just played "Gris" which has none, and having sequences where you slide down and jump at will but have no incentive to do so because there is no "coin" to find was unusual. In fact, it made the game feel -artistic- instead of playful. 

Collectibles may play roles other than making the experience more fun, though.  They can guide the player, if you  make sure that you never put some in places that cannot be reached.  That's quite an obvious one. They can invite the player to try something  more difficult than they' d normally do, and they can let the player know whether they have already visited some locations.


The question Neutronized raised is whether we should allow the game to feature some collectibles that are  impossible to skip.

I see a few occasion where this Could occur, like having a long line of them on a platform and no way to stand between them, "or having them drawing a wall". If you end up designing something like that, I invite you to think  again: what does these extra collectible bring to your player? You removed them the freedom of  whether they pick something or not. It's like forcing a kid to eat some chocolate whether they want it or not. Why would you do that? 

I see two occasions where you might want to do it, though. First is when you move your player through some section where you want them not to move. Collectibles on the unavoidable path can then destress the player, making them know that they are on an intended, "good" path. Second is when you use collectible to hint player about the location of some off-screen platform.

Final thought: if you claim that "there should not be un-avoidable coins in a platformer", then you also state that a game where the player is forced to purchase a key item is not a platformer (including infamous Pac-in-Time and Santa Jr).

My immediate thought of a game that might not follow that line and I still love is Rayman on PSX. But that's one of my favourite game. And you definitely cannot complete the game without picking any 'tings' here because some are actually triggers in disguise to unlock 'doors'.

Looking at the screenshot again make me wonder: was Rayman capable of jumping straight from the current location to the rightmost platform ? if not, placing a nearly-unavoidable ting on the middle platform may serve the purpose of hinting that the one-jump path is a bad path by explicitly marking the other as 'good' path.

Of course, playing 'coin is lava' is only interesting when there are cheap-to-grab coins. If all coins cost you an extra jump and none is on the 'easy' path, then you actually make the game simpler by not getting any coin. But then, yes. If you go for "let's have kid players get cheap coins in this section" rather than "let's tease expert player to grab coins while playing", the expert players might enjoy if you use that negative space with no coins as a way to try something different. 


Sunday, March 21, 2021


NDS / GBA homebrews

Disassembly and Reverse Engineering

16-bit homebrew

8-bit homebrew



context: my new Boox can browse github contents, but I'm not sure I want to give it my github credentials. So here's the list of projects I've starred over the years, but wouldn't print and can't afford to check on-screen.

Wednesday, March 17, 2021

e-book gets colors!

I decided to pick the expensive-but-easy road and to give the Nova 3 Color a try. It's been too long I'm trying to 'repair' web access on my N96 boox.

 Since the device comes with Chinese manuals, I've took some time to review

The personal note data will never be shared to any third party or internal staff 
[we] may collect info about installed applications, SDK version, system update settings

There are a good deal of things I've had to do to get the device in a usable state.

First, the device is initially couldn't use Google services. I had no "Play Store" around, but even the few google applications that were available through Boox's "Application store" (containing mostly alternate ebook viewers and book collections) -- like Google Drive -- wouldn't work because "the device was not certified". 

Fixing that one wasn't too hard. Just below 'Enable Google Play', there was a cryptic 'GSF ID' box and tapping it (as suggested) took me through the process of telling google I trust the device and so should they (if I understood things correctly). I guess I couldn't expect more from a Chinese device right now.

Second, many of the 3rd-party applications I installed once this was fixed rendered weirdly. They seemed to believe that, as soon as text is large enough, it should be shown with outlined white characters.

I couldn't find any settings menu to change the system font or whatever and I started to get worried. Hopefully, this is tweakable, but not just with a system-wide configuration as I expected (or were told). 

Instead, we can tweak this application-by-application by means of the '°¨_o_' button of the ring-menu. The thing I had to disable was 'whiten the background', something that is certainly a good feature in many places but for some reason leads to weird-looking text.

I can also lie to applications about the device's resolution (actually 1872×1404 at 300dpi, which is über-amaZing) so that it doesn't throw huge fonts at me. That made Wordpress and Twitter back to normal rendering (with the stunning handscript recognition added ^_^)

As far as the device is concerned, my last regret is the lack of a micro SD card support and of an audio jack. So far the over-provisioned 32GB of internal flash sounds enough, but I don't like having to rely solely on some soldered, fated-to-fail storage on my device.

Now, I'll have to understand why the device cannot render my code-in-epub properly, and why it seems to be unable to browse completely my (huge, I must confess) epub files.

Until then, I think I'll populate '#booxread' on twitter ...

Tuesday, March 16, 2021

Oops! I did it again!

Novembre 2020. J'ai voulu pouvoir ouvrir n'importe quel .spr dans mon Sprite Editor et j'ai rajouté un discret petit "dir" qui ouvre OtherFileWindow. Oui, parce que jusque là, c'était toujours A pour spriteA.spr, B pour spriteB.spr et ainsi de suite jusqu'Y. 

Sauf que quand j'ai voulu essayer de re-sauver ça n'avait pas marché. Pas de quoi fouetter un chat, mais j'ai moins ri quand je me suis rendu compte l'éditeur de niveau ne marchait plus. J'ai tenté un patch, j'ai voulu l'uploader dans runMe, mais runMe ne savait plus rien uploader non plus...

For over 15 years (!), Sprite Editor for DS has been satisfying to use with only 4 files directly accessible. It no longer is, with Furries experiments, demo projects and dreamland target that will use 4 different environment plus bilou.spr.

Hopefully, back in November, I added a new window in SEDS that let you pick a .spr when tapping the (poorly named) "dir." button.

There's unfortunately an unforeseen interference between SpriteSet::SaveBack() and OtherFileWindow::event(). One expects that the string you passed to SpriteSet::Load() megacycles ago is constant and hasn't changed. The other needs to drop the 'file' part of the path so that you can pick another file later on and not end up with fat:/moving/bilou.spr/desert.spr/green.spr ...

The unfortunate consequence of all this comes as SaveBack tries to make a .bakup of your .spriteset ... the name is now just the directory's name and thus the directory is renamed. None of my tools are ready to face that. Do you think future self-as-a-user will take notice of past-self-as-coder warnings written in the comments part of commit logs ?

Heureusement, je n'avais pas bousillé toute ma carte mémoire, mais par contre, au moment de faire la sauvegarde, mon "fat:/moving/oldies.spr" était redevenu "fat:/moving/", prêt à traiter un nouveau fichier et en faire un chemin d'accès. Et le code qui crée le fichier .bak à partir du .spr est ... disons ... vieux et innocent. Il à renommé fat:/moving/ en fat:/movibak qu'aucun de mes outils ne reconnait.

Et bien sûr, ça m'est re-arrivé hier en voulant changer quelque-chose dans mon bilouchk.spr ... Donc cette fois j'ai sorti mon callepin et le code-sur-boox

  • [done] fix SpriteSet so that it uses a std::string rather than const char* to remember the filename to save
  • [done] make sure SpriteSet::SaveBack() checks there is a .spr at the end of the file name
  • [done] add a check window in runMe that triggers when there is no /moving/ folder and offers to create one or to restore /movibak as /moving (if exists)
  • [done] also browse for files in AnimEDS

Sands. More Sands.

So I've been watching more Fury of the Furries pyramid levels, analyzing level design in Aladdin (SNES) and brainstorming with my 8y.o. J.L.N ... I start having more gameplay ideas to fit in the desert zone of my next game.

The possibly most interesting part is an extended set of moves for the 'Sandworm' monster. Making it bouncy fits the gimmick of spring-snakes and makes it a dangerous-but-useful character, similar to inkjet in the School Zone.

Une petite vidéo de Furries in the Pyramid, un peu d'Aladdin, et enfin une séance de brainstorming-de-niveau avec mon fiston de 8 ans, parce que j'ai fini par penser proposer "c'est moi qui dessine, c'est toi qui décide". 

Parmi tout ce qu'on aura gribouillé dans la salle d'attente, il y a notamment une série d'interactions possibles avec le Serpent de Sable: rebondir dessus, ne pas se faire attaquer parce qu'on est dans son dos et pas devant lui. Le genre de comportement un peu plus sophistiqué qui m'avait tant plu dans le premier Rayman. Puis il y a les demandes de J.L.N : crachet un crochet venimeux, se faire repousser comme un tas de sable pour finir dans les pics, etc. Là, il faudra peut-être que je filtre un peu: mon frère craint déjà que ça ne devienne cahotique.

J.L.N wanted it to be able to spit poisonous stings when the player is too far for a normal attack ... that might be for a 'red'-tinted one. (oh wait. They're made of sands ... red-eyed one ?). He also wanted to be able to turn it into a pile of sand that could be used to fill in the spiky grounds and make them less hazardous.

I wasn't hot about using a 'PULL BLOCK' mechanics for ink-level-switch in the school zone, but as a block-with-handle within a pyramid, I find it fine. We can use it to make a block lower (and grant access), to drain sand of another area (and e.g reveal a door), or flood spikes with sands.

Et tant qu'on est dans le bac à sable des inspirations de Fury, je m'essaie à repenser à des mécanismes à base de blocs à tirer pour faire s'écouler quelque-chose. Autant ça semblait trop artificiel avec une gomme et de l'encre dans l'école géante, autant un bloc et du sable dans la pyramide, ça me semble tout à fait approprié. On devrait pouvoir s'en servir pour faire descendre des blocs (et ouvrir des passages), révéler des portes (ou interrupteurs ?) cachées, et même recouvrir des pics de sable.

Aladdin level design wasn't that inspiring, though. I finally drew a first pyramid level (still kept secret) with J.L.N, but I used more info from 'Your First Koopa' analysis (on how to introduce ScorpEyes and sandworms) together with recent analysis of The Messenger grotto level on how increasingly difficult variant of a challenge are put together to make the level, which I apply here to the 'falling sands that turn into slanted conveyer belts'

Le moins inspirant dans le tas, finalement, c'était Aladin. Il y a bien des zones en pente avec du sable qui coule, comme je voudrais, mais je peine à extraire la 'logique' de progression pour pouvoir reproduire sans recopier.

Thursday, March 11, 2021

Mar10, Mar11, ...

C'était l'anniversaire de sortie de la Nintendo DS. (Le lendemain du Mar10, c'est un peu dommage, mais c'est comme ça). C'est maintenant une grande fille de 16 ans. En comparaison, quand JB me lançait "toi, ton hobby, c'est les consoles vintages" en 2010, c'était la PSX, et le jeu qui venait de sortir, c'était Donkey Kong Returns. Donc, euh ... bin, ouais, je crois qu'aujourd'hui, on peut définitivement dire que je suis dans les consoles vintages. C'est juste que j'y étais 10 avant que ça ne soit vintage ^^"

Pas étonnant, donc à ce que RetroEvents ait lancé un mini-sondage sur twitter... Sondage qui fait d'ailleurs écho à la question de Smooth Mc Groove sur le même thème.

ça n'aura pas été facile, par contre, de dire quels étaient les jeux DS que j'ai le plus appréciés. C'est la combinaison Yoshi's Island + nouveau Zelda + new Super Mario Bros qui m'a décidé à m'offrir la bête, mais en toute franchise,

  • j'ai regretté l'absence de Yoshi et de a plume dans NSMB tout en étant pas complètement convaincu par le mélange 2D/3D. Il n'aura pas pu détroner SMW (pourtant trop dûr pour moi) comme Mario le plus plaisant à reprendre.
  • j'ai apprécié le pixel art de Yoshi's Island DS mais la mise en scène était fatiguante et je n'ai jamais remis le couvert une fois mon niveau d'incompétence atteint. Aujourd'hui, je lui préfère son original.
  • j'ai été conquis par le level design du roi des mers, mais vraiment pas par le minimalisme de Phantom hourglass imposé par la contrainte des 2048 polygones. Par contre la DS m'a permis de jouer 'pour de vrai' à Minish Cap et je l'en remercie ^_^
  • La saga Mario & Luigi m'a bien plu aussi, mais soyons honnêtes: le look des adversaires de "Partners in Time" était loin d'être aussi chouette que "Superstars Saga" que je lui préfère
  • Kirby Squeak Squads était sympa, mais loin derrière Amazing Mirror dans mon estime.
  • Le nombre d'heures passées sur le homebrew de Giana Sisters explose largement celui sur le nouvel épisode.

Bref, vous l'aurez compris (ou vous vous en souveniez), les jeux exclu-DS qui m'ont conquis étaient plutôt rares. Il aura fallu attendre Shantae sur DSi pour que je m'enthousiasme vraiment. Enfin, il y a quand-même eu Professor Layton et Maestro: Jump in Music. Super PRincess PEach m'avait bien plû aussi, mais pas au point de me faire revenir une fois l'aventure explorée.

Wednesday, March 10, 2021

Oneliner to convert them all

fe -nx *.spr "perl ~/DS/SpriteEditor/bin/ %.spr ~/hobby/dspr/demo-%.blk.png --maxheight=256"
fe -nx *.spr "perl ~/DS/SpriteEditor/bin/ 
        %.spr ~/hobby/dspr/demo-%.spr.png
        --extra --maxheight=256"
Another oneliner to gather them all, and in HTML bind them...
(echo '<html><body>' ; 
   fe *.png "echo '<div style=@display: inline-block;
     background: grey; text-align: center;@>
     <img src=@%@ title=@%@ style=@display: block;@>
     <small>%</small></div>'" ;
   echo '</body></html>') 
   |  sed -e "s/@/'/g" > test.html

Why ? Because I need to know which are okay, which need to be recovered and which need post-processing.

And then I realize that I cannot 'compact' the alternate spritesets (draft and animations), and one possible explanation for that is that the 'free tiles' information for that pool is incoherent. Maybe my `sprck` tool could fix that, but to be honest, its output is so cryptic that I might need to run it in DDD to figure out. 

  • horizontal vertical tripes mean there's no pages using the block
  • vertical horizontal stripes mean there's a FREE entry for the block.
  • why is there so many FREE slots indicating that tile#0 is free ? (there's sprck_cleanup() to address that).
  • even after it 'repaired' the file, I seem to still have the same 
  • [done] fix spr2png --cleanup so that it works properly with --extra=1 and --extra=2.
  • [dont] ensure sprck is capable of dropping FREE entries when a block is used on a page. instead, we have to mark them free
  • [okay] ensure sprck can add FREE entries when no page is using a block - that's automatic in -repair mode.
  • [todo] have `fe` and `` and `whereami` hosted in DS/bin (or DS/tools/ or wherever it fits)

Sunday, March 07, 2021

Fezzy platforms

 Vous vous souvenez que j'avais joué à FEZ, hein ? Et pendant ce temps-là j'essayais aussi de voir si je trouvais des idées intéressantes pour Bilou, bien-sûr. Comme cette plate-forme qui fonctionne par paires, et qui se transforme en écrabouilleur sous certaines perspectives ou comme plate-forme inerte sous d'autres.

Bien chouette, mais comme Bilou ne peut pas changer la perspective, ça reste moyennement intéressant. (edit: à moins que ...) 

La deuxième (oui, je les fais dans le désordre par rapport à mes notes sur Boox) est déjà nettement plus exploitable.

C'est une sorte de mélange entre une plate-forme dont la taille varie au cours du temps (cf. SMW / Yoshi Island 3), mais avec en plus un effet 'répulsif' si on anticipe pas le moment où elle pivote. Et une phase où le saut de l'une à l'autre sera légèrement plus difficile vu que la hauteur augmente de 1 bloc.

Je trouvais que dans le thème de la pyramide, elle se serait assez bien déguisée en tête de crocodile. ça tombait assez bien: j'ai envie d'utiliser l'excuse de la pyramide pour introduire plus de plate-formes mobiles (sans avoir besoin de leur coller des ailes ou des réacteurs) et je n'ai toujours rien de crocodilien pour ma pyramide.

Mais pour en faire quelque chose de plus 'unique', je combinerais bien ça avec les plate-formes à dos pointu de Shantae. Sauf que comme Bilou ne sait pas souvent 'taper' dans quelque-chose, je pourrais utiliser un mécanisme "coup-d'boule" pour faire pivoter les plate-formes de 90° quand elles sont orientées "gueule en l'air".

ça pourrait être un défaut, mais en fait ça s'est avéré très inspirant. "et si les plate-formes étaient inter-connectées de sorte qu'en en cognant une, on en fait bouger plusieurs". "Et s'il y avait un 'pieu' dans le chemin de la plate-forme qui l'obligerait à faire 90° en plus si elle est dans le bon sens". "Et s'il y avait un switch pour faire apparaître/disparaître les pieux pendant que les plate-formes bougent" ... vous voyez le tableau ;)

edit: une variante qui fait un quart de tour quand on la quitte avec un saut (surtout pour le 'chemin des papas' à la demande de J.L.N qui vient de peiner sur qqch du genre dans Gris) et la possibilité d'attraper les montants verticaux avec le poing-lasso pour by-passer les challenges quand on a un power-up.

edit++: J'avais apparemment déjà fait une mise en image de plate-formes-croco basées sur les plate-formes de FeZ, mais avec une traduction plus litérale (et à mon avis moins convaincante)