Sunday, June 18, 2017

runme + assault = todo

I'd love to have the time to provide a real tutorial for people to start working with libgeds. So far, the best I have is a package with 8-bitifed graphics for AppleAssault and the corresponding game/character scripts... which -- thanks to some work I did a few weeks ago -- now also comes with a copy of RunMe that can run all of that. Maybe that will at some point make it more interesting to start working with the Game Engine for DS.

Of course, because runME is a tool primarily designed to transfer files, it will not exactly be easy to start a game there.


Bon, j'avoue, j'adorerais avoir le temps de travailler sur un vrai tutoriel pour le système lib geds, mais jusqu'ici, la seule chose qui s'en rapproche un petit peu, c'est une sorte de kit avec les graphismes de Apple Assault en version 8-bit et les script correspondant pour les personnages et pour le jeu. Et grâce au travail de ces dernières semaines,  tout ça i tourne maintenant avec une version récente de runme. youpi. Peut-être que ça rendra les choses plus faciles pour ceux qui veulent commencer à travailler avec le game engine for ds on peut toujours rêver...




click 'offline', then 'cmd'click 'A' to pick one of ASSAULT*.CMD, and then click the name you want to runpress now L+A to load the script into the memoryand now press L+Y to process that script to the end.

Évidemment, le programme 'runMe' est avant tout un outil de téléchargement. Donc il faut un peu chipoter pour pouvoir démarrer son programme:  passer la détection réseau , par exemple, puis choisir le fichier qu'on veut démarrer, et des commandes un peu barbare du genre La+À ou L+y pour démarrer la lecture du script ou pour l'interpréter sur la DS.

When I want to run this, I do it with desmume-cli, using --cflash-path=AA-efsroot (which is in the 'runMe.zip' archive) and --load-type=1. But that only works in Linux. For windows user, you'll have to go into config->slot2 and setup the directory manually (I just hope for Windows users that they can somehow save that configuration)
Il faudra aussi s'assurer que l'émulateur a accès au fichier du jeu qu'on veut essayer. Moi, je fais ça à la ligne de commande dans Linux, mais évidemment, les gens qui travaillent sous Windows devront passer par les menus de configuration de desmume pour avoir la même fonctionnalité ( voir l'image).

Voilà, avec tout ça vous avez la possibilité de tester le jeu que vous avez vous êtes en train de développer, mais malheureusement, s'il y a des erreurs dans le script, c'est encore très laborieux de les trouver et de les corriger. On peut faire mieux avec l'outil de test automatique que j'ai développé pour mettre School rush au point, mais c'est un truc qui doit être compilé à part. Et pour l'instant, il faut même le compiler à chaque fois qu'on veut essayer de traiter de nouveaux script pour un nouveau jeu, donc il faudrait que je fasse appel à l'équipe pour avoir une variante qui tourne sous Windows histoire que les jeunes puissent essayer de faire le même. Mais voilà, l'équipe, pour l'instant c'est juste bibi. alors soit vous vous enrolez, soit de vous patientez. Ciao.

All this makes you able to try the game you're developing, but when there are errors in the script, you just have a stop with the content of the offending line dumped.
Hopefully, It can now also be checked with 'testme', the unit-testing tool for current School Rush game. (which unfortunately still requires a rebuild for Windows everytime you change the scripts you want to check).

I could really use a helping hand to get that going somewhere. Someone who's used to do builds of Linux native projects in a Windows environment. Even then, it's unclear whether I can compete with a tool such as DSGameMaker, but I still think people should have the choice ^_^


Oh, et si vous allez jusque là, la présence du "log" deviendra vite gênante dès le niveau chargé avec succès. Rassurez-vous: il est tout à fait possible de le faire disparaître: il suffit pour ça de toucher le bouton 'log' sur l'écran du bas. Et si vous voulez retourner charger un autre niveau, le bouton "beam out" vous ramènera sur l'écran avec la liste de fichier et le "clavier virtuel" (qui fait les "lettres paires" quand on garde L enfoncé, soit dit en passant).

Et pendant que vous lisiez tout ça, j'ai ajusté la position des vagues d'encre pour le "niveau retour" de School Rush...

Saturday, June 17, 2017

Updating Doxyfile

Depuis 2014, je n'utilise apparemment plus que d'anciennes versions de mon code sur ma liseuse Cybook. Du coup, l'utilité s'en trouve assez bien réduite. En cause ? le comportement du nouveau doxygen (1.8.11 contre le 1.7.6 qui avait donné des résultats plus satisfaisants à force de bricole).

