samedi, décembre 30, 2006

runME pre-0.1

Enfin des bonnes nouvelles pour la programmation sur ma DS. J'ai réussi à porter les routines de détection et sélection de bornes WiFi dans mon le modèle de programmation du Sprite Editor. Grosso modo, ce sont les fonctions de SgStair -- dans son exemple d'utilisation de la bibliothèque dswifi -- mais répartis sur quelques widgets de mon crû plutôt que de s'amasser dans un gros fichier "main.c" (qui me rappelle un peu mes débuts en Basic). Et le mieux, donc, c'est que ça marche.

At last some good news in homebrew coding ... I managed to have the wifi accesspoint detection and selection code working with my own Application Engine (that is, pulling the logic of sgstair's work out of his effective-but-huge "main.c" file, split it more-or-less nicely into widgets and windows, and still have it working.

Au départ, j'aurais voulu intégrer ça dans "DSFTP", mais seul une toute petite partie des sources sont disponibles, et d'après les échanges que j'ai eu avec son auteur, il y a peu de chances que ça bouge. Donc je m'y attelle. Mon objectif ? "runME". Un petit programme tout simple (et ouvert) qui listerait une série d'annonces reçues sur un port UDP pour ensuite permettre au propriétaire de la DS de démarrer un transfert TCP pour récupérer et stocker un des fichiers.

Basically, i planned to do this into "DSFTP" application, but his author didn't released any source and he doesn't seem to consider doing it soon ... so my plan is to work on "runME": a dumb (and open-source) application that will let one listen for "upload advertisements" on a UDP port, report what file is available to the user which then pick it from the DS, connects back to a TCP port on which the raw bytes will be received.

Those raw bytes will then be stored on the DS card and the program will be launched.

Well that's the deal, but for now, my eyes need to relax ... i've typed most of this looking only at the keyboard, and my doctor would probably frown if he knew i did some dev'ing today.

the demo with sources : runME-dec30.tar.gz

mercredi, décembre 20, 2006

chuzzle

Si je devais cloner un jeu de réflexion sur la DS, ce serait celui-là. une grille 6x6 avec des bidules de couleurs qu'il faut aligner pour les éliminer et remplir une jauge. On passe au niveau suivant quand la jauge est pleine, et on a perdu quand plus aucun mouvement ne permet de faire exploser des peluches (3 minimum).

If i was to code a puzzle-game clone on Nintendo DS, i would pick chuzzle. A 6x6 grid full of colorful furballs that you pop in order to fill a bottle and gain one level. Unlike Tetris Attack, you can pop furballs even if they're not aligned, but every move _must_ pop some. Then you get combos, avalanches, super-pops (5 or more) ...

contrairement à Tetris Attack, les peluches ne doivent pas forcément être alignées, mais par contre, un déplacement n'est valable que s'il permet de faire exploser des peluches (comme à Othello/reversi). Si on en explose un carré de 2x2, on a "droit" à un méguzzle (le gros vert), et à un chuzzle "explosif" si on en éclate 5 d'un coup (ou plus) de la même couleur.

The game comes even more addictive with the locks that will come regularly unless you do enough combos/super per minute. There are also mega-chuzzles and rainbow chuzzles. Another thing that makes the game addictive is the high quality of animations: chuzzles wiggle and giggle as you move them or when a match could be done. Their fur is also animated when you drag them around, and the music was a real pleasure to have along. I wish raptisoft get a DS license soon and thing about porting the game ^_^

Si on ne fait que des groupes de 3, au bout d'un moment, des verrous apparaissent, qui bloquent la ligne et la colonne sur le verrou . . .

allez, petit calcul rapide ... pour l'écran 256x192 de la DS, il y aurait place pour des peluches de 32x32 ... Je sais ce qu'il me reste à dessiner ^_^

edit 2009 : eh non. Toujour pas réalisé, mais Plop Invaders s'en rapproche.

vendredi, décembre 15, 2006

Guru Meditation


Grace aux bons conseils sur forum.gbadev.org, j'ai mon premier "Guru Meditation Error" sur la DS ... Probablement une erreur dans le code de la petite bricole que je suis occupé à faire (réintégrer les routines Wifi avec mon interface de 'SpriteEditorDS' pour pouvoir uploader des exécutables sur la console)

Un peu plus verbeux et moins poétique que les messages amiga, ceci dit. Ca ressemble plus à un écran bleu windows, mais en rouge...

pc: 021c6d6 addr:00000000
r0: 0206f7b0 r8:00000120
r1: 0201450f r9:0b003b84
...
sp:0b003ae0 lr: 0201c6d7
Thanks to the advice found on forum.gbadev.org, i saw my very first "Guru Meditation" error screen on the nintendo DS. Most likely a bug of mine in the code i'm messing with (merging WIFI routines with my SpriteEditor's interface so that i can upload data and software on the DS without rebooting or cart-swapping). It's less poetic than the original Amiga message, though ... more or less a Blue-Screen-Of-Death, but with a red background...

You're also offered 10 lines of register dumps (see above) which may (or may not) help you pin-pointing what's going wrong in your code. Well, i won't show it all, even if that could help me later. And for those who wonder, you can check out the bookmarked links below, or just add defaultExceptionHandler() at your convenience in the program (hint: install it on START press rather than straight from program execution so that you don't immediately lose screen content in case of an error).


Et il y en a 10 lignes comme ça. Même si ça peut m'aider pour débugger plus tard, je vais pas vous imposer le tout, hein.

J'avais enregistré les bookmarks pour y arriver sur http://www.blogmarks.net/marks/tag/guru, mais grosso-modo, il suffit d'appeler defaultExceptionHandler(); en début de programme ^_^

Incoming Features for SpriteEditorDS

Deux ou trois choses que je voudrais modifier avant de pouvoir offrir la version "0.1" de mon éditeur de Sprites (et accessoirement, en intensifier l'usage) :

  1. une interface plus conviviale pour sauver son travail, qui indiquerait notamment de quel fichier les images proviennent, et éventuellement les quelques premiers sprites de chaque jeu d'images (A,B,X et Y)
  2. un éditeur de palettes permettant de mélanger des couleurs pour en produire des autres (entrer des codes RVB avec le stylet me tente assez peu), transférer des couleurs d'un jeu d'images à l'autre, créer des dégradés entre des couleurs existantes, etc.
  3. présenter une "liste d'objets" sur l'écran supérieur, dans laquelle on pourrait conserver ses animations, les objets plus larges (tels que l'arbre, par exemple). Le mode gestion sera pour plus tard, mais il devient urgent de pouvoir sauver aussi les objets.
