Wednesday, October 30, 2013

Fly, you fools!


Fly, you fools!
The way Bilou runs in the anniversary level was emergent behaviour for the given set of rules: it wasn't designed to happen: Bilou has just started to run on its own because no line of code was there to prevent him to go beyond the momentum's maximum speed.

Parmi les retours que je commence à recevoir du niveau-anniversaire, le côté peu pratique du démarrage de la course revient assez souvent. Moi j'avais bien aimé la façon dont il "suffisait" de faire "gauche->droite" dès que je me suis mis en tête "il suffit d'aller plus fort vers la droite" pour parvenir à courir, mais en fait, c'était loin d'être un choix de ma part. En fait, on pourrait presque dire que Bilou a appris à courir tout seul: c'est un un comportement résultant des règles définies que j'ai décidé de ne pas corriger plutôt qu'une fonction explicitement ajoutée dans le système.

Mais pour pouvoir donner une animation dédiée à la course (indispensable pour que l'utilisateur ait un feedback clair avant de faire un saut dangereux) et une façon fiable d'atteindre une vitesse donnée, je dois reprendre le contrôle. Mais comme vous pouvez le constater sur cette mini-vidéo, ça va me prendre un temps de midi de plus que prévu ...

But as I try to make him truly run, with a dedicated animation and such, it looks like he took Gandalf's quote "Fly, you fools" a bit too litterally ...

edit: with InspectorWidget's help, it's now fixed. And with Cyril doing more testing on a built where both "<->" and ">->" making you dash to the right, it revealed that at some point, people will start running when they intend to slightly turn back to avoid collision. That's not only un-intuitive, but dangerously counter-intuitive. I need to get it removed.

Saturday, October 26, 2013

G88 and the sound is gone!

For some reason, slide effect Gxx in music track wasn't played properly. Let me investigate ...

  • ::playRow() checks EFFECT_PORTA_NOTE. It will complain about instruments that change, then, capture the cell's note as "target note" and record the slidetune_speed from parameters. The playing note in the channel remains unchanged, although the "pattern cell" has the new one.
  • ::handleEffects() is for per-row effects. It also process some "volume column effects", but PORTA_NOTE is a "per-tick" effect.
  •  but I have checked that the PORTA_NOTE (effect #3) happens always on the 'regular' column.
  • xmtell.pl confirms there is a note on the cell that has PORTA_NOTE. Yet, when processing the row to setup channel state (including target note and slide speed), the cell mentions having EMPTY_NOTE ^^".
Reason ? The musical cells in an XM pattern may either be stored as is, or packed using a "magic bytes" that indicate which fields (effect, volume ...) are present and which are missing. For some reason, libntxm code was resetting the note to "EMPTY_NOTE" when the cell was stored in plain mode. I'd say there was no chance 0xt0b could debug that properly since he had no effects support -- thus likely only tested modules with no effects (where no cell can ever be "complete", obviously.


Pour éviter des bruits désagréables entre deux notes de la mélodie, mon frère a utilisé assez abondamment les effets de glissé pour enchaîner deux notes sans relancer le sample depuis le début. Mais dans la release d'origine, ces notes étaient curieusement silencieuses. Après pas mal de bourlinguage dans le code de la libNTXM d'0xtob, j'ai fini par me rendre compte que c'était lié avec la présence de "cellules pleines" (avec une note, un volume, un effet et ses paramètres). C'est maintenant réglé, ce qui veut dire que vous avez bien mérité une version révisée du niveau anniversaire.

Now, I have another issue with G00... parameter value 00 for an effect means "same value as the last effect" I used to do that on demand when processing per-tick effect, but for porta-to-note, I need to apply it earlier, when the finetune speed is defined.

So, enjoy g88 revision of the anniversary level.
  • camera control with UP and DOWN dpad directions;
  • improved spongebop bounces;
  • fixed music;
  • fixed crash/stall upon level reload.

Wednesday, October 23, 2013

Some bugfixes in progress

After a couple of days checking the stats, I opened the editors again. I wanted to experiment alternative collisions for Spongebop and improve the readability when falling down. I updated camera control so that UP/DOWN DPAD directions can be used to adapt camera (that was quite simple)

I think I tracked down an unpredictible crash on level loading. The crash only occured when reseting the level just after some droplets (the only object that turns into nil) gets deleted. Engine::delanim() should remove the object from the deleteme list in that case, not from the todo list. I also fixed another potential source of silent random crash linked to the lack of dedicated "you're dead / level clear" tracks :P .


Allez, quelques petites modif's avant d'aller au lit. Le nouveau comportement des collisions avec l'éponge, pour commencer, suivi d'une meilleure gestion de la caméra pendant les chutes (Morukutsu appréciera ;) puis la possibilité de regarder en haut et en bas quand on est à l'arrêt ... c'est toujours sympa, dans un jeu d'exploration.

J'ai du débugging sur la planche, aussi. Certains effets de glissés de la musique ne passent pas, les notes en questions restant du coup silencieuses et une sorte de condition de course logicielle pouvait planter la console si on avait le malheur de changer de niveau juste après qu'une goutte d'encre n'ait été retirée (à quoi ça tient, quand-même!)

I could also point out that the inconsistences in the music comes from module effects to be ignored. They should explicitly be supported! that's a task for ddd and --arm7gdb=7777 ... As soon as I got that sorted out and get the confirmation by early downloaders that the game can be launched, I'll post a fix.

All this reminds me, of course, of the "last minute panic" I got when I tried to enable throw-bladors-anytime (3 days before the release) and observed  curious effects: parsing the second level would then corrupt memory (most likely) and make the level loading impossible. On one of my machine, that made the std::map that holds BlockInfo to have an invalid pointer.
Hopefully, once that bug turned "stable", identifying the root cause was a mere "sherlock holmes game": list all the possible causes for one more state transition to corrupt memory, rule out those that are incompatible with the observed behaviour and you get pointed at a "owned" bitfield that has incoherent value (and still rules which transitions are deleted when).

Tuesday, October 22, 2013

Toujours plus haut!

S'il y a une chose à quoi les éponges de la School Zone ne sont pas encore prêtes, c'est bien à servir d'ascenceur dans "Deep Ink Pit". Plate-forme mobile par-dessus l'encre, ça oui. Avec un bon timing pour s'y accrocher puis sauter, on peut prendre pas mal de vitesse horizontale -- et c'est assez fun. Mais monter, ça ... c'est une autre histoire. Au point qu'aux endroits où il fallait passer d'une éponge à quelque-chose d'autre, j'ai fini par amener la trajectoire presqu'au-dessus de l'objectif, qu'on ait plus qu'à se laisser tomber.

With the anniversary level, Spongebop no longer directly hurts. There binding to a pin can be modified by the player too, to the point I wonder whether I should allow Bilou to carry them along. There's one thing they're still terrible at: allowing you to climb up! Too bad: that's what they should provide in Deep Ink Pit. With training, one can get significant horizontal speed when letting the sponge loose, but if you manage to find an idle sponge in the level, you may have hard time gathering the bonuses that float over it. 

While investigating the reasons, I figured out that the rule that makes SpongeBop "slightly bounce when you land on it" interferes with Bilou's attempt to use bop'd ennemy's vertical speed as an extra bounce impulse: first, the sponge gets a push downwards due to its collision with Bilou and then Bilou's jump strength is defined as default_impulse + other.yspeed. I cannot change that ordering: it is defined by who's active (Bilou) and who's passive in the collision. What can do, however, is to arrange a variable where the vertical speed of the monster is preserved (or an impulse bonus of some sort) and ensure that vertical speed is only used as a booster, never to reduce the impulse.

En fait, j'ai presque tué toute possibilité de rebondir au moment où j'ai ajouté la règle "l'éponge reçoit un choc vers le bas en cas de contact" pour donner un effet plus "élastique". Bilou ne peut du coup plus bénéficier de la vitesse montante de l'éponge pour sauter plus haut puisqu'il vient de lui forcer une vitesse descendante! J'imagine que c'est le genre de couac qui a poussé les auteurs de Frogatto & Friends à construire leurs scripts à grand coups d'expressions-qui-renvoient-des-affectations. Ici, il ne me restera qu'à sauver l'ancienne valeur dans une autre variable de Spongebop pour que Bilou puisse y accéder.

Sunday, October 20, 2013

School level delivered!

Enfin nous y voilà. 3 ans après 'Apple Assault', un nouveau jeu Bilou est sorti. Enfin, "jeu" est excessif: c'est une démo jouable comme vous auriez pu en trouver avec votre magazine PC-Fun préféré dans le milieu des années nonantes. Avec un seul niveau, il n'y a par exemple aucun moyen de reprendre de la vie ni de regagner des vies. J'ai pourtant d'excellents souvenirs de la démo de Prehistorik 2 avec son compteur de pourcentage d'exploration. Nous nous étions donc mis en chasse des dernières plate-formes invisibles et bonus cachés jusqu'à parvenir à un 100%. C'est ce genre d'ambiance que j'ai tenté de reproduire dans le niveau-anniversaire mis en ligne hier.

Looking back at the former releases and the completed todo lists initially left me with some bitter taste: since March, it looks like nothing significant has been achieved and that almost all the features were present in the "usability test demos". Reality is somewhat different. Even the month spent exploring SMW and incentives for "alternate path" was the key to level re-design. There *was* some significant progress on the reliability of my SEDS/LEDS/AnimEDS tools. when monsters are randomly altered after every save, when you have some animation that may disappear under some circumnstances, when the map may be erased by a misplaced click, the odds that you manage to craft a level featuring 20 monsters are weak. Shaping up to 54 unique animations is only possible with some convenient numbering scheme.

Hopefully, those 6 monthes made the tools reliable and the additional month made the level appear. Let's celebrate ^_^.


Et dire que depuis Mars dernier, il me semblait de n'être nulle part, puisque presque toutes les modifications apportées au moteur de jeu dataient de 2012. Et pourtant, du changement il y en a eu: tout ce "rush" sur le niveau-anniversaire n'aurait jamais été possible avec des outils aussi peu fiables que ceux dont je disposaient en début d'année, succeptibles de perdre ou d'écraser le travail accompli à la moindre fausse manoeuvre.

I was concerned about the lack of variety in my tileset. One book here, one binder there ... wooden structure, metallic items, spiky pencils. At the end of the level, I started feeling repeating myself. If a level 2 was required, I'd need more variety, shadows, and such similar things. That's especially blatant in those confined areas where the scrolling background is not visible. Hopefully, I'm not near 80% of tile space as I initially thought. I merely used 50% of the space, because many object got dismissed as "drafts" as I progressed (greyed/translucent areas).

Le niveau dans lequel on se promène tente de respecter le plus fidèlement possible le design d'origine (1994) créé par mon frère, mais remplace régulièrement les "clés" et les "interrupteurs" abstraits par des interactions entre personnages. Par contre, au niveau graphismes, je dois admettre que sur la fin du niveau, je tournais un peu en rond. Pour continuer à construire la School Zone, il me faudra d'autres objets. Et là, soulagement de dernière minute; je ne suis en fait qu'à ~50% de l'espace disponible. Du côté des sprites je devrais pouvoir compter sur le doublement de l'espace disponible (j'utilise 64K sur 128), mais il faudra "expliquer" ça à l'éditeur de niveau.

I will have to do similar cleanup in the "sprites" memory or upgrade to full 128K of sprites (the hardware allows it, LEDS won't like it :P) if I want to have the full set of animations of pendats with pixel art (initially, 3D was planned) or if I want to have spinning sponges once on the ground.

Quite amusingly, many aspects of the monsters behaviour where "hacked" during the release-rush through creative use of the current game engine and level editor -- such as undermining some platforms so that monsters see them as holes while Bilou can indeed walk them -- where I'd have in normal hobby development extended the game engine with dedicated features to support the desired behaviour (such as a monsters-wall that Bilou can move through).


Si je suis parvenu à boucler ce "niveau jouable" en 2 mois alors que je travaille sur la school zone depuis Septembre 2011, c'est entre-autres que je suis passé sur une autre approche: chaque fois que c'était possible, j'ai rusé (par exemple en trouant le sol sous les pieds des Pendats pour leur faire faire demi-tour à l'emplacement souhaité) plutôt que de chercher à étendre le moteur de jeu (p.ex. avec un mur invisible pour les monstres). à retenir.

Et maintenant ? Quand tous les confettis de l'anniversaire auront été balayés? Bien sûr il y aura un peu d'emballage nécessaire pour permettre à mes p'tits n'veux de faire leur propres niveaux: manuel d'utilisation, blocs supplémentaires pour les vies et les soins, par exemple. Sur une autre branche, proposer une réalisation de "Deep ink pit" malgré tout pourrait s'avérer sympa, encore que le concept du jeu n'était pas aussi riche que celui d'Apple Assault. Enfin, il serait temps de s'attaquer à la 3D, histoire de permettre aux crayons de poursuivre Bilou et d'introduire le fameux Bang Bash qui, en février 2006, introduisait le jeu vidéo Bilou dans la blogosphère...

Oh ... et il me faudra un écran "sound test" pour comprendre les effets curieux qui se produisent sur les musiques ces temps-ci.

Saturday, October 19, 2013

20 ans!

Il y a 20 ans, Bilou voyait sa première aventure esquissée sous les crayons de mon frère d'après les programmes CPC de Pierrick. J'ai fait de mon mieux alors pour transformer les "idées papier" de mes ainés en lignes de code et en pixels, mais la School Zone m'avait tenu en échec: le niveau de complexité dépassait ce que mes outils pouvaient supporter, menant peu à peu à la mise au grenier du projet.
Gain speed to break through that pencil barrier.

Aujourd'hui, je prends ma revanche avec ce homebrew pour Nintendo DS qui vous emmène à travers le dernier niveau dessiné par mon frère avec les monstres de Pierrick. Plus vous ramasserez de bonus, plus on vous emmène loin dans le temps...

That's it: the anniversary level celebrating the 20 years of Bilou video game sketching, design and coding is ready to play. At last, Pierrick's ennemies and my brother's level come to life and challenge you to gather all the letters scattered through the chemestry classroom. The more you get, the further we take you back in time. Can you make it back to 1993 ?

A: sauter et rebondir / jump & bounce
B: attraper et lancer / grab & throw
Bilou can run faster if you do a sharp turn back (tap left and slide to the right to run to the right). You can bounce on monsters by tapping A just when stomping them.

Pour courir vers la droite, pressez d'abord la croix vers la gauche puis glissez le pouce vers la droite. Pour courir vers la gauche, faites l'inverse. La "barrière crayon" peut être traversée si Bilou tombe d'assez haut.

Playing on the Real Thing
You need a DS and a linker device that can play homebrew files. With most linkers sold after 2007 (that support DLDI), all you'll have to do is drop the .nds file somewhere on your media card and launch it as any game.

With older linkers, you need to patch the .nds file manually using the driver compatible with your hardware. If your hardware need patching and you haven't patched, you'll see the bottom screen displaying only purple background with the words "NODA!" written in the middle. (and other boot info around).


Playing on an emulator
You're suggested to use desmume and follow these instructions to set the "GBA slot image" as being the .nds file itself. Other emulators (notably iDeaS, patch as R4TF) will require manual DLDI patching (see above). You'll get a better experience with a SNES-like gamepad.

Known Bugs/limitations
Although it's an anniversary, it's also a first release. There are things that are not visually consistent and room for improvement. It was however decided to release early and that those features would be left for future levels/releases.

edit: fix anniversary-G88 released.

Friday, October 18, 2013

9-18 days late

Oct. 9
That's it! level map is complete, monsters are placed and they behave as expected. I have two more "special blocks" to define for horizontal pencil spikes (83) and level exit (21). We can break through the "pencil barrier" that lays between the upper and the lower part of the level. Pencils are not the best item here, but I haven't found something that would make more sense. Maybe something made of glass ?

Now the focus shall be on the glu code that will make SchoolTest being more than a test, but something that looks like a playable level.
 
Oct. 12

Don't expect anything before 16th of October: IRL interference. However, the welcome screen is now ready, and I have good basis to invite you to progress in the level :) If only those ink droplets could be made more ... visible...
... moving some ground tiles on the BG layer, maybe ?
^^"


Oct. 15

Final touches here and there to make sure there is no hidden trap or non-working bonus. Rewards picture render better and ***drumroll*** I gave the soundtrack a first (successful) test. You should get a release end of the week.

Oct. 17
Fixed a "last minute panic" bug, allowed Bilou to throw Bladors even when jumping or walking and reverted bonus to latin script. I'd say it is mostly done. I'm essentially waiting for CJ's (or Πk's) soundtrack... and I still have to realize the "howto" background to explain how to grab and jump etc.