Pendant un moment, je me suis dit que je ferais mieux de passer par DocBook (dont je ne sais pas grand-chose excepté le fait qu'il s'agit d'xml). En fait, ce ne serait pas la bonne approche:
  1. le générateur de documentation DocBook de doxygen ne fournit pas les "fragments de code" qui sont essentiels pour mon utilisation
  2. s'il existe des epub-tools pour faire la conversion docbook->epub, le contenu même du format e-pub c'est ... de l'HTML.
J'ai donc repris point par point les choses qui posent problème dans la sortie de doxygen 1.8.11
  • les modifications pour que le code ressemble à du code et ne soit pas trop grand ne marchent plus. La faute à un nouveau jeu de règles CSS. Mais en réalité, les modifications que j'avais apportées à ces règles sont assez peu nombreuses, et je devrais donc pouvoir faire l'équivalent sur le nouvea fichier CSS.
  • les blocs indésirables en fin de fragment de code sont en réalité les tooltips, rendus visibles soit par calibre (le logiciel que j'utilise pour la conversion HTML->epub), soit par mon remplacement sauvage du .css de doxygen 1.8 par un .css modifé venant de doxygen 1.7 ... quoi qu'il en soit, définir SOURCE_TOOLTIPS=NO permet de les évincer du code HTML sans devoir y aller à coup d'expressions régulières. Et si rien ne m'indiquait que c'était possible dans mon DoxyFile, c'est tout simplement que je travaillais dans un fichier 1.7 où la fonction était indisponible ^^"
  • les indentations déviantes s'expliquent par une largeur de tabulations de 3 dans les règlages de Doxygen alors qu'elles sont définies à 8 caractères dans mon éditeur. Et que malheureusement il y a toujours dans le code un mélange d'espaces et de tabulations pour indenter le code >_<
  • Enfin, pour les numéros de lignes, je n'ai rien trouvé pouvant les supprimer, mais ils ont heureusement une structure très prévisible dans le code HTML. Un sed -ie "s:[ 0-9]*::g" *.html, et on en sera quitte.
Et je préparais un commentaire désobligeant sur la lenteur de conversion à laquelle calibre m'avait habitué, mais il semble que la version présente sur Ubuntu 16.04 a réglé ça. Voyons donc ...

Verdict : il y a encore du travail. Lors de la conversion, je me farcis un retour à la ligne chaque fois qu'on passe à un autre type d'élément syntaxique connue (un mot-clé, un type de donnée, une variable reconnue, une chaîne littérale, etc.)

Monday, June 05, 2017

Closing level

En plus du niveau "vertical" pour mettre un dernier coup au joueur exigeant, j'ai attaqué un "niveau de retour" avec les crédits du jeu.
- il faudra ajouter un état "arrivé dans l'encre" qui permette à Spongebop de s'enfoncer un peu avant de se mettre à flotter
- il faudra utiliser un "momentum(y) pour que SpongeBop donne un peu plus l'impression de flotter
- il faudra que la "mort" provoque le retour immédiat au niveau suivant
- ce serait sympa que les bonus récoltés sur ce niveau donne l'indice pour pouvoir accéder à la "vraie fin" (p.ex. en dévoilant progressivement le texte sur le livre)

I've started one more map that will be a playable credits sequence. I've got a few idea of how to make it interesting and fun... let's see if they work in the upcoming weeks (days?)

Saturday, June 03, 2017

School Rush update

At last, here comes an update on School Rush. Still featuring the 4 levels from last year, but with improved gameplay (especially through slightly increased gravity), improved game feel and a starting level that is more fair. I dub it "splashed" release because most of these changes were suggested by the author of Splashers ;-)

Voici enfin une mise à jour pour School Rush. Toujours les même 4 niveaux que la fois dernière, mais avec un gameplay amélioré, plus de petites animations sur les objets interactifs (gommes et bonus) et un premier niveau plus accessible même en mode normal. Et vu que la grande majorité de tout ça m'a été recommandé par l'auteur de Splashers, je baptise cette release "splashed" ^_^

gameplay

You're controlling Bilou, a blue, ball-shaped explorer. You make him JUMP with the (A) button and grab things (or throw them) with (B). Your goal is to reach the right of each level before you're caught by the ever-raising ink.
You'll need to be quick, too. Use (R) or double-tap in left/right directions as if you were a pink, living vacuum cleaner.

You can stomp some monsters, you can throw sharpeners at others. Remember: the pencil soldats are the only real threat here, and they must be stopped from pouring even more ink for their autoritarist plans. Everything else that looks dangerous is mostly acting on fear and may prove very useful if you keep your head cold. Think about how useful a bobbing sponge could be if you could ride it (B). or how high an inkwell could shoot you ...

There are rumours of magical artifacts that could help you. The Fist of Justice, that noone can stand against (double-B) and the Floating Twister (hold A), that let you reach far away places. It's unlikely the pendats will let you recover them without a fight, though.

Story

At the far east of this school-like country, there is a gauge that will stop the ink. Rush for it! The books city is close to be destroyed once for all, and the elders' knowledge will be lost. This must be another plot from Square Root, who decided that mathematics are the only thing worth of being written down.
Everyone here seems to believe that Bilou is a sort of legendary hero...

How to play

Get the NDS image and play it on your homebrew-ready console or in an emulator, such as DeSmuME. See this page if you need extra explanation/instructions for running homebrews.

Tuesday, May 30, 2017

Encre ou pas ?

J'avais voulu pour la prochaine release couvrir un des autres aspects des commentaires de Romain:

Côté [level design], est ce que c'est censé faire partie du jeu normal que l'encre monte tout le temps ? En tout cas, mode facile ou pas, il faut que les joueurs puissent apprendre votre jeu.
Faites vos 2 - 3 premiers niveaux très gentils, avec pourquoi pas des endroits où ça monte mais pas partout et surtout pas au tout début, avec du challenge mais avec pour objectif que je joueur se familiarise le plus possible, s'amuse, dompte, avec le moins de punition possible (c'est chiant, et surtout c'est pas le but). Vous aurez tout le loisir de faire des choses progressivement très hardcore dans les niveaux d'après (3, 4, 5 etc.)

Romain, developer of Splasher, also questioned the way ink is always (~) raising in SchoolRush. "Whatever the difficulty level, the player must be able to learn the game", he argues. "Let your first few level be very soft, maybe with some areas where the ink may raise, but definitely not right at the start. You may put some challenge in, but the goal must be that the player gets confident about the gameplay, has fun and is allowed to master [basic controls] without getting penalties for every bad move. You'll have plenty of levels to get slowly to a hardcore difficulty level"

I must confess this is one of the tip he gave I had the hardest time to integrate into the gameplay. Because I only plan to have 4 + 1 levels in School Rush. The game is intended to be short, focused on simple gameplay of running forward under ink raise pressure. I have been tempted to select a trigger in every level where the ink would start raising while keeping the first two screens for some gameplay sandboxes. I think this can work provided that the player may "see" that something got triggered and the ink starts raising. I even made some sketches with gargoyles-like items in the background, but I couldn't get it to fit the desired storyline of the game -- that is, pendats have decided to flood the area to punish books for not following their leader, and Bilou tries to get to the ink source to turn it off before it is too late.


En ayant pour objectif de faire uniquement 4+1 niveaux pour SchoolRush, je devais adapter le commentaire, évidemment. J'ai pensé par exemple à garder les quelques premiers écrans avec l'encre à l'arrêt avant de déclencher la montée. Pour que ça marche, il faut que le joueur puisse "voir" que l'encre se met en route ou s'arrête. J'ai fait quelques esquisses de têtes de crapauds qui laisseraient l'encre s'écouler hors de leur bouche, par exemple. Mais je n'arrive pas à relier ça avec l'histoire (les pendats cherchent à noyer le niveau)

Puis j'ai réalisé que -- dans les 2 premiers tiers du niveau "School Rush", la montée de l'entre n'est pas vraiment importante (en mode normal), parce que si elle retire certaines structures destinées à servir de filet de sécurité aux novices, en revanche elle ne monte jamais assez haut pour mettre en danger le joueur qui reste au niveau du "sol officiel". Pourtant, ça ne se voit pas parce que au niveau des pixels, l'entièreté du sol est couvert.

avant
après
Then I realised that in the first 2/3rd of the level 1 of School Rush, having the ink raising is irrelevant in "normal" mode, because it never gets its hitbox reaching Bilou as long as Bilou is on the level's main structures. The only thing that effectively becomes unusable are the safety nets meant for the "easy" difficulty level. But this is not what the player feels, because the ink effectively hides the main structures. I mean completely. I have to remember precisely the position and size of the holes to clear if I don't want to lose a life there.

So all I need to do if I want to get a newbie-friendly 'normal' mode is to let the sprites depicting the ink shifted down by a few pixels so that I can get both the initial intent (let the player know, right from the start, that she's rushing against ink) and the new objective (once it turns obvious that the rise has come to an end, be able to freely explore game controls and mechanics).


Il me 'suffit' donc de descendre un rien le niveau des images représentant l'encre animée pour rencontrer à la fois mon objectif initial (que le joueur sache dès le départ que, dans ce jeu, on court parce que l'encre monte) et le nouvel objectif (que le joueur ait un terrain d'entrainement pour se familiariser avec les contrôles et les règles du jeu).

Il me manquera une possibilité d'avoir un terrain d'entrainement pour les power-ups, qui ne sont pas évidents à obtenir dans le premier niveau. Je crois qu'en retravaillant les modalités du niveau bonus, on doit pouvoir y remédier.

I still lack a sandbox for trying the power-ups, as they aren't obvious to get in the first level. I hope to get that fixed through the bonus level you'll be able to unlock with the collectible letters.

Friday, May 26, 2017

SaturdayScreenshot

Et voilà. J'ai un petit effet sympa pour attirer l'attention sur les boules bleues redonnant de l'énergie au joueur. Ça aura été un peu de chipotage pour intégrer les nouvelles animations dans les 4 niveaux existants, par contre. Pour la suite, il va vraiment falloir que je veille à ce qu'on puisse inclure les déclarations de bloc spécial de la même façon qu'on inclut les machines d'état pour les personnages.

Demain, je pourrai mettre ça sur Twitter et participer au micro-évènement "postez un screenshot de votre jeu en cours de développement".

Don't you love that blinking effect on the healing bonus ? Not as hypnotic as bouncing on a pink eraser, but i'm quite satisfied with the result. I'll have some work to do to allow such things be used in multiple levels without having to rely on manual copy-and-pasting across multiple script files.

Wednesday, May 24, 2017

Quelques détails

à régler avant de refaire une release:

  • récupérer le dernier .spr avec les petites étoiles en jaune pour les lettres
  • ajouter un effet quand on récupère un point de vie
  • corriger la fin du niveau 1 et les pilliers du niveau 4 pour qu'il n'y ait pas des bouts de gommes au lieu des graphismes.
  • veiller à repasser en mode "jeu complet sans Inspector Widget"
Mais au moins l'ensemble des niveaux reste jouable avec les niveaux d'encre ajustés.

Sunday, May 21, 2017

shell to cybook

I got the z-list issue fixed. The error was what I suspected, but what is more interesting is that I have been able to write a test case that reproduced the bug systematically, and thus that demonstrate that the problem is gone with the fix.

I had to change my approach for investigating that because I've been doing so much on-line activities these last days that my eyes started to "panic". So rather than staring at my laptop top understand the outcome of a test, I pushed it into a .html file that I could browse with my e-ink cybook.


python -m SimpleHTTPServer 8000 &

(echo "<html><body><pre>" ; 
  ./testme ; 
  echo "</pre></body></html>") > /tmp/html/out.html

(echo "<html><body><pre>" ; 
  grep -h -C14 prepare libgeds/source/* 
    | sed -e 's:&:&amp;:g;' 
    | sed -e "s:<:\&lt;:g;" 
    | sed -e 's:>:\&gt;:g;' ; 
  echo "</pre></body></html>") > /tmp/html/code.html

Bon, ça n'a pas été une semaine simple, mais j'ai réussi à pouvoir prouver que le bug d'affichage de Bilou est corrigé tout en reposant suffisamment mes yeux qui criaient "au secours" la semaine d'avant. J'ai notamment utilisé assez abondamment ma liseuse pour passer en revue les résultats des tests (puisque oui, j'ai choisi l'approche "test automatique plutôt que l'approche "debugging interactif raffiné", la faute aux yeux précédemment cités). Celà dit, je vais rester prudent et laisser les détails techniques uniquement en Anglais pour cette fois-ci. Dès que j'aurai compris pourquoi l'encre refuse de s'arrêter à la hauteur demandée, je pourrai faire une release améliorée de School Rush.

The test itself is actually fairly simple conceptually: I just drag Bilou around in the level, back and forth, emulating the camera and the game logic after each displacement. As the camera moves through the level, some game objects freeze and unfreeze, recycling the hardware sprites, and inkjets use the top-layer sprites so that ink drops look to come from within it.

On the first round, the bug did not happen, but I had programmed a "trap" to report what I thought to be the precondition to reproduce the bug (having the inkjet frozen while it had one hardware sprite at top priority). The test then showed me that this happened, but less often that I thought. Actually, it only happened with one inkjet near the end of the level.

Then, I extended the test so that I would make an increased number of scrolls through the level. There I got the bug appearing systematically on one of the levels. I had to filter out some of the events reported during the scroll (I reported every change in the zlist's size as well as any arrival/departure of hardware sprites): inkjets throwing ink corresponding for instance to 4 correlated events. Making sure that the camera coordinates are reported (instead of Bilou's coordinate) helped as well.

Monday, May 08, 2017

Another Inspector Widget ?

I have another instance of sprites disappearing and re-appearing in School Rush. It is likely something with the "pull part on top of every other sprite (aka. zlist[0]). I believe the issue happens when a modular sprite gets frozen while it had one of its component pulled to zlist[0], and then comes back to activity.

It would be great to investigate those situations to have an alternate widget for the Inspector Window Something that would show the on-screen area, the "GPU-active area" around it (where hardware sprites are are still programmed to be shown), and the area where the objects are still active although their OAMs are all disabled to avoid display glitches.


Bon, je tape un peu en vrac mes cogitations du week-end. Si je n'ai pas encore refait une release avec les améliorations de School Rush du mois dernier, c'est que je suis confronté à un retour des sprites-fantômes. Au départ, c'était juste dans la tour encrièrnale, mais ça se généralise à tout le jeu School Rush... J'ai ma petite idée sur la cause, mais j'aurais bien aimé en avoir la preuve avant de tenter une correction du code. Histoire d'être en mesure de montrer que c'est bien corrigé.

L'ennui c'est que j'estime le rapport entre corriger et démontrer que c'est corrigé de 1 à 10 au minimum. Voire de 1 à 100. L'autre ennui, c'est que ni l'amélioration d'Inspector Widget (qui aurait de la gueule) ni l'écriture de cas de tests (qui serait en aveugle) ne me paraît préférable

Ideally, it should be able to show "regular" and "pulled" sprites differently so that we can spot what state they are in and when. It should of course allow pausing and step-by-step processing to maximize our chances to reproduce the believed cause of the crash. Would that be enough ? should I rather try to have that investigated through "unit" testing ? I don't know yet.


Monday, May 01, 2017

MapAnim : done

Once again, properly mapping the codebase before starting to program got a loong-delayed-feature added to the engine within an afternoon. The code was actually written bottom up, starting with the revision of the "clearblock" function up to the script parsing code. 

I love so much the new little bounces and stars, I couldn't play the game without them anymore :P

Et donc les voilà, ces petites étoiles qui accompagnent la disparition des bonus et cette gomme rebondissante que l'on me recommandait. Je vais bien vite me refaire une version de School Rush qui intègre tout ça, parce qu'on y prend terriblement vite goût ^_^

Le nouveau système me permet aussi d'affiner un peu le comportement de la gomme rebondissante: elle ne projette plus Bilou immédiatement en l'air: au départ, elle n'est qu'un détecteur et devient un rebondisseur uniquement avec la première étape d'animation. Du coup, ça permet au joueur de mieux ajuster ses mouvement avec ce qui se passe dans le jeu (enfin, je trouve).

Saturday, April 29, 2017

Adding the MapAnim

 Allons-y donc pour l'ajout d'un nouveau type d'animations dans mon moteur de jeu: la modification du contenu de la map elle-même dans le temps. Jusqu'ici, c'était limité à "faire disparaître le bloc en (x,y)" ou "retire-lui ses propriétés, mais laisse-le visible" (pour les bonus cachés). ça peut marcher pour certaines choses, mais ça suppose que les éventuels effets liés à la disparition soient entièrement pris en charge par un sprite supplémentaire. Idéal si l'image doit quitter son emplacement (un morceau de pont qui tombe, un décompte des points qui monte, etc), celà dit.

Let's have one more way of animating things in my game engine. One that would be suited to special blocks, and that update the map content at a specific location over time. The only thing I could do so far would be to shoot a sprite-manipulating game object and make the block disappear. That's mostly appealing if you want a picture to move away, like broken bricks, falling logs and the like. 
The "BlockAnim", used to animate the ink, is not interactive and apply simultaneously to all the instances on screen. It can make SMW coins spin, but it cannot leave a trail of sprinkling sparkles behind.

Now, let's resume the coding, I'll keep you updated on the outcome. I already love the animation I designed last night for the bouncing erasers ^_^.

Il y avait aussi les "blockanims", qui permettraient par exemple de faire tourner les pièces de Super Mario World sur elles-même. On procède alors par une mise à jour de la mémoire "tiles" et toutes les instances de l'objet sont mises à jour simultanément sur l'image à l'écran.

Le nouveau "MapAnim", lui, correspond plutôt aux besoins pour faire bouger un buisson devant lequel on passe, mettre des petites étoiles là où il y avait un bonus, etc. Comme vous pouvez le constater sur les diagrames, le mécanisme qui permet de mettre à jour le niveau (les données gérées par la classe InfiniMap) n'est pas particulièrement simple. Il met en jeu une description de chaque type de bloc spécial (les BlockInfos) et un objet temporaire capturant "tel bloc à tel endroit" (le BlockArea) qui permet d'interagir avec le personnage (GameObject) qui vient de passer par là. C'est finalement InfiniMap lui-même qui procède à l'effacement sur base du résultat du test de collision. La seule bonne nouvelle, c'est que c'est assez souple pour permettre des (petites) portes, des bonus, des bumpers et même les guides invisibles qui font faire demi-tour aux encriers.


Koopa 3D

Houlalaa... je retombe sur une vieille image de synthèse que j'avais réalisée dans moray/povray et présentée à la Inscene '99 ...

Quand je vous dis que la 3D, ce n'est pas pour moi, c'est pas une blague, hein.

Thursday, April 27, 2017

pauvre Game Feel

Je n'ai pas de définition de "Game Feel" à proposer. C'est juste un mot pour parler de ce qui fait que le jeu semble attrayant, divertissant. Les petits nuages de fumée de Rayman, les bananes qui s'envolent vers le compteur de DKC, la pièce d'or qui bondit hors des blocs-question dès Super Mario Bros sur NES...

Toutes des choses dont mon School Rush est actuellement dépourvu, comme le faisait remarquer Romain Claude:

Après le feeling avec le jeu c'est une tonne de choses à soigner : les réglages des paramètres physiques, les animations, tous les petits détails de feedback à droite à gauche qui rendent le tout "rewardant" et jouissif. Pour le moment le jeu est assez dépourvu de tout ça. Les gommes rebondissantes par exemple, si elles étaient animées cela rendrait le rebond plus satisfaisant et plus clair sur le fait que cet objet réagit.
Et qui est repris également sur le forum "e-magination", même rien qu'en regardant les images d'accroche:
Ce serait chouette que les bonus affichent un petit effet quand on les récupère, selon moi, ce serait moins "tristoune"
 J'y ajouterais bien un peu de secousse de caméra quand on donne un coup de poing au sol, si jeu peux.

It seems like people have dedicated the words "game feel" for all those little details that make a videogame feel more alive and reacting to player's actions. Dust clouds, sparkles, bananas flying towards their counter and things alike. It is becoming a recurring comment on current School Rush that I lack such little animations that should provide important feedback and make the player smile. 

Unfortunately, I have considered them as unimportant for most of the development and I'm now near the limits of the current game engine, especially when it comes to new graphics for the sprites. Both eraser-bumpers and disappearing bonuses will thus have to be implemented that patching the tilemap according to some animation commands ... something for which I haven't got code for. So far, the closest I had was pushing new graphics into the sprite/tilesets, which animates all the instances simultaneously.

Pour les bonus et les gommes animées, par contre, ça demande d'ajouter au map elle-même (et pas le remplacement des images du tileset comme c'est le cas pour les animations non-interactives : l'encre, les pommes qui se balancent dans la Green Zone, etc). J'avais pensé un temps m'en sortir avec un sprite temporaire, mais ma planche de sprite est trop remplie pour que ça puisse passer.
Je vais donc devoir rajouter au moteur de jeu un composant que j'ai retardé depuis probablement trop longtemps: l'animation d'un objet par manipulation du contenu de la map elle-même.

Tuesday, April 25, 2017

Rushed difficulty selector ?

It took me about one year to realise that my difficulty selection interface on the main menu of School Rush had a flaw. It perfectly moves the cursor up and down with the DPAD, but it will only register the difficulty selection and apply it in-game if you used the stylus to perform your selection. Pretty annoying. Now I understand better why people considered the game a bit too hard ^^"

Aargh! Quelle horreur. Je me retrouve avec une interface incohérente pour le choix de la difficulté de School Rush! et depuis près d'un an sans m'en être rendu compte jusque là !? Tout fonctionne si on choisit son niveau de difficulté au stylet (chose plutôt rare, convenez-en) mais si on utilise les direction "haut" ou "bas" du DPAD, on reste en fait bloqué en mode "normal" ...

Vive les revues de code >_<

Monday, April 24, 2017

Round 2 (P.Y. vs. PypeBros)

Allez, je prends une petite demie-heure pour répertorier les questions et les posts qui me viennent en tête quand j'écoute la deuxième partie de l'interview avec P-Y.

01% - faire le jeu auquel on rêve de jouer ? 00:20 - another world - prince of persia - titus - rayman
15% - priorité au plaisir de créer ? 03:13
        - rpg essentialiste
30% - l'évolution dans le rpg ? 06:20 - (mario rpg) (modding/remake de keen)
40% - juste un niveau ? construct 2 ? 08:20 - (badman2/3) - quel je choisir ?
50% - les jeux homebrew (portage/demo/jeu simple-mais-complet) 10:45 - un seul niveau (bilou basic) - l'anniversaire - façon pacman : apple assault
80% - le curseur de difficulté 16:43 - rien que normal - easy-normal-hard dans keen

Somethen, I met a phd student who's interested in understanding why people make video games on their spare time. This is part 2 of 3 of an interview, in French, addressing mostly "are you making for making or making for players" and "how about people that are fine with one-level demos ?".

Wednesday, April 19, 2017

Augmentons la Gravité ?

J'ai eu l'honneur (et un peu la chance, il faut l'avouer) d'avoir un retour de Romain Claude -- dévelopeur principal de Splashers sur mon School Rush. Un feedback assez technique et qui ne sera pas facile à prendre en compte, parce qu'on s'attaque ici au coeur du gameplay.

Mon principal retour pour le moment concerne la prise en main, que je trouve assez raide. De plus, le fait que le jeu soit assez mou rend le tout assez hardcore, même en facile ... Côté contrôles vous devriez avoir un air control progressif (de moins souple à beaucoup plus souple), et ceci marié à une gravité plus forte rendra la prise en main plus réactive et agréable. Par contre pour retrouver la même hauteur de saut il faudra augmenter la valeur de l'impulsion.

I'm honoured and proud that Romain, main designer of the platformer "Splasher" took the time to try and give detailed and technical comment on my own "School Rush". In the upcoming weeks, I'll likely be busy understanding the implications of his proposals and doing attempts to adjust the gameplay of SchoolRush accordingly.

The first suggestion is to increase the gravity to get more a reactive experience -- which echoes a comment from Kirby Kid in a previous iteration. That's not something to be taken lightly, though. Many things in the game depends on the gravity. Changing it by a ration g'/g means that you have to modify the jump impulse v1 so that the maximum height of the jump -- v1²/2g -- remains constant. But even so, the amount of time you stay in the air is reduced due to the increased gravity, meaning that the distance you can clear with a jump is shortened.

Mais changer la gravité, c'est changer beaucoup de chose. En plus d'ajuster la puissance de l'impulsion, je dois aussi ajuster la vitesse de déplacement de Bilou puisque le temps qu'il passe en l'air, lui a été réduit. Sans celà, il faudrait revoir tous les obstacles du jeu.

En fait, une fois tous les paramètres dépendants de la gravité réajustés, on a le même jeu mais avec le temps accéléré. Ce n'est pas déplaisant, mais ça va demander aux joueurs d'être plus alerte, parce que du coup, je vais devoir aussi augmenter la vitesse de l'encre sans ça elle est complètement à la traine. Peut-être devrai-je aussi accélérer les pendats...

By increasing the walking and the jumping speed of Bilou with the appropriate factor, I can keep the levels unchanged and enjoy a more engaging gameplay. I'll have to speed up the rise of the ink: at the moment, the game has turned too easy and I might also have to speed up pendats, so that Bilou don't outrun them too easily, which will shrink the response time allowed to the player (to 86% of the current value for g'/g=4/3) ... but it still leaves 500ms+ to react, so that should work.

http://critical-gaming.squarespace.com/blog/2011/1/5/super-meat-boy-pt1.html
J'essaierai celà dit d'éviter "l'effet Meat Boy" si je le peux, à savoir d'avoir le contrôle en l'air tellement élevé que l'on finit par "glisser" dans l'air et se déplacer plus vite horizontalement que verticalement. Mais en ajustant la vitesse horizontale maximale, il devrait y avoir moyen d'éviter ça.

Directly linked to the change of gravity, Romain suggests progressive air control. The current code controlling Bilou has some momentum while mid-air with an acceleration that is 1/2 of the one you have on the ground.

In his interview about Splasher, Romain says:
Air control is a touchy subject: you need sufficient control so that player can compensate for an imperfect impulse (imperfect timing or speed) while still having an interesting skill floor, but not give too strong air control, else the player will [go wild at uncontrolled speed] at the slightest move of the joystick.
To balance things in Splashers, Romain used delays, so that the air control just after the impulse is not as strong as it is some frames later.
This happens in Super Meat Boy too, with a character that initially struggles to work against its original impulse, but that gets increasing amplitude as you maintain the joystick pushed into one direction. To be honest, Super Meat Boy isn't one of my reference in terms of gameplay. I would even consider it as a counter-example of convincing physics

Dans le "School Rush" actuel, j'ai un système qui encourage le joueur à prendre le temps de courir avant de sauter: une fois en l'air, on peut ralentir et faire demi-tour (Bilou reste tout de même un explorateur de l'espace, ça offre quelques mouvements inaccessibles aux simples humains), mais on ne pourra jamais atteindre à nouveau la vitesse maximale avant d'avoir touché le sol pour courir à nouveau.

Ma première tentative pour m'approcher du "contrôle de plus en plus souple" (que je traduis par "augmentation linéaire de l'accélération horizontale avec le temps passé en l'air") consistait simplement à autoriser une vitesse horizontale plus grande en phase descendante par rapport à la phase ascendante. Mais ça, ça n'a pas été un succès.

Friday, April 14, 2017

splashers

Quelle sympathique façon de découvrir un nouveau jeu que ce match de splasher entre Usul, Ben et Leo.  Mais il y a mieux: la présence de Romain, le dévelopeur principal du jeu qui nous présente un peu son histoire et celle de son jeu.

There are days were you're lucky if you speak French. Because if you do, you can get all sort of advices on gameplay tuning and interesting relationship between Rayman: Origins and Splasher explained by the game designer himself. 

Le Notuto dans splasher

"Notuto", c'est mon mot à moi pour décrire le fait de construire son jeu pour qu'il n'y ait pas besoin de tutoriel spécifique.  Puisque toutes les actions importantes du joueur passeront par des tirs d'un des liquides impliqués dans le jeu, les premiers niveaux auront recours à des "canons" de l'encre la peinture correspondante. La bonne idée, c'est que ça permet de mieux montrer le côté dynamique (il va falloir peindre) que d'avoir la peinture déjà placée à un endroit donné. ça montre aussi certaines interactions que de la peinture statique n'aurait pas eu. Autre truc "notuto", les ennemis fuyeurs, qui partent en avant quand ils nous aperçoivent et du coup déclenchent des pièges qui les exterminent, nous montrant le fonctionnement de certaines mécaniques de jeu.

Romain took advantage of the primary mechanics of his game (shooting) to present all the variants it could have. Because it is quite easy to have something within the level that shoots too (a cannon) and thus you can have the player watch the new variant before she actually has to do the new variant. 

This is even reinforced in the "free-the-dude" not-so-hidden rooms, where sometimes the simplest winning move is not to move and let the room do the work for you. A nice way to avoid written tutorials, if you ask me.


Puis il y a les "warp zones" où il n'y a parfois rien à faire, pour donner au joueur un moment où il est invité à analyser la situation et trouver ce qu'il convient de faire plutôt que de devoir enchainer des manipulations techniquement exigeantes, qui sont ré-inspirées des "maps-cage" de Rayman Origins.

Le tuning

Parce que Splasher, c'est aussi 3 ans à peaufiner les détails pour que l'expérience de jeu soit celle espérée par le dévelopeur. 
La distance entre l'avatar et la caméra, très dé-zoomée contrairement aux Sonic des années '90. Une grande attention apportée aux déclencheurs d'évènements en fonction de l'avancée du joueur (comme dans SMW), même si apparemment c'est plus "checkpoint par checkpoint" que "écran par écran", sur le coup. Et je n'ose même pas imaginer le travail que ça a dû représenter d'ajuster les zones bloquantes autour des scies pour que le joueur n'ait pas besoin de calibrer *chaque* saut.

Les mécaniques de jeu

Le contrôle en l'air, où on discute sur le contrôle en l'air, conditionnée sur le temps de saut (quasi nul au moment précis de quitter le sol, et prise de contrôle au fur et à mesure que le saut atteint son appogée puis que la descente commence.

Puis il y a le shoot "assisté": on indique une direction et l'avatar tir vers la cible détectée dans cette région-là, par "aimantation de la visée" grâce à une zone d'attraction centrée sur chaque cible potentielle. Cette dimension-là sera plutôt développée dans les phases de "boss".

On va un peu voir dans les prochaines semaines ce que je peux en apprendre pour mon jeu à moi ...

L'interview avec P-Y.

Il y a un mois ou deux, j'ai eu le plaisir de répondre à l'interview de P-Y, un doctorant qui s'intéresse tout particulièrement aux motivations des développeurs de jeux amateur et hobbyistes. Plus ou moins trois heures de questions-réponses que je vais un peu indexer, histoire peut-être d'en faire une vidéo illustrée par des extraits de blog ? Parce que vous vous en doutez, quand je raconte tout ça, j'ai des bouts de mon blog en tête, bien sûr.

Voilà donc pour la première heure

00% -- Comment en es-tu venu à vouloir faire des jeux ?
09% -- La première fois où tu t'es dit "j'ai envie de faire un jeu vidéo" ? (05:55) -- c64 -- calimero
18% -- Si vous aviez eu la super-nintendo à la maison, vous n'auriez pas pu faire de jeu sur SuperNES -- tiled -- hardware
32% -- Le lien entre créer et continuer à jouer. (20:00)
38% -- L'analyse des jeux comme prolongement du jeu (23:00) -- critical link -- rpg -- mechanics -- dangerous -- mario
47% -- Il y a des amateurs de jeu vidéo comme il y a des cinéphiles ? (28:50)
52% -- une couleur chaude pour les sauts difficile, une couleur froide pour les sauts faciles. (31:59)
54% -- le platformer comme de la lecture à vue (33:07) -- mario
59% -- Guitar Hero n'est pas un jeu, c'est un concours ; Manic Miner est un puzzle (si tu lui mets les vies infinies) (36:00) -- beyond-blogosphere -- do-you-sass-zx-willy
76% -- Quand tu fais un jeu, est-ce que tu cherches à exprimer quelque-chose ? (46:22)
81% -- L'appropriation, l'expression des mécaniques appréciées dans la création. (49:00)
85% -- Comment a disparu l'envie de piéger le joueur ? (52:15) -- rayman -- badman
94% -- Amateur = je le fais pour moi ? (57:00) -- feedback

PS: oui, l'environnement était un peu bruyant. A refaire, on ne s'installera plus dans une cafétaria.

Wednesday, April 12, 2017

De plus en plus long ?

Ai-je raison de penser que les niveaux de jeux de plate-formes sont de plus en plus long, et donc infaisables sans avoir une demi-douzaine de checkpoints au minimum et des vies infinies ? 

pirez in Bilou : School Rush (1'30") P

SMB 1-1 à l'aise (1'20") NES
SMB 4-1 à l'aise (1'20") NES
Commander Keen, perilous pit (4'00") SNES
Commander Keen, perilous pit (0'45") -- world record. SNES
DKC, Millstone Mayhem (1'20") SNES
SMW, Donuts 1 (1'15 en prenant son temps) SNES
DKCR -- level 2, 100% (7'30") WII+
DKCTF -- level 2-6, no collectible (2'40) WII+
Rayman Origins, level 2-1, 3 cages (4'30") WII+
Splasher, level 2 (speedrun) (1'30") WII++
Splasher, level 7 (speedrun) (1'50") WII++
Giana Sisters Twisted, level 1-6 (speedrun, no boss) (4'35") WII++

La minute' trente de Pirez pour finir le parcourir le niveau 1 de Bilou: School Rush est donc assez bien dans la moyenne. Ce n'est pas un niveau court, mais ce n'est pas un niveau long non plus. Il y a bien des jeux qui ont des niveaux beaucoup plus longs (la palme revient à Giana Sisters, talonné par les Donkey Return/Tropical freeze si on essaye de récupérer les items).

Sometimes, I got the feeling that levels in platformers are up to 10 times as large as they used to be. That feeling grew up as I played/watched some Tropical Freeze and culminated with the strolling in the amethyst mines of Giana Sisters: Twisted Dreams. But is it accurate ? Above is a list of youtube power plays / speedruns of some of my reference games. I picked the second level most of the times, or the first level orf world 2 ... or some particularily memorable level I want to compare against.

It looks like I'm not completely wrong, but biased by the amount of side-action that exists in latest Rayman and Donkey Kong games. Splasher, on the other side, seems to have a more standard 1:30 average run-through time. Just like Bilou: School Rush :P
.

Splasher, par contre, reste dans un timing habituel. C'est uniquement parce qu'il s'agissait d'une "blind race" que j'ai eu l'impression que les niveaux étaient beaucoup plus longs que le "niveau standard"

PS: non, ne cherchez pas Keen 4 sur NES. C'est un jeu PC. Je le mets dans "SNES" en fonction de son époque et de sa technologie (CPU 16 bits, peu de mémoire, son FM). Idem pour les "Wii+" et "Wii++".

Ah oui. J'expliquerai un peu plus tard le lien avec Splasher.

Friday, April 07, 2017

Un peu de perspective ?

J'avais trouvé hob (runic games) totalement épatant, mais en faisant des essais pour le ramener à une vue 2D totalement à plat (façon Mario World ou SMB* sur NES), il faut bien reconnaître qu'on perd beaucoup de l'effet étrange, même en essayant de jouer sur des effets de lumière pour reproduire la perspective.

A peu près au même moment, je tombe pour la première fois sur la réinterprétation de Zelda II par Itchabop ... Je suis convaincu. ça donne plus de profondeur aux scènes, une ambiance plus close et à mon avis tout à fait utile pour la zone du chateau ou de la pyramide (et sans doute très bien aussi pour le temple perdu si jamais j'arrive jusque là).

(C) Ichtabop 2017
Hob's environment design works great because of hob's perspective. Itchabop's mockup of Zelda II conveys impressive atmosphere partly because of its perspective that put next to each others things that you can walk on and parts that are out or reach and mysterious.

Can I improve my skills and tools to get something similar in the desert and castle zone of Bilou ?


Du coup, je sors mon bloc à gribouille et je cherche un peu ...

Quelle perspective ?

Il faut qu'on reste dans quelque-chose de propice à du jeu de plate-forme. Je connais le système 1/3 pour une face 2/3 pour l'autre face, régulièrement utilisé pour un jeu façon Zelda "2D", mais même en inversant les proportions habituelle et en mettant 1/3 pour le sol et 2/3 pour les murs, c'est encore trop (cf. le tuyau de mario en bas à gauche de l'image). J'opte donc pour 1/6eme de dessus contre 5/6eme de face en espérant ne pas déchirer le continuum espace-plan.

I think I need something more subtle that the typical RPG perspective, where a cube's top would take 2/3 of the tile's height and the cube's front would be 1/3. Testing with Super Mario pipe makes me think that I should have at most 1/6th for the top and 5/6th for the front part to have a platformer-friendly perspective.

With those values, a 16-wide cube would show 2.66 pixels of "top" area -- okay, let's say 2 pixels of "top" color plus one pixels of shared "highlight" area.


Avec ces valeurs-là, un cube de 16 pixels aura approximativement 2.66 pixels de "surface horizontale" affichée. Allez, disons deux pixels pour le plat et un pixel de highlight partagé, puis 13 pixels "de face".

Et la School Zone ?

Oui, parce que pour avoir des images intéressante dans School Rush (et dans la school zone en général), j'ai déjà cherché à éviter les objets placés complètement face caméra, notamment avec les livres qui sont décalés. Plus question avec une élévation de 15° de choisir arbitrairement la taille de la tranche et la taille de la reliure. Il faudra que ça corresponde à un angle de rotation et une dimension de page qui soit cohérente. Ensuite, il faudra beaucoup plus de graphismes parce que si j'ai bien calculé, une section de 48 pixels de large correspondra à un décalage de 5 pixels et autant de variante d'un tile (mettons la transition bas/côté du livre) qu'on ne souhaite de dimension de livre (16 pixels plus large, il sera 2 pixels plus bas, etc.)

That's all nice for cubes and affordable for pencils, but big books will be more complex to handle. Their ratio will need to be studied more in-depth. The slopes to have will depend on the angle they're doing with the X axis, and they will lead to *much* more tiles just to cope with the vertical offset introduced. That's completely unpractical for the current engine. Another approach of how level map is turned into contents for the video RAM is mandatory to get the effect propagated back into the School Zone, and that won't happen any time soon.

Une horreur pour le game engine actuel

Pas question, donc, de pousser ça dans School Rush. Par contre, avec un game engine qui utiliserait la mémoire vidéo comme un "cache" pour un tileset plus grand, et avec un level editor capable de créer au besoin des versions "déphasées" horizontalement ou verticalement de n'importe quel tile, ça deviendrait envisageable.

Friday, March 31, 2017

c'est rien qu'un jeu.

J'avais été assez surpris d'entendre Nemau chercher à pousser jusqu'à effacer des sauvegardes ou obliger qu'elles soient uniquement sur serveur pour assurer que la permadeath soit effectivement de la permadeath. Outre le défi technique (sorte de course à l'armement entre le hacker et le joueur), je crois qu'il ne faut pas perdre de vue qu'il ne s'agit que d'un jeu. Pas d'un concours, d'un examen ou de la finale olympique.

Some games do permadeath, other don't. Personally, although I never had re-played a specific map of Worms, I appreciated the idea that I'd have the power to bring a exceptionally interesting seed to a friend so that he can experience what I had. Should the game designer start investing time into anti-savestate copy (assuming the span of the game session can be as long as requiring savestate when there is procedurally generated levels) ?

Okay, copying a file is not playing fair, but it's a game, right ? there is no contest, there is no price. If you want to have a contest like a speedrun, the game itself is not quite what you need. What you need are referees, like with any sports. If you spoil the game by cheating against the game rules, why should there be any punishment beyond the fact that you've spoiled yourself the chance of experiencing what the game has to offer ? If the player want that hard to stop the game, restore a file, enter the game again instead of keep playing another game, maybe it means the game fails to provide interesting sessions when you start ? Can you protect against time-machine-like system-wide backup/recovery ? Should you ?



Ça veut dire qu'on doit avoir la possibilité de tricher sans qu'il n'y ait d'autre punition que le fait que le jeu perd son intérêt. Pourquoi préfèrerait-on quitter le jeu, recopier le fichier, redémarrer le jeu plutôt que de refaire une partie? S'il est effectivement désagréable de devoir tout reprendre, c'est peut-être que le contenu généré automatiquement n'est pas suffisamment intéressant. Tu peux essayer de "cacher" le fichier de sauvegarde, mais il y aura toujours moyen de le manipuler depuis l'OS à moins de commencer à utiliser un hardware de sécurité spécifique.

Par contre, une copie du fichier de sauvegarde peut permettre de faire essayer une expérience passée à un copain de passage.

Monday, March 27, 2017

Bamboo Spark to the rescue

J'avais envisagé m'offrir une noteslate pour mon anniversaire. Mais même un an après la date de sortie annoncée dans l'appel à pré-commandes, il n'y a toujours pas de Noteslate disponible. Par contre, j'ai reçu la très sexy et un peu curieuse "bamboo spark". Une tablette graphique nomade et autonome, en somme.

I have a dream of an electronic device that would not hurt the eye. It would be as easy to use as a sketchpad. It might be crude, but it could capture drawn information as naturally as a keyword captures typed information.

I had hope that noteslate would match that dream. I had hope that staedler digital pen would fulfill that dream. I had hopes that hacking code for the cybook would make that dream close to reality. It didn't worked. This week-end, my family gave me a Bamboo Spark unit. Something that captures pen strokes, even when there is no computer around. You just write on plain paper with a modified rollerball pen. When close to an Androïd/iOS device, you can then swap pages that are in the device's memory.

From there on, you can send your notes to different data-sink applications on the phone/pad you have, though unfortunately, with my fairy's pad, twitter and blogger applications don't seem to work.


On trace, ça enregistre. On synchronisera avec un appareil Androïd (ou iOS pour les autres) plus tard. Les traits sont nets, bien plus précis et fiables qu'avec le décevant stylo numérique de chez Staedler, malgré la présence ici et là de "lignes fantômes" que je dois encore retoucher dans gimp. C'est aussi beaucoup plus propre qu'une photo de bloc-note et même que la plupart des scans.

 The result is clearly more appealing that whatever I come up with using a scanner or shooting a picture, but it is unfortunately not yet perfect. First, I cannot crop without downloading the file on a full-blown computer (or maybe I could do that in Androïd's Image Gallery ?). Second, the device introduce random "ghost strokes" that impact readability and better have to be deleted. It's a shame the "draw" feature of the androïd application can only paint white (or black) pixels over the captured strokes, and not delete a stroke as a vector object.

Pour les schémas du type "UML" et sans doute pas mal de croquis d'études, c'est assez chouette. Par contre, peu probable que je puisse m'en servir au bureau pour encoder directement les comptes-rendu de réunion: la reconnaissance d'écriture n'est présente ni dans l'application Android, ni dans l'appareil lui-même, mais uniquement sur les serveurs de chez Wacom. Pas sûr que le boss apprécierait que tout ce qui se dit en salle de réunion termine là... Et pour le contenu du blog, on repassera: la fonction n'est disponible que moyennant abonnement premium :(

If sketching UML documents works fairly well, there is no default handwriting recognition. For that, you have to upload to wacom's cloud and pay the premium subscription to their services. That means the device can't be used as a write-to-report short cut, unfortunately. Not if the meeting whas somewhat private, as any meeting at work would be:


Wacom may disclose all of Your Personal Data to service providers [for data processing, storage and transmission, and other form of support for the application] and to legal authorities [in case wacom believes this is required by law]. Wacom will not sell or disclose your personal data  to other third parties.
I thought I had found a windows application that would allow me to skip the need for a android device at hand (for use in the office, that is), but it is apparently for another device. I also find it strange that it leaks usage information through Google Analytics. The era of Micro Application is so far away ! (in any case, as mentioned in the Inkspace license contract, "You can withdraw your consent by opting-out the use of Google Analytics. The opt-out is available under /Settings/About/Google Analytics/ within the Inkspace App").


Sunday, March 26, 2017

You are Here ...

Bien, j'ai enfin la possibilité de décider dans l'éditeur de niveau d'où va commencer la caméra. Plus besoin de patienter que ça scrolle sur Bilou pendant 1 minute avant de commencer un test. Je pense que je suis officiellement prêt à reprendre le level design sur la dernière phase de School Rush ...

It should now be done with the looong interruption in School Rush level design. Tools are repaired, ready for use. Engine is stronger, too. Hope I won't find another reason to deviate from the objective.
Oh. Maybe you want to know what happened. Well, previously, you had to manually define the start location in the map, and any round trip through the level editor would reset that to top-left corner of the map. Pretty annoying, for a "climb up" level, huh ? That's now fixed. The editor understands which object has the camera focus and rewrites the tiled map initialization lines so that the level is preset at the player's location.

Wednesday, March 22, 2017

Pico8 spacemaze generator

J'avais bien aimé le jeu "spaceman 8", un petit jeu d'arcade pour Pico8 consistant à ramasser des gemmes dans des dédales en micro-gravité. Kometbomb, le développeur, a écrit dernièrement un assez sympatique article sur son blog pour expliquer le fonctionnement du générateur aléatoire de niveaux. Contrairement à un générateur de labyrinthe, il n'est pas souhaitable ici d'utiliser l'entièreté de l'espace, et contrairement à un générateur de donjons, les longs corridors ne sont pas franchement un plus.

Weeks ago, I gave "spaceman 8" pico8 arcade game a try and I quite enjoyed if. You spelunk for gems in a maze-like cavern using your jetpacks and your mental compass.
I loved roughly as much reading kometbomb's blog post on the random level generator they used. It had to be simple, and yet it does a great job at hiding items on a network of interconnected galleries by emulating dwarves digging dirt and stealing each others' treasures.


At each turn, one dwarf will pick a random wall, dit it and hide one of the N items there. Additional rules restrict which wall can be dug, but there is no need for de-speckle or whatsoever. Giving the caverns a chaotic look is then the job of the tileset. Could I replace dwarves by ... Bilou?

Le concept de base est d'avoir N objets à cacher dans le labyrinthe, et de les placer initialement tous dans la seule case vide (au centre de la "mine"). On va ensuite jouer aux nains creuser:
- à son tour, chaque nain choisit un trésor et le vole;
- il une dalle non-creusée voisine d'au moins une (et au plus 2) dalles déjà creusée, creuse et y dépose son trésor.

kometbomb rajoute une contrainte supplémentaire sur la présence de cellules creusées en diagonale de la cellule choisie (au plus une). Une sorte d'heuristique, j'imagine.

Je serais curieux de savoir si ce genre de mécanisme peut s'adapter pour remplacer les nains par ... disons ... des Bilous ?

Sunday, March 19, 2017

LEDS ghost layer

Evidemment, il ne suffit pas d'appliquer le système de gestion des layers à mon programme de chargement. Maintenant que c'est au point, il faut que je convertisse l'éditeur de niveaux, puis ce sera au tour de l'éditeur de sprites et l'éditeur d'animations. N'ayant pas réussi à faire la conversion "d'instinct", je prends le temps de regarder quels sont les éléments présents sur quel layer dans l'ancienne branche de développement.

Introducing a new layers management system isn't useful before tools are converted to that system, of course. I tried the Level Editor first, but it didn't worked as expected -- i.e. the spriteset on the top screen doesn't show up. The best I could get was a weird layer that mimmic the structure of the tileset, but using plain ASCII characters.

Being for a week-end on my former laptop, I tried showing selectively the layers of an older build, and I could have the "ghost" layer appearing when showing BG1_SUB too. Curiously, it also shows when no layer at all is enabled. Let's just work on the hypothesys that the "Emulation > Layers" checkboxes in desume UI invert what is programmed in the picture engine registers, not hiding the layers. As a result, if defaults (or previous) contents of this layer is "use the same map slot as the BG3 (tileset), use the same colors and characters as BG1 (because the ghost layer is obviously *not* BG1, which is the widgets' text). then you get the ghost out of uninitialized registers.


J'avais été surpris par cette couche qui avait la forme des "planches de graphisme", mais utilisant des caractères ASCII 16 couleurs, sur le background #1. Bien sûr, ce layer n'apparaît pas quand le programme tourne normalement, seulement si je coche sélectivement les layers (une technique que j'utilisais tout en jouant à Donkey Kong Country pour essayer de découvrir les passages secrets).

Autre chose intriguante la "couche fantôme" reste présente même quand tous les layers sont dé-cochés. J'en viens à penser que desmume est programmé avec quelque-chose comme "shown_layers = program_layers XOR gui_layers" alors que l'interface laissait supposer qu'on aurait "show_layers = program_layers AND gui_layers". En clair, cocher un layer qui n'a pas été activé par le logiciel qui tourne sur la DS émulée le montre plutôt que de le cacher.

Sunday, March 12, 2017

runMe truly resumed (hopefully)

All of sudden, runMe works as expected again. I have sound playback (missing since 1st of January) and I can use the GUI on the bottom screen while playing on the top screen. I'm relieved, but I can't really feel proud. This is the most silly fix I've done in years. For all that time, I've been linking runMe with the default ARM7 binary instead of using my own "ppp7.arm7" that integrates my modified version of libntxm. Some commands thus had no effect, and others had undefined effect (including likely crashing the ARM7, meaning that reading touchscreen no longer worked).

Tout à coup, runMe re-marche.Et je ne m'en sens même pas fier après cette descente dans les arcanes du système de la libnds. Voyez-vous, j'avais fini par suspecter un crash du processeur ARM7, celui qui se charge de lire la position du stylet dans les puces-esclaves de la DS pour en informer l'ARM9, le processeur principal. Mais aucune de mes théories ne semblait fonctionner. J'ajoute un p'tit embryon de widget succeptible de me dire en temps réel où on en est dans le fichier XM (la musique, pour ceux qui reviendrait de looongues vacances ou d'une rédaction de thèse), et il ne me donne aucune information pertinente ... je branche ddd sur le processeur 7, et il déclenche les break-points n'importe comment, comme si les fonctions s'enchaînaient les unes derrière les autres et ce avant même que main() ne soit appelé.

Jusqu'à ce que je me rende compte que la connexion ddd-arm7 marche sans problème avec SchoolTest et que je sois pris d'un très gros doute: est-ce que je compile bien ce que je crois ? est-ce que j'ai bien dit à l'outil qui rassemble le binaire pour ARM7 et le binaire pour ARM9 en un seul et même fichier (.nds) que je voulais utiliser mon binaire pour ARM7 et non celui par défaut de devkitpro ...
Eh bien non.

Donc si vous me le permettez, je sors chercher un miroir pour me lancer des noms d'oiseaux.

Monday, March 06, 2017

Au coeur de runMe

Okay, basics of getting runMe to run game scripts on emulator is restored. Now let's repeatedly launch script and hit the 'back' button to figure out what's working and what isn't in the mechanisms of the switching.

Bin, puisque j'ai récupéré un émulateur capable de faire tourner runMe, essayons de réparer ce mécanisme de gestion de la config de l'écran, alors. Histoire de pouvoir enfin comprendre pourquoi les boutons se bloquent pendant qu'on joue au jeu ... et de pouvoir à nouveau travailler sur les maps (oui, il y a eu tellement d'interruptions imbriquées que c'est un miracle qu'on ait pas tous été téléportés sur StackOverflow ;)

  • have a color for top screen's backdrop in 'pickWindow' and 'storWindow'
  • [wish] have an 'open' button on storWindow (not only the obscure L+A)
  • [done] reset the scrolling position when returning to GUI windows. -- implies disabling the onvbl handler of InfiniMap.
  • [done] invoke GameLayers::apply() when entering game parsing mode
  • [done] have translucent log in game mode.
  • [done] don't forget to turn off 3D when you're leaving the game mode.
  • [done] restore system colors in extended palettes.
  • [done] replace the digscreen() system of runMe's MetaWindow.
  • [done] make sure I still see logs through the digged screen.
  • make sure InspectorWidget don't try to apply default LayersConfig ^^"
And then, it would be nice if I could force exit ... wait ... isn't "SELECT" bound to that ?

    Saturday, March 04, 2017

    bonus round

    Petit moment de détente, je m'étais amusé à redessiner le premier niveau de Calimero avec les décors de la schoolzone. Même les pouvoirs spéciaux (casser les blocs ou voler) se transposent assez bien. Le hic par contre,c'est que des vies dans tous les sens comme le proposait mon frangin à l'époque, ce n'est intéressant que s'il y a suffisamment de niveaux par la suite ... Ce n'est pas intégrable comme un niveau normal de school rush donc, mais je me dis que comme niveau bonus, ça peut être sympa.

    Look! this is Calimero's first level revamped as a school zone level. Of course, just like that, the interest is limited. Calimero was planned to be a die-and-retry game where you would fail a lot, and therefore featured a lot of risky place where you could find 1-UPs. Many of them at once. Who would want that in a run-and-jump game like School Rush ?

    Well, maybe it would be interesting as a bonus level. It features both "float" and "punch" power-ups where Calimero's level had "break blocks" and "fly" power ups... it could let the player keep them if they're found. But to remain fair (compared to SMB's "collect 100 coins for a 1-UP"), I should make sure that the 1-UPs you collect in the bonus round can only be used in the real game. I should also make sure that being hit means instant death (or actually, been teleported out of the bonus round).

    Pour ça par contre, il faudrait modérer la durée passée dans le niveau bonus, et que ramasser un nombre significatif de vies demande un jeu irréprochable. En provoquant le retour au jeu de base au premier coup encaissé, par exemple. Du coup, je me suis refait une palette de couleurs, hier, pour faire comme si le niveau était dessiné dans un livre plutôt que vraiment réel. Il pourrait alors prendre la place de la "boutique aux power-ups" avec un système où son accès n'est possible que contre des lettres sonnantes et trébuchantes... Un peu comme les niveaux bonus de sonic qui ne s'ouvrent que si on termine avec 50 anneaux.

    Reste la question de l'activation de cette entrée. Je veux que ce soit le joueur qui en décide et qu'il puisse aussi le faire quand il vient de mourir, pas seulement en finissant le niveau. Mais il me faut aussi quelque chose de plus simple vu que le système de chargement des niveau ne permet pas de faire quoi que ce soit en attendant...

    When I first came up with the idea of this bonus round, it was meant to be a secret exit of level 4 before you can enter the final test (the vertical level) of School Rush. But now, I think it could become accessible at any load time (regardless of whether you just failed or beat a level) so that it gives collectible letters a purpose in the game. I'll have to make it technically simpler that the previous "shop" idea, meaning that the player will have to learn *in game* that he can now opt for the bonus round. Meaning also that she will have to decide in game whether she opts for the bonus or not.

    Alors pourquoi pas une plume d'or sur l'écran du bas qui se remplirait au fur et à mesure que le joueur ramasse des bonus et que l'on peut activer en la touchant dès que le quota est atteint? Elle passerait alors sur l'écran du haut, prête à emmener Bilou au niveau bonus dès qu'il en a fini avec ce niveau-ci.

    Tuesday, February 28, 2017

    --load-type=1

    It seems like I finally figured out why I had so much trouble with desmume on my new Linux. It's nice from desmume developers to warn me that DLDI would not work. Maybe it would have been nicer if using --cflash-path had automatically modified the load-type so that the tryPatch wouldn't segv while trying to operate on a NULL pointer...

    Now, I'm ready to resume checking whether my mode-switching code is worth a push.


    Bien ... il suffisait donc d'ajouter --load-type=1 sur la ligne de commande pour pouvoir utiliser l'émulation de carte mémoire avec desmume. Je suppose que j'aurais dû pouvoir le trouver sans faire de back-tracking à partir d'un émulateur en train de planter, mais c'est mon côté guru: plus à l'aise dans les sources que dans la doc.