A couple of things that i need to modify before i can release a "0.1" version of my Sprite Editor (and using it more extensively)
  1. a more friendly 'save' interface, showing which file the current dataset comes from, and showing the first few tiles of each dataset (A,B,X,Y)
  2. a palette editor giving the ability to mix colors to produce new ones (no, i don't feel like editing colors with #rrggbb values on the DS), to swap colors between datasets, and to create raster between existing colors.
  3. an "object list" in addition to the tile list, where you can add animations. Compound items will also be 'objects' of some sort. The 'object list' will be kept in the upper screen, and a 'management mode' (for removal, etc) will be for a later release.
  4. save the content of the 'object list' in the dataset.

samedi, décembre 02, 2006

Ready for Rumble ?



Pfiouh. Bin y'avait du boulot ... j'ai bricolé un peu mon DeSmuME pour qu'il supporte les routines de décompressions (en fait, la version CVS de desmume le fait déjà, l'émulateur a été complètement réécrit en C alors que la version que j'avais bidouillée est en C++).

visiblement, le projet est plus actif que je le pensais, mais je n'ai pas trop trouvé comment utiliser le module "cflash.c", donc j'en reste à mon émulateur plein de rustine.

Résultat, après pas mal d'efforts, j'ai enfin le jeu qui tourne (avec mes modifications :P) et ... (roulement de tambours) les modules sont extraits du .nds et chargés sur la carte SD ...

Ca peut paraître génant, comme ça, mais il faut savoir que les transfers DSFTP ont tendance à s'interrompre trop tôt, donc si je peux essayer plusieurs musiques sans toucher au programme, ça ne serait pas plus mal ...

zou. J'ai enfin une bonne nouvelle dans ce projet "apple rumble": non seulement le test tourne dans l'émulateur, mais mon morceau "little flower on the grass" tourne dessus ^_^ Et ce sera "virtual sid session" qui sert de musique pour l'alarme. Voici donc le premier "tetris attack" avec une rangée de blocs qui se cache derrière un tronc d'arbre :P

It seems that the desmume project is more active than i initially presumed. That's both good and bad. Good, because they have the unpacking routines i was missing, and bad because they rewrote the whole code in C (while the version i have is written in C++) and because i couldn't figure out how their new flash-device support is supposed to work.
So after hacking all over the place, i finally have the tweaked-tetris-attack game running on my console, with the songs loaded with libfatdragon rather than just being bundled with the executable. At first thought, that may sound a bad idea, since it makes the game dependent on a flash reader technology, but this is my only chance to have the binary transferred over WiFi with DSFTP -- which seems to hang randomly when the file transfer gets longer or when the signal weakens.

So that's at least one good new for the "apple rumble" project. Not only i can now run it in the emulator (making bug hunts&fixes easier) but i also have the "little flower on the grass" tune of mine played fine during the game and "virtual SID session" played in "danger" mode. So here's a snapshot of the very first tetris attack clone with a column hidden behind a tree ^_^

jeudi, novembre 30, 2006

"swi pô implémenté"

Petite déception ce midi, alors que j'essaie de sortir les modules de tetattds, histoire de réduire la taille des fichiers à transférer par DSFTP.

J'ai enfin compris pourquoi "tetattds" affiche des écrans tout noirs quand j'essaie de faire tourner le jeu. J'avais d'abord attribué ça à un mauvais support de la transparence ou de l'ordre des plans. Bin non. La raison, c'est


PROC 0, SWI PO IMPLEMENTE 00000011 R0:020565F4
Lunch time, mood: disappointed. I'm trying to pick music files out of TetAttDS to shrink the executable size (DSFTP transfers doesn't perform as fine as i'd like). While doing so, i finally got why the game was all black in the emulator... i first thought it was due to a lack of transparency support, or something going wild in layers priorities ... no way. The real reason is "PROC 0, SWI PO IMPLEMENTE 0011 R0:020565F4" ...

Tout de go, comme ça. On ne dirait pas, mais c'est un poête qui s'ignore, le yopyop, à ces heures.

Pour le commun des mortels, ça veut dire qu'il n'y a rien derrière l'appel du "bios" (SWI = 'SoftWare Interrupt') sensé décompresser les fichiers ('zimaginez un peu un PC avec pkzip ou la zlib en rom! puissant, hein) Et naturellement, ça fait un peu rouspéter libmikmod, puisqu'il va se retrouver avec une grande caisse de zéros à la place du mod à jouer.

"DeSmuME works!" qu'il disaient !? ouais, bin ils ont eu de la chance, hein. Bon, bin j'ai plus qu'à essayer de porter les algorithmes de andré perrot (lzssdemo.zip) dans desmume, quoi.

For those who don't speak Yop fluently, "SWI PO IMPLEMENTED" basically means that there is no code behind the firmware call that's supposed to unpack files (yes, the DS and GBA actually have unpacking routines in their 'BIOS'. Can you imagine a PC with pkzip or zlib in its ROM?) ... And of course, this is not to please libmikmod, which will have a full box of zeroes to play where it's supposed to receive a module. "DeSmuME works!" they said ?? well, they were pretty lucky, if you ask me. My last hope lay in André Perrot's algorithms (lzssdemo.zip) for packing/unpacking and move that into desmume codebase.

jeudi, novembre 23, 2006

mario to the rescue

Bonne nouvelle, j'ai réussi à faire fonctionner DSFTP (et donc à envoyer des fichiers vers ma DS sans devoir retirer la cartouche!

Bon, y'a pas vraiment de quoi être fier: j'ai simplement emprunté le jeu "mariokart DS" au fils du concierge, le temps d'encoder les paramètres de mon stick wifi dans le firmware. Ca marche avec ce stick là, et ça ne marchera avec aucun autre point d'accès (et notamment pas avec mon routeur wifi à la maison) ... mais en attendant, ça donne une alternative viable.

Par contre, toujours pas plus de succès avec Artik tik tak, le mod de cette semaine, dont la version 64K continue à planter le player mikmod de TetAttDS '_'

Howdy. i managed to run DSFTP (and thus to beam files to the DS without having to remove any cartridge ...) Well, there's not so much to be proud of: i just borrowed mariokart DS to the caretaker's son, so that it can encode the settings of my wifi stick into the firmware. Way less impressive than if i managed to merge DSFTP with access point detection code as i intended, and that only solves the issue for _that_ specific USB stick (which i hopefully can carry along anywhere), but i won't be able to use the wifi router at home).

Still, i cannot make TetAttDS play the mod-of-the-week, Artik tik tak ... mikmod apparently doesn't like it, not even its 64KB version '_'

edit: j'ai finalement complétement laissé tomber DSFTP. Pas assez de mise à jours venant de l'auteur, et pas de sources pour intégrer ça avec d'autres programmes. Je me suis fait à la place mon petit outil de téléchargement "runme" que je vous invite à découvrir dans la section "mybrew".

edit2: oh, et si vous voulez *vraiment* du FTP et que l'affichage de fichiers .pcx ou la lecture des .mod ne vous tente pas plus que ça, je vous propose de tester le serveur FTP de lilou.

lundi, novembre 20, 2006

Hardware Félure ...

Bon ... pas de pot, mon matériel de bidouilleur DS commence a donner des signes de faiblesse ... juste au moment ou je m'apprétais à passer un petit week-end sympa à intégrer des musiques et des images à moi dans TetAttDS pour le transformer tout doucement en "apple rumble" ... grumble.

Jusqu'ici, pour tester tous mes programmes, je faisais appel à la méthode dite du "cart swapping", qui consiste grosso modo à répéter la séquence suivante chaque fois que je change un bit dans mon programme:

  • éteindre la console
  • retirer la cartouche "supercard" (en bleu sur l'image)
  • éjecter la carte SD flash de la cartouche (en tout petit)
  • insérer la carte flash dans le lecteur USB (en lilas sur l'image)
  • taper la commande "mount /media/ukey"
  • copier le nouveau fichier
  • taper la commande "umount /media/ukey"
  • retirer la carte flash
  • réinsérer la carte flash dans la cartouche supercard
  • remettre la cartouche supercard à sa place
  • ralumer la console.
Autant vous dire que ça prend un certain temps, et que sur 1 heure de développement, je passe probablement bien 20 minutes à ce genre de manipulations (et probablement 10 minutes à passer les écrans d'accueils successifs avant de lancer mon jeu.

Mais pas de bol, dès hier après-midi, mon petit lecteur USB se met à donner des signes de faiblesses ... d'abord il lui faut 2 à trois essais pour reconnaître la carte, puis la situation se dégrade il me faut bientôt une demie-heure de retrait/insertion de la clé USB dans le PC pour pouvoir transférer un seul fichier ... surchauffe ? fragilité mécanique du petit gadget ? va savoir ... toujours est-il que j'ai à grand peine pu constater qu'il y avait quelques bugs dans la bibliothèque mikmod, sans pouvoir vraiment mettre le doigt dessus ... autant dire que le développement va faire une pause le temps que j'aie réussi à faire tourner DSFTP et autres libcartreset
Potentiellement, ça voudrait dire envoyer le nouveau programme à la DS et le démarrer via Wifi, mais pour ça, il faut aussi intégrer à DSFTP le programme de détection de point d'accès ... à suivre, donc.

No luck ... My homebrew hacker hardware for the DS seems failed to work this week-end! Just when i was about to afford an afternoon mixing TetAttDS code with my own background and music data ... It looks like the "cartridge swapping" technique i've been using so far no longer please the small USB device i use to read/write the SD memory card ... Or maybe i've just left it plugged in the computer for too long and it has overheated ? who knows.

What's certain is that the plug-it-in/mount/copy/unmount/plug-it-out 2-minutes cycles i was used to turned into a total nightmare with "device not accepting address" errors in kern.log or things like "read/64 descriptor: error 110" ... Guys in Linux forums seems to say it could be due to a poor USB connection or a bug in a very specific kernel release... well, that smells like hardware failure to me! So it'll be time for me to opt for DSFTP-based technique (using the WiFi abilities of the console to grab a file and write it in the SD card 'in situ') ... which could be much faster, but which also requires me to mix DSFTP with the wifi library test (mainly the code for selecting an access point) as i don't have any game like Mario Kart DS for writing Wifi settings in the firmware memory (and i wouldn't trust a homebrew program to do it for me).

So development of Apple Rumble is frozen so far: all i can tell you is that mikmod library doesn't like Cyborg Jeff's tunes that much X_x

mardi, novembre 07, 2006

Homebrew Attack ...

A small picture of "Tetris Attack DS", a homebrew game by Sten Larsson. And by posting it here, i mainly mean "i love that game". Not only it keeps me smiling while i'm waiting for my fairy to fetch me with the car, but it's open source, running on a DS and featuring the now-famous "mikmod" module player library.

In other words, it has all the logic i need to start doing my own first game with music on the DS (as mikmod supports the .IT (impulse tracker) format my bros. uses to create music).

So stay tuned: "apple rumble" might be coming in the next few weeks ^_^


Un petit screenshot de "Tetris Attack DS", un jeu développé par Sten Larsson que j'aime encore bien. D'abord parce qu'il est bien sympa, que c'est un puzzle (donc, des heures de jeu :), que je peux l'emporter partout et y jouer 10 minutes quand ma fée n'arrive pas tout de suite avec la voiture ...

Mais surtout parce qu'il est libre (traduisez: j'ai les sources du programme en toute légalité), et qu'il utilise la (célèbre) bibliothèque "mikmod" pour jouer la musique et les effets du jeu. Autrement dit, tout ce dont j'ai besoin pour démarrer le code de mon premier jeu sur la DS avec une musique de mon frère

A bientôt donc peut-être avec mon tout premier jeu DS "Apple Rumble" ^_^

vendredi, novembre 03, 2006

no jumping allowed


just a small post to put credit where it is due. A few month ago, we had a post of PadrinatoR on gbadev.org, offering a new way of reading stylus input that would avoid "stylus jumping" (e.g. you draw a continuous line, and what you read has some random stylus presses miles away from the real location).

I wasn't able to completely make use of Padrinator's code (among other things, my way of using stylus input wasn't compatible with his new way of reporting stylus movements), but all together, it worked pretty fine as soon as i disabled a few "extra checks". The basic idea is still that any stylus input that is below a given pressure threshold is ignored.

So thanks for your work, Padri. Without it, i couldn't have half of my pixels half as cute as they deserve to be :P
Petit message de remerciements ... il y a quelques mois, un message de PadrinatoR sur forum.gbadev.org offrait une nouvelle technique pour lire les mouvement du stylet et éviter les "sauts intempestifs" (en gros, si vous traciez une ligne continue, la console 'sentait' des petites pressions un peu partout, même à des kilomètres de la vraie ligne).

Même si je n'ai pas complètement réussi à exploiter toute la puissance du code de Padrinator (entre-autres, il faut changer la manière dont on lit les informations, ce qui n'est pas compatible avec mon programme), l'un dans l'autre, j'ai un résultat tout à fait correct dès que je désactives quelques "tests supplémentaires", l'idée de base étant d'ignorer les pressions trop faibles sur le touchpad.

Merci donc pour ton travail, Padri. Sans lui, je n'aurais pas la moitié de mes pixels à moitié aussi beaux qu'ils ne le méritent :P

lundi, octobre 30, 2006

Bilou .. l'ancien et le nouveau ?

Bion, il y a évidemment déjà eu un jeu Bilou, qui était programmé en QuickBasic pour DOS et qui a finalement fait usage d'une bibliothèque SoundBlaster (oui, m'sieur), même si ce n'était pas du grand délire (juste un son "hihoo" au début du niveau, un "uh!" quand on est touché, et encore).