You may expect the release to take place this week-end ^_^


Oct. 18

Everything you need to know gathered on the welcome screen. The rest is to be learned by playing. I hope that doesn't make it too cluttered.

Meanwhile, my brother sent me a nice tune to populate the soundscape. I'll integrate that and release tomorrow.

Tuesday, October 08, 2013

8 days late

Took yesterday evening preparing material for the "achievements" (or so). Blador is now bound to button B and HOLDing one prevent you from RIDing inkjets or spongebops, just like grabbing one's legs to DUCK prevents Fire Mario from SHOOTing fireballs.

If I find some time tonight, I really should spend it on making that hole in the desktop break-able only when Bilou has sufficient vertical speed.


Après une petite soirée passée à vous concocter de petites récompenses pour les plus assidûs d'entre vous dans la chasse aux bonus, je revois suite aux commentaires de Cyril la manipulation des dumbladors. Pour ce soir, ce sera (enfin?) le bouchon-à-casser pour passer d'une moitié à l'autre du niveau.

PS: si ces minis-posts permettent mieux de maintenir la tension avant le lancement du niveau, ils sont par contre nettement moins efficaces pour progresser sur le projet. Pour les outils et les modifications dans la libgeds, je garderai des posts-todo aux ré-éditions multiples faisant le lien vers les diff du svn ...