Alors en grand, vous avez un aperçu de ce que ça donnait ... et en petit de ce que ça pourrait donner avec les nouveaux graphismes (pixelisés sur la DS).

Well, there's been a Bilou game in the past already, as you might guess. It was coded in QuickBasic under MS-DOS in '95 or something ... At some point, it even featured SoundBlaster library (oh, it wasn't truly amazing, you know... just some "hihoo" samples when starting the level :P)

So the largest of the two picture gives you an overview of what it looked like. Bilou in the trees, with the running apple foo and the sleepy bat, and the smallest picture in the corner is the latest mockup of the 'green' level with DS-pixels brand-new graphics.

J'ai encore du boulot pour les "feuilles" de mes nouveaux arbres, notamment parce qu'il me manque des couleurs compatibles dans ma palette pour l'instant (elle vient du jeu "Tyrian", qui ne s'est pas embarassé de teintes vert/jaune :P) J'ai essayé d'appliquer les techniques de Dan, mais il y a encore un peu de boulot avant d'avoir un décor vraiment convainquant.

Oh, et j'avais fait marcher la pomme, aussi, mais ça, c'est pas encore top (et je l'ai effacée par erreur hier, donc je pourrai en refaire une nouvelle :P)

Cette fois encore, le "mockup" fait appel à un zoli (?) dégradé pondu par The GIMP ... 'faudra que j'intègre qqch de similaire pour mon SEDS ...

Okay, okay. there's still job to be done, especially regarding the leaves of the tree. Still, i'm missing colours to do that atm. (the palette came from the game "Tyrian" on PC, which obviously didn't care much about rendering trees :P) I tried to apply Dan's techniques (see "Indigo Art" and the "Cute Pixels" post), but here too, there's much work to be done before the background gets really convincing.
I even managed to have the running apple, but it didn't walked exactly the way i wanted (well, it's deleted in a pick-save-slot error yesterday, so i'll have to restart from scratch with the apple, anyway). Note that, once again, Gimp gradients proved quite effective for the backdrop... i should try to implement something alike to do mockups straight in SEDS.

edit : Vous notez l'appleman primitif et un "bubblebat" endormi dans l'arbre.

desmume -- pype's edit

Okay, i guess it's time for me to release this. Here's the sources of the DESMUME nintendo DS emulator i use for homebrew dev'ing. Original sources are from YopYop, but there was a couple of things i had to fix in order to have something matching my needs.

Among other things, this version will notify you on the stderr that you're accessing some unsupported features (such as layer transparency). It also supports X and Y buttons even in SDL mode (which i found the best when dev'ing as you just have to hit CTL+C to stop emulator.

Last but not least, it is also capable of emulating a SuperCard device (Compact Flash version) -- at least read only -- which might be handy to have if you're doing something that relies on files on a SC device (e.g. using Chishm's FAT library). The 'disk image' for the SC device is passed as the second argument on the command line. If none is given, it's just like if you were running your NDS on a device that has no supercard (or whatsoever flash card. reader) device.

Note that if there's something like extra RAM on the SC device, it's completely missing from this emulator, though.

Have fun with desmume-pype.tar.gz.

Bon, il serait peut-être temps que je le release, lui. Voici donc les sources de l'émulateur DS "DESMUME" tel que je l'utilise pour mes développement. Il s'agit des sources initiales de YopYop (téléchargées en Juin 2006) avec quelques bricoles à gauche et à droite.
Entre autre, cette version vous crachera un message sur STDERR quand vous essayez d'écrire dans un registre non supporté (notamment la transparence). J'ai aussi ajouté le support des boutons X et Y pour le mode SDL (mon favori ;). La keymap est donc: ENTER (=start), BKSPC (=select), E (=a), D(=b), R(=x), F(=y), T(=ls), G(=rs)
Enfin (et peut-être surtout), cette version peut émuler un périphérque SC/CF (du moins en lecture), ce qui peut être pratique pour développer des outils utilisant la bibliothèque de Chishm pour les devices FAT). Il vous faut une image disque (formattée en FAT) que vous passez comme second argument lors du démarrage.

Voilà. Amusez vous comme des tifous ^_^

Note: this is obsolete since the advent of desmume 0.7.3 which has a nice --cflash=[...] command line option :P

vendredi, octobre 27, 2006

PiekTris '06


Mercredi dernier ... peu avant le temps de midi, je reçois un petit mail anodin et sans titre ...

Tiens voila un fichier .BAS
'a l'ancienne'
J'espere que ca te fera au moins sourire
Fais les modifs que tu voudras et envoie les moi

Pierrick.

Alors ça, pour une surprise! Tu parles que j'ai souri. J'en ai encore mal aux oreilles, tiens! 'faut dire que Pierrick, c'est lui qui m'a quasiment tout appris en programmation de jeux! De la boucle "lis une touche - efface - calcule - redessine" à "rajoute un pixel cyan là: ça fera plus arrondi".

Bref, je me mets en quête d'une machine capable de faire tourner le .BAS en question ... un vieux fichier "Microsoft QBASIC". Je verse une larme de nostalgie devant les "GOTO 1500" et je sors mon attirail de développeur d'OS (PC virtuel, image disque de 60 MB) et c'est parti ... J'ai même ressorti une diskette 3"1/2 pour transférer le fichier de mon 'vrai' PC linux au dos tournant dans QEMU :P

Un coup de F5 et je découvre la bête ... excellent! je l'ai un peu testé aujourd'hui, j'ai l'impression d'avoir rajeuni ... Les bonnes vieilles couleurs, la profondeur de champ avec les barres plus ou moins large ... les étoiles, le flash quand on fait une ligne ... tout y est ;)

le hic, c'est que son code n'est visiblement pas prévu pour dans l'émulateur, donc j'ai pas vraiment pu 'jouer' (il faut compter bien 30 secondes pour que l'émulateur se rende compte qu'il y a une nouvelle ligne qui est apparue :P).

Puis ce matin, tout frais dans ma mailbox:
Moi je te conseille DOSBOX v.085 ( je crois )
Ca émule les GRAVIS , les SOUNDBLATERS et l'EMS
Aussi les souris

Bref un bon dos avec memmaker

Cherche la version elle comporte dans sa config un petit fichier bat idéal pour faire tourner les programmes BASIC en fenetré Windows ....

Tu vas te marrer

A plus mon pote ...
Piek.


zou! un coup d'apt-get ... c'est vrai qu'il a l'air franchement mieux pour ça, le DOSbox ... maintenant, je peux même apprécier le son, juste le temps de retrouver une version online de QBasic.

alors, un petit coup de tetris2001NYC.mp3 pour se mettre dans l'ambiance. Et j'attend le prochain "petit caca" de Pierrick ^_^ ... 'faudra que je lui montre mes p'tites productions sur la DS, évidemment...

lundi, octobre 23, 2006

Le mod de la Semaine d'il y a longtemps ...


il y a longtemps ...

Aie ... un autre super jeu porté sur la GameBoy advance ... Il va vraiment falloir que je l'achète, cette petite bombe ... Regardez-moi ça si c'est pas superbe. Des couleurs et des décors à en faire pâlir mon jeu fétiche sur SNES (Pop'n'Twinbee II), une quête immense (comparé aux autres Kirbies qui étaient parfois terminés en 1 heure chrono) avec des switches pour activer les portails entre les mondes, des miniboss qui permettent d'acquérir des super-pouvoirs et ... nouveau millénaire oblige, la possibilité d'appeler les autres kirbies à l'aide de votre GSM (les batteries sont à dénicher un peu partout dans le jeu).


vraiment trop fort: si vous battez le boss à 4, vous aurez droit à une véritable chorégraphie des 4 kirbies avec un grand final ;)

La musique ici est un remake du niveau "blubbly clouds" de "Kirby's Dream Land" (le tout premier jeu en noir & blanc sur la toute première Game Boy qui avait déjà marqué par sa maniabilité, son humour, son animation ... et surtout ses musiques ;)

lien pour télécharger : http://www.ocremix.org/detailmix.php?mixid=OCR00473

et maintenant ?

Ils nous préparent un petit re-kirby sur la nintendo DS (alias Kirby Squeak Squad) qui a l'air terrible également ... Comme quoi, on peut être dessinateur de boules bleues et aimer les boules roses aussi: y'a pas de contradiction.

mardi, octobre 17, 2006

Fury of the Furries

Hop, presto, je vous mets un petit screenshot de Fury of the Furies, le jeu mythique dont je vous ai tant parlé.

Pourquoi ? notamment parce que je voulais voir comment ils ont évité que leurs blocs ne soient répétitifs. Evidemment, c'est pas très représentatif ici, mais regardez donc les grosses pierres, en haut à droite. Certaines ont des "creux" plus profonds que d'autres, certaines sont même carémment brisées.

quick'n'dirty screenshot from Fury of the Furries, the mythical game i've been talking you about again and again ... Why? Because i wanted to know how they avoided that their blocks look repetitive, of course. Okay, i have to admit that it's not that obvious on _this_ particular screenshot. Still, have a look at those big stones in top-right corener ... some have small holes, other have longer scratches or deeper holes. some have even big cracks. Beside the fact that the 'light' pixels are not right on the border, but a slighlty 'inside' of the block (to give a rounded shape), the secret lies in starting from a 'blank' block everytime.

Et le plus fort? c'est du 16 couleurs uniquement. Noir, Blanc, 4 couleurs pour les "ombres" des furry, une couleur magique qui change selont le furry qui est a l'écran, et les 10 couleurs restantes dédiées au ennemis/blocs du niveau. J'avais adoré le look du niveau "désert" (d'ailleurs, le désert de Badman II s'en inspire pas mal).
#e8d088-#ac8850-#704c28-#381c0c pour les blocs (avec probablement un soupçon de 6c5c00 -- l'ombre du furry jaune) et #785cc8-#442ca4-#140854-#140854-#000024 pour le décor bleu...

And you know where it gets truly amazing? that's only 16 colors. True, not one more than in e.g. Commander Keen! Black, white, 4 colours for furries "shadow", one magical color that is re-programmed depending on whether you use red-cruncher, yel-shooter, blue-diver or green-swinger. And 10 remaining are shades of indigo/blue background or yellowish-brown blocks. Knowing that you don't have any more color for the foes and the bonus, i'm impressed by Kalisto's gfx talent.

L'avantage, c'est que les monstres sont automatiquement "dans le thème de couleur" du niveau, par contre, c'était un peu louche de voir la couleur des pièce d'or ou des furries changer d'un niveau à l'autre ...

Passez sur 'alone in the past' pour l'historique complète de la saga Fury :)

running apple

Ca y est, j'ai enfin intégré un "animation viewer" au code du SpriteEditor DS... c'est encore extrèmement rudimentaire (c.a.d. qu'il manque pas mal de tests, de bouttons pour le supprimer/insérer des images ou régler la vitesse de l'animation), mais au moins je peux faire courir la petite pomme que j'ai dessinée pendant le retour de Tour&Taxi sans devoir cliquer rapidement sur les différentes images ...

Amusez-vous donc avec SpriteEditorDS-20061016.
(PS: utilisez "SELECT" pour passer de l'éditeur de sprites à l'éditeur d'animation)

lundi, octobre 02, 2006

Santa Dangerous

En voyage à Paris la semaine dernière, avec pas mal de temps "trop libre" après les meetings/conférences jusqu'à ce que ma fée vienne me rejoindre... j'ai bien un peu fait du design pour un "animation editor", mais pas moyen de véritablement développer sur mon Toshiba dinosauresque exempt de drivers pour la DS ... et sans connectivité Internet à mon hôtel :P

Donc, à la place, j'ai gribouillé des petits sprites, dont une série de blocs "sol" pour la forêt de Bilou (à venir) et également un début de décor pour "Santa Dangerous" (ex 'XMASman-vs-packs') ... Si en plus j'arrive à récupérer les pingouins de Badman III, on va s'amuser comme des tifous ;)

PS: le "mockup" n'est pas fait sur la DS, hein, c'est du cut'n'paste dans the Gimp des sprites réalisés avec DS sprite Editor ...

I was in Paris last week, for a conference & meeting, having too much "free" time before my fairy come to meet me for the week-end... Oh, i spent a couple of hours on the "Animator" design for SpriteEditorDS, mainly in the train, but there's no way i could do real coding on my dinosaury Toshiba Laptop without a proper WiFi connection to my main PC ...

So instead, i scribbled a few background blocks for Bilou's Wood level (to be posted later) as well as some material for "Santa Dangerous" (previously known as "Xmasman-vs-packs) ... If i manage to retrieve penguins sprites i did for Badman III, it might really be funny.

PS: the game mockup isn't done on the DS proper atm: that's just cut-n-pasting of the DS sprites (captured through DeSmuME) and arranged with the Gimp :P

vendredi, septembre 22, 2006

WiFi pour ma carte mère

Roulement de tambour et plein feu sur les poursuites: j'ai réussi à connecter ma DS au reste du monde! Une vraie aventure ... D'abord parce que les réseaux sécurisés de l'Unif ne laissent évidemment que peu de chance à un jeu fait-maison, et également parce qu'aucun des jeux officiels que j'ai ne sont prévus pour se connecter à un portail.

Mais bon, j'avais quelques atouts:
- mon stick USB WiFi Topcom (chip zd1201), qui est merveilleusement bien reconnu par Linux (ubuntu gutsy) dès qu'on télécharge les fichiers firmware appropriés (et qu'on les installe dans /lib/firmware/),
- le concierge dont le gamin a une DS avec Mario Kart (tout à commencé par là, en fait)
- forums.gbadev.org qui m'ont pointé vers "test_wifi_lib.nds"

Donc, première étape: faire fonctionner la clé WiFi en mode "access point" plutôt que "client" ... c'est aussi simple que de charger le module avec "ap=1", ç.a.d.