Monday, October 07, 2013

IPv4 deprecated [options]

Some of the Internet Protocol bits have turned History in last November, without making much noise, afaik. Long ago when I started working in the RUN team, I was impressed by the amount of options described in the IP and ICMP protocols. There was so much a loose source-routing combined with route-record options could do.
I was quite puzzled then to see how many active/programmable networks papers would claim “we propose the following shim layer header between TCP and IP because using an IP option …”. Yes, the protocol claims ‘options’ are available, and yet, packet carrying such options were already second-class citizen in 2001, receiving only slow-path forwarding. Nowadays, they’d likely be dropped altogether by some security/performance middlebox at some point before they could reach their destination.
Well… so is the Internet. At some point, bright ideas converted into RFCs need to be turned into transistors or line of code. At some point, someone will say “no way: we can’t afford the chip that will support any memory alignment for the TCP header. If it’s not appearing 20 bytes away from the start of Ethernet payload, we’ll dispatch the packet in a queue for software processing. Period.” And the person responsible for chip design will know that he might have to find another job if the future customers think the forwarding rate is lame.
So between things that couldn’t be made efficient, those that were supplanted by wider protocols (DHCP vs. ICMP Information Reply (Type 16)) and those that never actually made it to the Internet (IPv6 Where-Are-You (Type 33)), possibly due to potential security issues (Domain Name Reply (Type 38)), https://tools.ietf.org/html/rfc6918 does not really surprise me, although it’s a bit disappointing to see hours of agreement process turned into “not widely deployed” with no apparent effort to explain why features didn’t took up.
The companion “deprecated IPv4 options” RFC mostly mentions things that were introduced to support experimental side-kick protocols, related to multicast, quality of service, etc.