sudo rmmod zd1201
sudo rmmod firmware_class
sudo modprobe zd1201 ap=1
Comme c'est un peu lourd à la longue de retirer les modules après avoir inséré la clé pour les re-charger avec le nouveau paramètre, on peut aussi éditer n'importe quel fichier dans /etc/modprobe.d pour lui ajouter
#this is in /etc/modprobe.d/wlan
options zd1201 ap=1
Ensuite, on démarre la nouvelle interface avec
sudo iwconfig wlan0 essid "gamerz"
sudo ifconfig wlan0 192.168.6.1 netmask 255.255.255.0
Ca fait bizarre de blogger ça comme ça. A ma dernière conférence, j'y connaissait encore rien à tous ces brols de WiFi, n'ayant jamais joué avec ... De nouveau, on peu règler tout ça dans un fichier de config une fois que ça marche bien:
# add this into /etc/network/interfaces
iface wlan0 inet
address 192.168.6.1
netmask 255.255.255.0
network 192.168.6.0
wireless_essid gamerz
ESSID, c'est le "nom" de notre réseau, que l'on verra dans les outils de détections ... Mettez ce que vous voulez, pourvu que ce soit original ... et évitez "tsunami", tant qu'à faire...

Bon, à ce stade-ci, on peut déjà ouvrir un ethereal et voir ce qui se passe quand une DS essaie de se connecter chez nous ... c'est à dire pas grand-chose... Elle va essayer d'obtenir une adresse IP, mais à moins qu'on ne lui en donne une, c'est rapé. donc, faisons un sudo apt-get install dhcpd (dhcpd, c'est le nom barbare du programme qui donne les adresses réseau :P), et offrons-nous un petit fichier /etc/default/dhcp:
INTERFACES="wlan0"
Seule l'interface wifi doit être listée, évidemment ... pas question de venir offrir une nouvelle adresse IP à votre routeur ADSL ^_^. Ensuite, il faut un peu de config:

# this is /etc/dhcpd.conf
option domain-name-servers 123.45.67.89;

subnet 192.168.6.0 netmask 255.255.255.0 {
option routers 192.168.6.1;
group {
host myDS {
fixed-address 192.168.6.3;
hardware ethernet 00:ca:fe:ba:be:00;
}
host friendDS {
fixed-address 192.168.6.4;
hardware ethernet 00:de:ad:be:ef:00;
}
}
}

Bon, si vous n'avez jamais ouvert le panneau de contrôle pour les cartes réseau, on est mal parti, mais rapidement, 123.45.67.89 est l'adresse de votre serveur de nom. Demandez-le gentiment à votre PC (e.g. "dig google.com", puis lisez la ligne ";;SERVER: 123.45.67.89") et utilisez le même.
192.168.6.1, ce sera l'adresse côté WiFi de votre PC, et c'est lui qui devra relayer les paquets... Les consoles DS auront par exemple les adresses 192.168.6.3 et 192.168.6.4 (oui, tous les numéros en 192.168.*, vous pouvez les reprendre tels quels)

Restent les fameuses "hardware ethernet", aussi connues sous le nom d'adresses MAC ou adresses physiques. Chaque carte réseau (sur un routeur, un PC, une DS, clé USB, etc.) a la sienne et elle est unique. Avec wifi_lib_test de Stephen Stair, il suffira de demander "DS infos", mais avec un jeu comme mario Kart DS, pas le choix: vous devez épier la source des paquets DHCP et reprendre la même valeur.

Si tout c'est bien passé, tapez

sudo /etc/init.d/dhcp3-server start

Et vous êtes prêt à donner une adresse IP à votre DS ... à ce stade, ça vaut la peine de laisser tourner "tail -f /var/log/messages" ou "tail -f /var/log/syslog.0" dans un autre terminal pour voir comment les choses se passent ...

Attention: tout ceci n'est pas sans risque: en suivant tous ces conseils, vous venez d'ouvrir une porte sur votre PC, que des hackers du voisinage pourrait bien utiliser vos dépens. Si vous tenez vraiment à continuer sur cette voie et activer le "forwarding" de paquets par le noyau Linux (et ainsi vous connecter à Internet depuis votre DS à travers votre PC), documentez-vous d'abord sur les firewalls linux, et soyez sûr de votre coup... un filtrage des adresses MAC serait un minimum, mais configurer un firewall proprement, c'est tout un art et ça dépend de votre réseau

sudo echo 1 > /proc/sys/net/ipv4/ip_forward

Enfin, guidedog peut s'avérer bien utile pour vous aider à mettre en place le NAT sur votre PC linux ^_^

mercredi, septembre 13, 2006

fighting with rotoscale hardware

sometimes, you realise you should have put more times reading the specs. That happens with my IXP2400 processor, but also with the NDS.
After the fight-against-blending story, i tried to put the grid of my sprite editor on a "rot/scale" background so that you could opt for 16x16, 32x32 or whatever edition size you prefer (though beside 24x24, i don't see what else we could have). That came just after a slight modification that was intended to fully useable 'upper' screen.

But the result was a rather black stuff. It took me hours of tests with the flash card (the emulator didn't help finding out what was going wrong, as in the blending case) to finally figure out that, while you have 8-bit per tile only on rotoscale layers, you still must write 16 bits at a time, or your access pattern is lost.

Il y a des jours où on se dit qu'on devrait lire les manuels plus en détail. C'est ce qui arrive régulièrement avec mon Network Processor IXP2400, mais aussi avec la nintendo. Après l'épisode "je me bats contre des fantômes transparents", j'ai essayé de mettre la grille du "Sprite Editor" sur un calque zoomable (rot/scale), histoire que l'on puisse aussi bien éditer des blocs 16x16 ou 32x32 ... Et ça juste après avoir modifié le code pour permettre l'utilisation de l'écran supérieur ...

Résultat? Du noir. C'est tout.

J'ai passé des heures à monter/démonter ma carte SD (comme dans le cas de la transparence, l'émulateur n'est pas vraiment utile ici non-plus) pour finalement me rendre compte d'une erreur débile. Même si les calques avec zoom n'utilisent que 8 bits par "tuile", on est quand même obligé d'écrire dans la mémoire vidéo par mots de 16 bits d'un coup... sans ça, les données se perdent :P

lundi, septembre 11, 2006

Cute Pixels ...

Cute pixels from Indigo Art...
I really like how he did amiga-like tiles for a "green level". Just using 32 colours for the whole stuff. Very efficient. The "ground", for instance, is mainly using colors #966d42 and #b68e50 with a "back" colour that has a more "purple" taste: #774953 ... That nicely allows you to do shadows of trees (hidden branches,etc) using #623551 and #392232. Another thing i like much is how the grass is given a "curvy" look by using only two-pixel bar of #c8d551 (yellow green) over #7fbc43 green. The effect is even reinforced using a nice blue-green (#197c3e) for grass shadows (as well as back leaves that can even pick #335955 and #304942). and #f5f08d gives the shiny pixels where grass catches the light a bit more (and there aren't many of them, as you can see...
De biens jolis pixels venant de "Indigo Art" ... j'aime vraiment le style Amigaesque de ces blocs pour une "green zone". Et tout ça sur moins de 32 couleurs! chapeau. Le sol, par exemple, avec deux teintes et un fond tirant sur le pourpre, ce qui donne bien mieux que les teintes habituelles pour les ombres des arbres, etc.
J'aime bien aussi le look "courbe" de son herbe, avec une barre de 2 pixels plus clairs au milieu, renforcé par un vert plus jaune pour les reflets et un vert-bleu pour les ombres...

Maybe you wonder why you've had that many #rrggbb color codes in the previous paragraph? that's just because it's lunchtime and i need to take notes of all those values until i have a "palette editor" for my DS-based "pixel factory" ... Another trick i like quite much is how the ground itself is given is given a rounded shape (thanks to layer transparency, of course), and how Dan Fessler has been using a pretty wide "suspended grass" to break the monotony... I tried something alike to add some snow to castle walls in some blocks of mine a couple o' days ago, but i was clearly using too small patterns, making them "unguessable" for the player.

Ah, vous vous demandez pourquoi tous ces #rrggbb dans la version anglaise? c'est les codes de couleur. On est sur le temps de midi et je prends note de tout ça en attendant d'avoir un éditeur de palettes pour ma DS. Autre chose qui donne bien dans les blocs de Dan Fessler, c'est le look arrondi du sol lui-même (grâce aux pixels transparents) et la manière dont les touffes d'herbes suspendues sont utilisées pour casser la monotonie. J'avais essayé de faire pareil dans le "chateau enneigé" que je dessinais il y a quelques jours, mais apparament, j'utilisait un motif trop petit, et on ne voyait pas de la neige, mais juste des erreurs de dessin.

Note, too, that the whole "ground" pattern is pretty large (40 pixels, actually) ... that makes me thing i was unhappy with the fact the nintendo DS has 8x8 tile size and that most of my previous pixart on the PC was using 20x20 blocs ... since it takes a rather long time to make "good" tiles for ground, etc (i mean, tiles that can be repeated smoothly in both dimensions), thinking all that previous work was "lost" made me rather frowning... but as i was looking at that grass more closely, it just appeared that we had light-pattern repeating, sometimes at the edge, sometimes in the middle of the block ... which suggested the actual block pattern wasn't Nx16 but something more built out of 8x8 tiles directly. And after i counted the tiles, my mind suddenly reminded me i should practice maths in base-10 more often :P 8x5 == 40 == 20x2.

Et si on y regarde de plus près, le bloc de terre et relartivement large (40 pixels). Ce qui me rappelle mes précédents spritesets sur PC (avec le GameMaker) qui utilisait des blocs de 20x20, alors que la DS fonctionne avec des "tuiles" de 8x8 ... Tout ce travail perdu? ce serait trop bête... Alors que si on en colle 2 l'un à côté de l'autre, ça donne 40 pixels, soit 5 tuiles (oui, je sais, je devrais réapprendre à compter en base 10).

There are still two things worth of bloggin about those blocks. First, the grass has a shadow, which suggests it's bushy and falls over the ground. Second, the "ground pattern" itself, despite looking random, is given some inherent coherency by the "tall rectangles" shape...

The general aspect of the map has something else pretty nice. It gives you a depth feeling. I think with a bit of tweaking, we could easily have a Bilou game where you can just "fall off" from one platform to the one below (which isn't actually "below" you, but rather more "below and a bit closer to the player" ... That'd be just more natural than a mario-like level design).

Deux autres choses à blogger à propos de ces blocs. D'abord l'ombre de l'herbe, qui suggère un aspect un peu "buissonneux" et qui retombe par-devant le sol. Ensuite le motif du sol lui-même, qui malgré son apparence aléatoire, possède une sorte de "cohérence" grâce aux formes généralement rectangulaires et verticales ...
La construction de la carte elle-même est assez chouette. Elle donne un effet de profondeur grâce au sol qui devient plus uniforme, ce qui -- avec un rien d'ajustement -- pourrait mener à un jeu Bilou où il est possible de se 'laisser tomber' d'une plate-forme vers celle qui est en-dessous (en fait, pas vraiment en-dessous, mais plutôt "en dessous et un chouya plus proche du joueur. Ce qui est plus logique que les designs "à la Mario" avec des blocs qui flottent dans les airs).

Oh, and before you click on another page, just have a look at those so-amiga-stylish golden coins ... #ffffff:#faf078:#efbb1c:#d07c28:#ab4625 made it pretty well, no. They remind me of "fury of the furries" game ^_^

Et juste avant que vous ne partiez vers une autre page, jettez un oeil à ces pièces d'or si typiquement amiga-esques ... Elles me rappellent 'Fury of the Furries' ^_^

original artwork found on http://www.spriteart.com/indigo/ ...

samedi, septembre 09, 2006

Alpha blending.

Okay, i'm trying to make sense of the alpha-blending bits of the nintendo DS. I'd like a blended grid for my editor ;)

So, let's see the specs first:

4000050h 2 R/W BLDCNT Color Special Effects Selection (BLEND_CR)
4000052h 2 W BLDALPHA Alpha Blending Coefficients (BLEND_AB)
4000054h 2 W BLDY Brightness (Fade-In/Out) Coefficient (BLEND_Y)
Bion. Voyons voir comment marche l'alpha-blending -- c'est à dire la transparence sur les fonds -- sur la console DS (j'aimerais bien pouvoir "estomper" la grille de mon sprite editor, si vous voulez tout savoir). Trois registres jouent un rôle dans les "effets spéciaux" (fade-in/fade-out et blending) : BLEND_CR, BLEND_AB et BLEND_Y. Je suis reparti de la démo Complex2D du devkitpro pour étudier comment ça marche.

You have 3 registers responsible of "special effects", including fade-in, fade-out and alpha blending. The latter one is the one we want (mixing two layers to have one of them appearing "translucent" and seeing the second one through. Clearly, we want it for fogs, clouds, mirrors, ghosts and plenty other reasons ;)

So, let's take the Complex2D demo from devkitpro and spice it up a little bit.

//set up the sub display
videoSetModeSub(MODE_0_2D |
DISPLAY_SPR_1D_LAYOUT |
DISPLAY_SPR_ACTIVE |
DISPLAY_BG0_ACTIVE |
DISPLAY_BG1_ACTIVE );

//set up two backgrounds to scroll around
SUB_BG0_CR = BG_COLOR_256 | (1 << SCREEN_SHIFT) | BG_PRIORITY(0);
SUB_BG1_CR = BG_COLOR_256 | (2 << SCREEN_SHIFT) | BG_PRIORITY(1);
BG_PALETTE_SUB[0] = RGB15(10,10,10);
BG_PALETTE_SUB[1] = RGB15(0,16,0);
BG_PALETTE_SUB[2] = RGB15(0,0,31);
vramSetMainBanks(VRAM_A_MAIN_BG, VRAM_B_MAIN_SPRITE, VRAM_C_SUB_BG, VRAM_D_SUB_SPRITE);

There is two background layers, one being green-checker (BG0) and the other one being blue-checker (BG1). Each checker's "dark" squares are actually see-through pixels (purely transparent), which you achieve with color 0. Moreover, you have the 'backdrop' layer (here a dark-grey colour) that is seen when all pixels of all layers use color 0 (you typically never see the backdrop in a game, for instance).

Dans cette démo, on construit deux damiers, l'un vert (BG0) et l'autre bleu (BG1). Les cases "noires" de ces damiers sont en fait des pixels complètement transparents (couleur #0) et la couleur de fond (le "backdrop" -- que l'on préfère ne jamais voir dans un jeu vidéo) est gris-foncé.

//load the maps with alternating tiles (0,1 for bg0 and 0,2 for bg1)
for(iy = 0; iy < 32; iy++)
for(ix = 0; ix <32; ix++) {
map0[iy * 32 + ix] = ((ix ^ iy) & 2)>>1;
map1[iy * 32 + ix] = ((ix ^ iy) & 2);
}

//fill 2 tiles with different colors
for(i = 0; i < 64 / 2; i++) {
BG_GFX_SUB[i+32] = 0x0101;
BG_GFX_SUB[i+32+32] = 0x0202;
}


So far, we'll use SUB_BLEND_AB=0x1010, which is full intensity for both layers. If one is blue, the other red and that blending occurs, we should see purple somewhere. The initial priority is set to green-over-blue and we slowly scroll the green checker over the blue one. No blending is activated so far.

  • with SUB_BLEND_CR=BLEND_ALPHA|BLEND_SRC_BG0|BLEND_SRC_BG1; we do not change much things, as both layers are used as "blending source" but no layer is definde "transparent".

  • SUB_BLEND_CR=BLEND_ALPHA|BLEND_SRC_BG0|BLEND_DST_BG1; is more interesting. The green checker is still over the blue one, but it no longer "hides" blue pixels. Instead, it mixes with them to produce
    light-blue.

  • SUB_BLEND_CR=BLEND_ALPHA|BLEND_DST_BG0|BLEND_SRC_BG1; and SUB_BLEND_CR=BLEND_ALPHA| BLEND_DST_BG0|BLEND_DST_BG1|BLEND_SRC_BACKDROP appear such as the initial (no destination) blending.


Now, if we swap the priorities (e.g. blue checker-BG1 over green checker-BG0), the first setting (SRC_BG0|SRC_BG1) still show both layers opaque, but now that's (DST_BG0|SRC_BG1) that shows
alpha-blending while (SRC_BG0|DST_BG1) only shows opaque pixels.

In other words:
  • the source layer(s) must be over destination layer(s) to have some blending displayed. that means the priority of source layers should be numerically lower than the priority of destination layers.

  • the source layer is what is going to be translucent, the destination(s) is what is going to be seen through (and yes, i find this rather confusing).

En clair, le layer 'source' doit être par-dessus le layer "destination" pour que l'effet soit visible. Cela signifie que la priorité du layer "source" doit être numériquement inférieure à celle du layer "destination". Et oui, la libnds appelle "source" le layer qui sera transparent et "destination" le layer que l'on voit à travers l'effet. C'est perturbant, mais c'est comme ça.
J'ai parlé de transparence 50/50, mais une valeur 0x1010 pour BLEND_AB correspond plutôt à une composition additionnelle: R = 1*Ra + 1*Rb, V = 1*Va + 1*Vb ... ce qui peut être perturbant aussi. Supposons qu'on veuille faire un nuage ou un fantôme (qui sera donc notre source), on prendra une valeur de 1 pour le multiplicateur des layers-destination (histoire que le fantôme n'assombrisse jamais le décor) mais le fantôme étant du blanc pur, on ne l'affichera qu'à 50%, ce qui donnera BLEND_AB = 0x0810.

Note that calling 0x1010 a 50/50 blending is a bit exagerated. what it means is that you end up with a pixel whose values are R = 1*Ra + 1*Rb, G = 1*Ga +1*Gb and B = 1*Ba + 1*Bb. That may be a bit confusing too.
For clouds/ghosts, you want the cloud-carrying layer to be the source. The other layers should keeps they alpha-blending value to 1 (so that the cloud doesn't "darken" them), but the cloud itself (bright white) should e.g. only affect by 0.5, so that your grey tower appearslightgrey where the cloud is. That leads to e.g. BLEND_AB=0x0810.

The full demo code is available here.
Btw, See also liranuna's witch demo for alpha-blending of sprites over backgrounds.

vendredi, septembre 08, 2006

SpriteEditor DS

Les choses prennent forme. Je peux éditer un sprite avec un outil 'crayon' ou 'block', et grâce au code de la "libfat" de chism & dragonminded, je peux charger et sauver mes sprites sur la carte SD.
J'ai rajouté hier une fonction "copier le sprite" en utilisant un truc venant de SCUMMVM (le moteur de jeux pointer-cliquer de Lucas Arts).

Un pression sur l'écran correspond à un clic simple, alors qu'une pression pendant que le bouton "L" est enfoncé correspond à un "clic droit". Pour la grille, celà correspond à prélever la couleur comme couleur en cours, et sur la table de sprites, à enregistrer la zone de travail.

Things starts getting in place ... i can edit the sprite (of course) using both 'pencil' and 'block' mode, and thanks to the "libfat" code from chishm and dragonminded, i can read sprite tables from the SD flash card and write them back. Yesterday, i've also been adding the "copy sprite" feature, using a trick found in SCUMMVM for DS (the maniac-mansion editor).

When you just click the screen, that's a regular click (GUI_CLICKED event in my engine), and if you click while pressing the "L" key, that's a GUI_ALT_CLICKED. So we now have a touchscreen with "left" and "right" click :P Right-clicking the grid is used to "pick" a color and right-clicking the sprite table is used to "save" the sprite edited.

Oh, and another goodie: just click "beyond" the current table to "extend" it with the newly saved sprite ...

Now the next step will be showing animations and supporting multi-layer sprites (with layer merging).

PS: avant ce post, il y avait mon skyblog. Les messages relatifs à la programmation DS ont été rassemblés dans ce post-anniversaire

vendredi, août 25, 2006

Writing code that works ...

Deuxième petit programme pour la DS ... Hier matin, un peu avant le temps de midi, j'entends passer la musique que mon frère avait écrit pour un jeu jamais réalisé: XMASMAN vs Packs ... un concept de tetris ou le père noël doit empiler des cadeaux qui dégringolent...

A second small utility : picture grabber. It's pre-compiled with a .pcx file that is shown on the bottom screen and allows you to grab parts of the image into tiles for sprites (that moves on the upper screen) and that you can later save on the SD card).
The intent was to speed up porting of my former "pixel art" and do small games ... which never took of. But it was the starting point of "runme", the all-in-one DS-WiFi-PC converter stuff.

J'avais fait des super petits sprites (vous savez ce que c'est, hein, maintenant) avec un chouette programme (Delux Paint II, je l'avais déjà sur mon 8086, celui-là!), et je les ai toujours... alors je me dit "voilà le petit jeu que je pourrais facilement avoir réalisé pour noël!". Il marcherait nickel avec 2 écrans, pas trop még-à-l'eau ni rien. Mais bon, ce serait ridicule de devoir redessiner tout avec le SpriteEditor DS qui n'est pas encore au dixième des possibilités de DP2.

Donc je rebidouille un petit "sprite grabber", un outil qui affiche une image complète et qui permet d'en récupérer des morceaux. Première esquisse sur le temps de midi. Ca tourne dans l'émulateur. cool.
Je reviens le soir @home et ma fée est toujours à Maastricht pour la-journée-ou-les-magasins de-bricolages-sont-ouverts-jusque-21h ... Et je rattaque. A 20h30, j'ai intégré le code de Chishm et DragonMinded, et je fais le premier essai "temps réel" d'écriture de fichiers sur ma petite carte SD.

Et ça marche, les gars! Sortez les cotillons, c'est la journée du code qui fonctionne (après une semaine de combat avec les codes à redondance cycliques de ma carte-réseau-qui-tue qui s'est enfin mise à fonctionner le matin)!

Donc voilà, y'aura encore un peu de boulot pour qu'on puisse choisir n'importe qu'elle image et sauver dans plusieurs fichiers, mais le départ est là ^_^

mercredi, août 23, 2006

Premier Bilou sur la DS

CA y est, les gars. Le matériel de GameLand-Shop.fr est arrivé ... supercard, superpass et lecteur de cartes SD en USB, tout y est! Et bonne nouvelle, mon sprite editor marche presqu' impeccablement (évidemment, avec un design aussi minimaliste, je vois mal ce qui aurait pu foirer :P)

Hahaa! My homebrew dev'er hardware has arrived. Supercard, Superpass and SD card readers. I gave my Sprite Editor a real try and it works! Here it comes : the electronic millimetric sheet for drawing things ^_^. Only one sprite and no saving at this time :P
"Ah, si tu mets Bilou dessus, je veux bien regarder", me disait mon e-papou l'autre jour. Bin voilà, en arrivant chez eux, j'ai redessiné un p'tit bilou sur cette grille-là et je lui ai montré ... "Tu retournes aux sources, là", répond e-papou en voyant le même genre de grille que celui que j'ai utilisé il y a près de 10 ans pour tous mes petits jeux... Bin oui, c'était l'idée ... sauf que je ne suis plus obligé de démolir des claviers en faisant "flèche, espace, flèche, espace, flèche, espace" pour remplir un carré :)

"C'est encore plus un retour au source" que je lui dit, "c'est un peu comme si j'avais une feuille de papier millimétrée intelligente qui pourrait retenir tout ce qu'on dessine dessus ... enfin, sauf que j'ai pas encore programmé les sauvegardes, donc si je l'éteint, j'ai perdu mon Bilou".

dimanche, août 06, 2006

DS SPrite Editor 0.0

Ma fée est en camp pour 2 semaines ... Elle passe par surprise de temps à autres pour récupérer un chargeur ou des papiers oubliés, mais la maison est terriblement vide. Tellement vide que je me suis mis à la ranger, tiens ... pour passer le temps.

" Et maintenant, que vais-je faire ?
De tout ce temps,
Que sera ma vie ?"


Que je lui chantais pendant qu'elle préparait ses sacs. Elle a répondu que j'allais aller travailler, tiens. Pas de bol, c'est le week-end, d'où les rangements. Mais je ne suis pas maso non plus. J'en profite pour bricoler ce petit éditeur de sprites pour la nintendo DS ... Evidemment, pour l'instant c'est pas brilliantissime, mais ça reste (à mon avis) une bonne manière de prendre le hardware en main ... un exemple ? tous les pavés de couleurs pour la grille sont des caractères reprogrammés (256 en tout). On ne sait pas faire ça sur un PC, généralement, mais ici, c'est simple comme bonjour, et ça veut dire qu'il suffit d'écrire la nouvelle couleur au bon endroit pour que toute la case se remplisse ;) Un peu comme si on faisait un logimage avec un crayon qui remplit toute la case d'un coup (à quoi les adeptes du logimage vont me répondre que c'est gâcher le plaisir de crayonner les cases, évidemment :P )

Et je dois dire que l'affichage sur plusieurs calques, c'est vraiment le panar. C'est mon premier sprite editor avec un décor qui n'est pas "uni" ^_^ ... Là, j'avais commencé à y dessiner un bilou, mais je suis partit trop haut et je n'ai pas encore les commandes pour déplacer, inverser, etc.

lundi, juillet 03, 2006

Premiers Tests sur la DS

bon. On y va ... devkitpro réinstallé, les outils "ndstools" et "dsbuild" recompilés depuis le CVS, idem pour les examples (eux aussi repris direct du CVS), cette fois-ci, ça va marcher.

The development kit is installed, and i'm now trying to compile (and make sense of ) the examples provided with the stuff. I'm using Desmume emulator and try to figure out the main mechanisms of the DS (which works terribly like the SNES etc when it comes to 2D graphics) : reprogrammable charset on multiple layers and autonomous sprites. It's really reminding me of my C64, but poke-less.
Et en effet. Je jubile: les premières images créées par un programme compilé localement s'affichent sur l'émulateur DeSmuMe ... S'agit maintenant de comprendre comment tout ça marche. Comme quasiment toutes les consoles (GB, SNES, ...), la DS construit ces images en partant d'un certain nombre de "plans de fond" superposés les uns aux autres (BG0...BG3) par-dessus lesquels seront animés des "sprites" (mario, les goombas ...)

comme il y a deux écrans, et en fait deux "processeurs graphiques" quasiment indépendant, on va retrouver une grande partie des commandes en doubles, ainsi,

videoSetMode(  MODE_0_2D |
           DISPLAY_SPR_ACTIVE |  //turn on sprites
           DISPLAY_BG0_ACTIVE |  //turn on background 0              
           DISPLAY_SPR_1D   //this is used when in tile mode                    );
agit sur l'écran du haut et active une couche de fond (par exemple pour du "texte"), et les sprites. Alors que
videoSetMode(  MODE_0_2D |
           DISPLAY_SPR_ACTIVE |  //turn on sprites
           DISPLAY_BG0_ACTIVE |  //turn on background 0              
           DISPLAY_SPR_1D   //this is used when in tile mode                    );
active l'écran du bas (l'écran tactile) avec deux couches de décors et les sprites... Il faudra ensuite remplir les infos de tous ces petits pixels dans la mémoire video, qui se retrouve découpé en plusieurs tranches:
- le contenu des plans de fond, qui se programment comme un plateau de "Scrabble" : dans chaque case, vous pouvez mettre une lettre -- sauf que dans ce cas-ci, une "lettre" peut très bien contenir un morceau d'arbre, de mur, un nuage, etc.
- les caractères à utiliser sur le plan de fond (c'est ici que vous décidez si on verra un "A" ou un coin de nuage.
- le contenu des sprites (grosso modo, l'image de Mario en BMP)
- le contrôle des sprites: lequel est affiché où, etc.

Tout cela se règle avec vramSetMainBanks, dont le fonctionnement exact m'échappe encore un peu ...

Evidemment, tout comme on avait "videoSetMode" et "videoSetModeSub", il y aura une mémoire différente pour l'écran supérieur et l'écran inférieur: SPRITE_GFX_SUB, par exemple, définit l'aspect des sprites sur l'écran tactile, alors que SPRITE_GFX sert pour l'écran supérieur ... Idem avec OAM (où sont les sprites, écran supérieur) et OAM_SUB (où sont les sprites, écran tactile).

Le résultat en image: le programe "TestTouch" modifié par les soins de votre serviteur pour afficher la "grosse balle rouge" (là où vous avez cliqué) sur l'écran tactile du dessous aussi bien qu'au dessus. Ca ne sert absolument à rien, bien sûr, et s'il n'était pas 23h33, je passerait probablement un peu de temps à remplacer la balle rouge par une bleue avec des yeux ... ce sera pour une autre fois.

Voilà. Désolé si c'est complètement technique et imbuvable. Je suis un programmeur et on ne se refait pas. Déplacer des sprites sans devoir tout repeindre à la main, ça fait 10 ans que j'avais plus fait ça (la programmation vidéo sur PC, c'est vraiment le summum de l'horreur). 'vais me coucher, maintenant. A+

jeudi, juin 29, 2006

Le Boss des Maths

whoaaah! carrément mythique: les premières images du Crayon ... dessinnées par Pierrick sur papier millimétré puis numérisé par mes soins ... j'en ai fait des tonnes, des commes ça ! ...

'faut dire qu'à l'époque, je n'avais pas encore réalisé de "sprite editor", et je n'avais accès à l'ordinateur familial que 1h par jour ... alors tout ce qui pouvait être préparé sur papier était préparé sur papier ... j'ai même retrouvé les grilles qui m'on servi à retranscrire l'arbre qui apparaît dans Bilou's Quest et Bilou's Adventure ... Un dessin 60x60 dans Delux Paint IIe entièrement "imprimé à la main" sur papier (sur feuille quadrillée) avec près de 40 codes de couleurs différents (et les codes RVB correspondants) avant d'être ré-encodés sous forme d'un listing BASIC qui retraçait le dessin pour pouvoir le capturer comme un sprite ... Trois cachets d'aspirine au moins !

Faut dire qu'à ce temps-là, je n'avais pas accès à Wotsit.org et que mes seules connaissances sur les fichiers .ico (et .bmp du coup) avait été acquises au terme d'heures entière de reverse-engineering avec Nowan.

C'était le bon temps :)

mercredi, juin 14, 2006

J'attaque la DS

Ce coup-ci je m'y met: je me lance dans le développement sur nintendo DS. Bon, ne vous attendez pas à du sensationnel genre "Bilou en 3D" ou "Badman IV" ni même un portage de Clicker (bien que ce serait fun).

Finis les grands projets még-à-l'eau: j'attaque par la base. Petits "sprites editors" et autres qui serviront de base. Ce serait déjà bien fun si je pouvais créer et animer des persos depuis mon fauteuil, transférer tout ça sur PC et le ramener dans un jeu plus tard.
En plus, d'après mon expérience sur PC et C64, c'est encore par là que c'est le plus facile d'attaquer: pas besoin d'avoir une tonne de texture et compagnie pour s'y mettre ... Puis je ferai tourner le "tracker" pour DS dessus et je prête la bête 2 semaines à mon frère pour qu'il me fasse une zik ou deux, et c'est parti pour "Bilou Sky Quest DS" :)

Let's go! i'm starting DS development. I don't bother doing large projects such as Badman IV or a 3D Bilou game. This time, let's make it simple first. Small editors for pixeling and animating characters from my armchair would already be a nice starting point. Maybe our "Bilou Sky Quest" shoot'm'up could be a starting point after i integrate a modplayer...


http://www.aaronrogers.com/nintendods/wifime.php
http://www.devkitpro.org/
http://www.double.co.nz/nintendo_ds/
http://www.dsdev.org/

jeudi, mars 09, 2006

souvenirs, souvenirs

J'ai réussi à recréer une image jouable de Bilou en QuickBasic ... en tout cas avec l'émulateur QEMU.

l'ennui, c'est que le jeu se gèle dès que le son est utilisé ... faudra que je cherche un autre émulateur PC...



cj, Posted on Tuesday, 23 May 2006 at 3:38 PM

et faudra que tu me files l'archive ::)

whyme_t, Posted on Thursday, 09 March 2006 at 8:35 PM

Looking good Pype! :) Good work!

mercredi, mars 01, 2006

Forêt Facétieuse

Un petit dessin que je retrouve chez mes parents ... j'essayais en quelques lignes de rendre l'ambiance des principaux "niveaux" de Bilou ... comme d'habitude, j'avais fait la forêt (niveau 1) et ébauché l'école (niveau 2) ...

puis je suis passé à autre chose :P

Ca explique peut-être pourquoi je commence les trucs 3D avec l'école: disons que ça fait 10 ans maintenant que Bilou se balade en permanence dans la forêt ... il est temps de passer à la suite, non ?

mardi, février 21, 2006

#! /bin/bash >/dev/bilou

Toujours dans le cadre de la "school zone", et pendant que Cyril est occupé à modéliser un crayon, je m'essaie à la 3D avec un personnage beaucoup plus simple: BangBash ... oui, vous avez raison: c'est bêtement un point d'exclamation avec des yeux, le genre de perso qui illustre assez régulièrement les articles que je relis ou les rapports des étudiants.

A priori, pas grand-chose à faire faire à un tel personnage, excepté le faire avancer en sautillant sur son point ... ouimaisattends ... dans Unix, les "scripts shells" (ce qui remplace les .bat de windows) commencent tous par les caractères "#!" suivi du shell à utiliser: /bin/tcsh ... /bin/sh ou /bin/bash ...

Ajoutez à ça le fait que "bash" signifie quelque chose comme "coller une mandale au point que tu vas te retrouver scotcher au mur" en anglais et vous avez une vague idée de ce qui a pu me donner l'envie de faire tournoyer "BangBash" autour de son point au ras du sol pour essayer de choper Bilou et de l'envoyer valdinguer au cinq-cent-mille diables (HP -50 garanti)

Plus qu'à déveloper le soft pour animer le perso, maintenant :P

dimanche, janvier 01, 2006

J'ai une DS

Pour l'instant, elle ne me sert qu'à jouer à Mario & Luigi: Superstars Saga, mais j'espère bien pouvoir faire plus ... Avec l'annonce d'un New Super Mario Bros, d'un nouveau Zelda et d'un nouveau Yoshi's Island, ça devenait nettement plus tentant qu'avec un Nintendogs ou un Mario 64 contrôlé au stylet...