Sunday, October 06, 2013

6 days late

I have level design for the end-of-level sorted out. Blador interaction with other monsters is completed, why-pencils-dont-hurt question is sorted out. RunME is resumed, the level map is 80% complete (it could use some variations, but the basics are present). I still need to ensure that RectoVerso turns back when encountering a wall while jumping and check the design of the bonus rooms.

That-hurts-stars instead of wandering feet when Bilou get splatted by a RectoVerso eraser would also be better.

Friday, October 04, 2013

4 days late

No time/energy for spriting or coding today ... not even mere GobScript'ing. I just barely managed to revise the end of the level ... Hopefully, I now have good ideas (imho) for the bonus cave and the "end of level unlocking".

Pas de panique, cher lecteurs francophones moins à l'aise dans le monde du Cheick Spire: je n'ai pas l'intention d'abandonner les posts bilingue. Il se fait simplement que je trace pour avoir un niveau jouable (et intéressant) dès que possible ... et pendant ces 2 minutes où je vous raconte tout ça, eh bien je n'édite pas mes petits scripts pour faire en sorte qu'on puisse décrocher l'éponge de son clou ...

Thursday, October 03, 2013

3 days late

Both pendats and verso may be stunned with bladors, although the feedback is very minimal right now (but funny). I fixed the "inkjet teleporter" issue and I'm trying mostly-harmless spongebops.
Yet, I don't like *at all* those "aouch, ZLIST errors" message I get now in runme >_< (the fix for 130 OAMs in runME wasn't propagated to the svn ^^") ... good news is that it only happens with RunME (again!)

I also got my concept sketch for the welcome/tutorial screen and a nice idea to motivate players to hunt for the bonuses hidden in the level.

Wednesday, October 02, 2013

2 days late

Making sure Blador can be used as a weapon, cleaning level ... that shall be done. Quite amusingly, the fact that a testpoint is still needed for monsters because they will FAIL to walk on ground only when they've advanced *past* the last pixel of the structure they're walking on also means that I can set a second test point *deeper* in the ground and force the monster to turn back before encountering "fragile" ground that is only 1 solid-tile-high ... or as in the case of the introductory pendat, artificially introduce "fragile ground" here and there to confine him.

I located and fixed the root cause of "disappearing monsters due to excessive load on the GPU", which was actually only present in runME, and not in the game engine or the game data ^^".

If I manage to find some time tonight, I shall code the reaction of pendats and rectoverso to thrown bladors. Is Cyril right thinking that a Spongebop shouldn't hurt Bilou ? Give me your feeling on the poll before the demo is out!

Poll Outcome: 100% (4 person) voted for SpongeBop that doesn't hurt, but merely bops you away.