Tuesday, June 29, 2010

easy - *normal* - hard

Sur pas mal de points, je me retrouve dans la "philosophie du jeu de Locomalito". "Fun for a while, not entertainment for a long time" (chaque minute de jeu doit nous impliquer totalement), "Ingame secrets and optional stuff", "Free indie developers makes games for love" (un peu comme les dessinateurs du Gang Mazda), voire même "Difficulty and glory !". Mais il y a quand-même un point sur lequel je bute:

I think every game should have a single level of difficulty, according to the situations in it. For example, the end of an adventure game should be reserved for adventurers, the end of a war game for warriors... so a player can feel he has beaten a game thanks to his own skills and likes.


Celà suppose que tous les joueurs ont déjà acquis la maîtrise de leur pad et cherchent juste à s'essayer à de nouveaux challenges. Je me souviens du message de Prehistorik II "désolé, l'accès au chateau (et donc au boss final) est réservé aux joueurs confirmés. Revenez en mode "normal" (ou "hard" ?) et on en reparle. J'ai donc refait le jeu à nouveau, bénéficiant de la connaissance que j'avais des niveaux ... Si j'avais dû attaquer directement le mode "normal", c'était sans espoir!

Prenons Super Princess Peach. Jeu sympathique, mais au challenge limité. Peu probable que je le reprenne avant des années. Giana Sisters (version C64) me demande une maîtrise, et par son mécanisme de bonus, donne du sens au parcours répété des premiers niveaux: il faudra faire un "sans-faute" sur les 10 premiers pour bénéficier d'un atout pour court-circuiter la difficulté du no 11.

I agree with most of Locomalito's indie philosophy of games. There's just one thing ... Locomalito seems to assume that we're skilled and trained already. I can name games that have only one level of difficulty and that made it wrong -- Super Princess Peach, because that level is "I haven't played a lot of platformers so far" and Megaman for Wii (or Toki arcade) because its difficulty is so insanely high that you wouldn't make it to the first half-boss unless you've already cleared one game of the Megaman series. And I certainly needn't to name game that have multiple difficulty levels and that made it wrong, for instance because you need to beat the game in easy mode first to unlock hard mode (if easy mode is boring for you ...). Kirby's Dreamland (GB) imho did it the wise way by showing the player the cheat code to access hard mode once he beat the easy game. Will you get your hand on a lost cartridge 20 years later, you can try the challenge again.

Now he also said "the war game is for the warrior to complete, not for the ranger". Basically, that echoes Prehistorik II setup (for PC) where you'd be denied access to the last castle unless you're in hard mode. You just have a "happy ending", but you know you missed something. The thougher part of the game design then is to avoid blatant repetition of the experience of levels 1-N so that you can at last reach boss level N+1. Both Rayman for PSX suffers this design flaw, where you'll face a door requiring you to crawl some basic levels again and hunt for the last electoons. Same for Princess Peach and her toads. I don't remind of anything in the game experience warning me about this. At least level design of princess peach ensures you can focus on the missing toads when replaying the levels.

His claim also doesn't match games such as 'Maestro: Jump in Music' or "Soul Bubbles" where we're all newbies because of the innovating game mechanics.


Le petit Kirby's Dreamland (GameBoy), premier jeu de plate-forme que j'ai terminé, a une difficulté pour débutants: un joueur confirmé pourra atteindre le boss final en moins d'une heure. Après avoir mis une raclée à DeeDeeDee, un petit "v+select+A" me permet de choisir le mode "hard" ... où je n'ai toujours pas réussi à dépasser le 3eme monde, si ma mémoire est bonne. Résultat: à chaque occasion, j'y retourne. Même constat avec l'excellentissime "Maestro: Jump in Music" dont le niveau "easy" m'aurait laissé sur ma faim ... A ceci prêt que dans le cas de Maestro, les niveaux sont à peine reconnaissables d'un mode à l'autre. Mettre uniquement le niveau "normal" (ou hard) dans Maestro aurait provoqué un bide: dans ce style de jeu, nous sommes tous des débutants. Ils sont loins, les temps où on s'acharnait sur un Toki trop dur simplement parce que c'était le seul jeu à la ronde: le jeu doit à la fois offrir un défi consistant, mais aussi permettre au joueur de se faire la main. Mettre les deux dans une seule trame (et donc obliger le joueur confirmé à traverser 10 niveaux de tutoriel avant de commencer à être mis au défi) n'est certainement pas la bonne manière de faire...

PS: As you can see, *my* philosophy of game design isn't settled yet. I'm not sure I've been consistent in my rambling

Friday, June 25, 2010

Thumbs up for Hydorah

I haven't played Hydora, yet : that will be within 12 minutes when downloading is complete if my emulator feels so (yep, I'm a Linux user ;). Meanwhile, I had a look at Locomalito's "making of" document, which I enjoyed a lot. It's very fun to see how others organise a pet-project like this -- I mean, a passion-fueled one, not how you should have a art manager, a level designer, a team of beta-testers and blablablah. ^_^

Long live indie games !


Bion, je n'ai pas encore joué à Hydorah, qui n'aura fini de télécharger que dans 12 minutes, mais je suis déjà fan. Entretemps, je dévore le "making of" de Locomalito ... une initiative très sympathique qui me permet de découvrir la passion du jeu vidéo partagée par d'autres... Les petits carnets de croquis et tout ça ;)

Thursday, June 24, 2010

Level 1 2 3 1 2 1 0 -1 ?

something pretty strange occured while I was giving "monster = level * 5" a try last week-end. Despite I incremented level number everytime the level script is executed, the "level counter" was going crazy, returning to 0 ... And I'm pretty sure I'd have ended up at level -1 if there was nothing in the engine to keep counters positives. A little more investigation today shown a "report debug" instruction to have been misinterpreted into "decrease counter 0" in the handling of head-ceiling-jump collisions ... I feel ^^", but development can be resumed.

Il y a des jours où on ne se sent pas très fier de ce qu'on a codé. C'est le cas quand je vois que mes soucis avec le compteur de niveau viennent d'une "bête" faute entre la commande "décrémente le compteur" et "débugging : affiche-moi l'expression en cours" ... Le côté "je code la nuit quand les monstres sont au lit", sans doute ... D'un autre côté, ce n'était pas un débordement de tableau. Bref. Tournons la page et continuons d'avancer sur le projet "Apple Assault" ... plus que 6 jours avant les "vacances d'été".

Friday, June 18, 2010

Yoshi's Island -- la partoche

Argh. Je suis tout seul à la maison et il faut changer le lange de *deline ... Je m'embrouille ... Je pagaille ... elle se met à pleurer ... AAaargh ... cerveaucerveaucerveau ... bébé pleure. calmer bébé. yoshi. toum toum toulou toum.

C'est plus ou moins ce qui s'est produit il y a un peu moins d'un an de ça. Comme elle adorait, je me suis entrainer à le jouer à la guitare. Encore et encore. Comme Internet trouvait que s'était bien, je me suis décidé le week-end dernier à retranscrire mon arrangement. Have fun.



You've asked for it, you've got it now. My spanish guitar arrangement for Yoshi's Island theme. Have fun and enjoy

Thursday, June 17, 2010

monster_speed = level ;

Ce week-end, petit passage chez Piek -- le "père biologique" de Bilou -- pour découvrir son nouveau "studio" et faire des risettes à sa nouvelle petite puce. L'occasion aussi de lui présenter le gameplay de mon "Apple Assault en gestation".

"Whaa! C'est mortel, comme jeu" me lache son bonhomme de 5 ans, pourtant déjà bien entraîné sur les manettes. Piek explique donc patiemment que c'est normal, que c'est un développement en cours. Au début, un jeu vidéo, on tâtonne, on bricole, jusqu'à ce qu'on ait trouvé les bon règlages. J'oppine du chef et je plussoie. J'explique que là, ce serait plutôt le 3ème ou le 4ème niveau. 42 pommes à dégommer avec 5 points d'énergie, c'est un peu hard quand-même.

I went to visit my friend Piek last week-end, who's the initial author of Bilou character and showed him the in-progress version of Apple Assault. His 5-year-old boy immediately wanted to give it a try, but frowned at the difficulty of clearing those 42 applemen without bumping into deathly Funky Funghies. As I was explaining that I still have to tune the game's difficulty, Piek suggested a more arcade approach: every level you beat increase how many applemen you'll face at the next one and decrease the delay between the appearance of two applemens. I'm now trying to map that on my GOBlang script, but it definitely sounds more appealing that a lame 5-levels minigame.

C'est alors que Piek me propose une idée séduisante: laisser la difficulté augmenter avec le nombre de niveau passés. C'est à dire, ne pas simplement définir 5 niveaux avec une difficulté qui augmente progressivement, mais plutôt

  • map = levelmaps[level%nbmaps]
  • apples_nb = level * A
  • inter_apple_delay = B - level * C
etc. "Comme ça, tu peux voir jusqu'où tu sais aller. Même les tests sont fun. Tu peux passer la console à un pote en disant: 'Je fais 5300 points. Essaie de battre mon record'", ajoute-t'il. Il faudra que j'essaie, en effet. Ca a un côté "pacman-esque" sympa, plus que "j'ai réussi à expédier 10 pommes avant d'être Game Over".

Suivant l'esprit "Another World", ce genre de mécanisme collerait assez bien aux "compteurs" qui me servent à gérer l'énergie de Bilou, les pommes d'un niveau, etc. Du moins, à condition que je puisse définir leur valeur avec une expression, et pas uniquement avec une constante. Heureusement, la lecture des scripts est maintenant suffisamment avancée pour que ce genre de modification puisse avoir lieu sans trop d'arrachage de cheveux.

Wednesday, June 09, 2010

Hop! Une arène ! Yeah !

Et voilà le futur niveau 1 de "Apple Assault". Cette fois, mon éditeur de niveau est de nouveau d'applomb (toujours sans les monstres, mais peu importe).

At last, the level editor is back on track, and I could sketch up the first level (single-screen) for Apple Assault. Stay tuned!

For more details, just check out the comments and stuff on the last todo list.

Tuesday, June 08, 2010

Animeds

As soon as I've got Apple Assault running and my level editor "repaired" so that we can toy with monsters despite the new "file-scope" state numbering, the next big thing I'd like to work on is the animation editor extension to SEDS.
So far, animation edition is pretty crude: you just push frames by clicking them on the sprite sheet, and you can't modify them afterwards. Plus, you can't save your work for later use in a game.


Le prochain "gros morceau" pour l'édition de jeux sur la DS, ce sera l'introduction d'un "véritable" éditeur d'animation. Enfin, dès que j'en ai fini avec Apple Assault et que LEDS est réparé, bien-sûr. Parce que si SEDS est déjà capable de donner un aperçu d'une animation, il faut bien avouer que devoir tout recommencer au moindre faux-pas est moyennement intéressant. Et qu'être incapable de sauver son travail le cantonne au rôle "d'outil de validation" pour les graphismes en cours.
Pourtant, le workflow de base restera le même: une fois qu'on s'est choisi la spritesheet avec laquelle on travaille, on ajoute des étapes à l'animation en cours en cliquant sur les sprites sur la droite de l'écran.

I've toyed with a lot of concepts around "animeds", which most likely explain why it's only 5% done so far. But this last one seems to work better. It keeps the basic of the current system (click a sprite to add it as a frame), but it builds a timeline representation where you can do additional manipulation. I used the animated apple bonus as an example:

  • click a frame on the timeline to select it
  • L-click somewhere on the time line to move it there
  • select another frame,
  • move it as well.
  • click the "time arrow" to adjust the whole animation duration (and scale delays of every frame accordingly).
And that's just for the basics. From then on, being able to store the animation list in the .spr file rather than being part of the .cmd file will be a major improvement in how I build new monsters.

Pour pouvoir gérer et retoucher tout ça, il faut que j'ajoute un widget "ligne du temps" sur lequel il serait possible de déplacer les étapes d'animation pour ajuster les délais. Accélerer et ralentir l'animation complète peut aussi s'avérer intéressant. "Historiquement", les animations sont stockées sous forme de commande texte parce que je n'ai pas voulu introduire de dépendance trop forte entre le moteur de jeu et l'éditeur. Sans doute une sage idée compte tenu des "condloop" et autre "move 2 *" qui sont venus se rajouter par la suite. Je ne vais donc certainement pas essayer de produire des GobAnims[] dans mes fichiers .spr, plutôt une version "lexèmisée" de l'animation avec une liste de constante et une liste d'instruction à traiter conjointement pour produire ces GobAnims.

I also need the opportunity to duplicate/kill a frame ([+ X] buttons depicted below as (3)); undo a deletion (the little x at (5) can be clicked to summon a frame back to life)

The most challenging aspect, I guess, will be to include engine-related features such as conditional loops (loop the animation only if testpoints are satisfied), the use of "spatial timeline" rather than "temporal timeline" (yeah, that's an odd concept, but I don't see how to phrase it differently :P)

And then, finally, I'll have to include that so-long-delayed composed -- à la Rayman --animation that was present in the BASIC version ^^"


J'ai quelques idées pour avoir une représentation graphique efficace des opérations telles que "copier une étape, supprimer ou récupérer une étape supprimée", etc. Ce qui sera plus complexe, ce sera justement de prendre en compte les boucles (conditionnelles ou non) et les déplacements (en ajout comme en remplacement des délais)... Je me demande dans quelle mesure il serait possible de garder cet aspect-là dans le .cmd, tiens.

Monday, June 07, 2010

Laissez tomber GCJ, les gars.

sudo ln -s /usr/lib/jvm/java-6-sun-1.6.0.17/bin/java /etc/alternatives/, c'est tout ce qu'il y a à dire. J'ai facilement perdu 2 heures vendredi dernier, à chercher dans le code de mes étudiants un problème qui se trouvait clairement dans les bibliothèques Java qui accompagnent la JVM "gnu", le "choix par défaut" d'Ubuntu Lucid Lynx. Et là, je regrette, les cocos, mais ce n'est absolument pas lucide.

java.util.Scanner[delimiters=\p{javaWhitespace}+][position=372][match valid=true][need input=false][source closed=false][skipped=false][group separator=\,][decimal separator=\.][positive prefix=][negative prefix=\Q-\E][positive suffix=][negative suffix=][NaN string=\QNaN\E][infinity string=\Q?\E]
java.lang.NullPointerException
at java.util.regex.Matcher.toMatchResult(libgcj.so.10)
at java.util.Scanner.myCoreNext(libgcj.so.10)
at java.util.Scanner.myPrepareForNext(libgcj.so.10)
at java.util.Scanner.myNextLine(libgcj.so.10)
at java.util.Scanner.hasNextLine(libgcj.so.10)
at Flux2.getRadioMetaData(Flux2.java:237)
at Flux2.connect(Flux2.java:214)
at FluxFeeder.run(FluxFeeder.java:21)
au énième appel de hasNextLine sur un parseur a priori impeccable, mais qui est simplement arrivé au bout de la chaine sur laquelle il travaille. J'aurais volontiers fait un vrai "bug report" aux responsables de la maintenance de la libgcj.so.10, mais on dirait bien que la politique d'Ubuntu s'est encore dégradée à ce sujet. Non content de répondre régulièrement "ah oui, on arrangera ça dans la version suivante" lorsqu'ils ont choisi une version incomplète ou buggée d'un programme mais que des correctifs existent chez le développeur (j'en veux pour preuve ce problème dans desmume), même lorsque la distribution affectée est une Long Term Support.
Enfin ... on va essayer quand-même.

May the Source be with you

La saison des examens bat de nouveau son plein. Peut-être certains d'entre vous sont-ils encore étudiants ? Dans ce cas , bonne M. "may the Source be with you". Moi, ça va plutôt être lecture, correction, relecture, surveillance et re-correction. Peu de chances de voir les choses bouger sérieusement d'ici fin juin, mais au moins, tout une série de choses ont été réglées dans la VTJ. De plus, me voici arrivé dans mes lectures-hobby à l'endroit précis où j'avais laissé le roman Autremonde en attente... tous ceux qui ont bouffé du Harry Potter savent qu'il est difficile de poser un roman pour passer à autre-chose quand on ignore ce qui attend les héros pour la suite. Il me brûle presque dans la poche de mon falzar.

Allez, A+. Il est temps que j'attaque la journée de boulot.


Hello, English readers. I'm afraid it's a pretty busy time. Examinations time. I've got a pile of reports to review and some more that are yet to appear on the pile ... Probability of seeing translations or bilingual posts is pretty low, but it should rise again when July will come out. See you.

Thursday, June 03, 2010

Petite pause "LEDS"

I swear I tried. I really tried to come up with some arenas for Apple Assault despite I knew I'd have to "repair" the level editor anyway. It just didn't worked. For some odd reason that aren't even worth being named "a bug", it is impossible to draw or alter the behaviour of the two rightmost column of tiles in LEDS at the moment. I just worked around it in gedsdemo, but Apple Assault is likely to have levels that are just one screen wide... and then it really looks broken.

Je vous jure : j'ai vraiment essayé de dessiner quelques "arènes" pour Apple Assault sans commencer à corriger mon éditeur de niveau au préalable. Mais c'était compté sans une bête limitation, une "erreur de jeunesse" de ce programme. Impossible d'aller dessiner sur la colonne la plus à droite d'un niveau. Si ça n'a pas eu l'air trop gênant dans les démos précédentes, c'est quand-même très moche quand on essaie de faire un niveau dont la largeur est celle de l'écran, croyez-moi.

Oh, pas de sushi: ça devrait être Je pensais que ce serait assez vite réglé, juste le temps que je me souvienne (et que je documente, tant qu'à faire) les mécanismes qui permettent de passer de l'édition de fond à l'édition de la zone de jeu et à l'édition des propriétés des blocs. Bin non. L'appel du menu "choix du plan affiché/édité" détruit la partie du niveau à l'écran, et je ne parviens plus à enregistrer un niveau nouvellement créé.

I initially thought it'd be a quick patch. I'm afraid I was wrong...

  • [done] while I was checking some fixes, an invocation of the "layer selection bar" suddenly destroyed the whole part of the level that was onscreen ...
  • [done] only allow edition of the editable area. (wow. that one was pending since Feb. 2009)
  • [wish] provide a way to change "type of tile" when editing the meta-layer, without requiring on-map display.
  • [done] And I couldn't write the level I was working on to disk make sure stored maps end up with .MAP ^^'.
I'm afraid you'll here a bit more of LEDS next week.

Wednesday, June 02, 2010

BRIX.TXT

Amusant, ce qu'on retrouve dans les fonds de tiroir ... voilà le fichier "readme" de mon premier jeu en Assembleur pour MS-DOS: Crazy Brix, qui (2 ans plus tard), remporta la compétion "100K games" à la Inscene'99 ... A défaut d'Internet, à cette époque, je tentais de voir mes jeux paraître sur le CD du magazine PC-Fun ... sans grand succès, malheureusement.

Well, I dug a README.TXT file for my first A86 game : Crazy Brix, as submitted to the French magazine Pc-Fun. It wouldn't make much sense to translate that to you, right ? it mostly has some nostalgic value. What I find amusing is how it built up : from a proof-of-concept QuickBas game (hardly playable, but conceptually correct), i retro-fitted the "algorithms" into my growing assembly-written .S3M player for the Sound Blaster Pro. Somehow, "importing" the S3M player into a fresh game project didn't work. Debugging such a program was a nightmare ...
I had no idea of the existence of GPL or free-software by that time (neither did I have any free software at hand, which more or less explain the use of assembly), so I was trying to trade my code against something else I could have a use for. Funny.


- - - 8< - - - 8< - - -

Salut à tous !
Bien le bonjour à vous, futurs joueurs de CrAzY BRIX.
Je me permets de me présenter: je suis Sylvain
( alias PYPEIN ), programmeur de BRIX. Vous allez sans tarder découvrir la version 1.9 du nouveau XAM-WARE de PPP TEAM SOFTWARE.

(XAM-WARE comme produit pendant les examens.)

Les Versions.
1.0: Développement de l'algorithme de jeu en BASIC ("appelle moi pour jouer",dit Vivien)
1.1: Première implémentation en Assembleur: MODPLAY+ chargement des images (ricanement de Piet)
1.2: Réalisation des routines graphiques
1.3: On peut commencer à jouer, mais c'est plein de bugs.
1.4: premiers essais de transparence ("C'est quoi, cette horreur?" dit Piet " C'était encore mieux en BASIC!")
1.5: décors de fond retravaillés
1.6: ajout des patterns "GAME OVER" et "NEXT LEVEL"
1.7: on peut changer la vitesse de la balle.
1.8: Ajout des samples pour les bruitages ("Je te laisse débugger, Pype, je reviens à 12h00")
1.9: image d'intro en POVRAY
1.A: "ajout d'animations"

Note aux programmeurs
Mon module player n'est pas encore au point, néanmoins, si l'un d'entre vous veut en faire un en assembleur, je lui conseille d'abord de lire 'Le SuperLivre de la SoundBlaster' paru chez Micro Application. Je peux aussi vous passer une partie des sources (les fonctions de la S.B.) mais ne me demandez pas les sources complètes du player: le code est pas encore optimisé (PENTIUM minimum). Je vous le passerai seulement contre d'autres trucs (un player pour un autre format, des truc de balaises sur le mode protégé, un jeu que vous avez fait et qui est mieux que le mien...)

- - - >8 - - - >8 - - -

(tout ça, c'était avant que je ne découvre la GPL, NDLR)
D'une certaine manière, Crazy Brix reflète assez bien ce qu'était PPP Team : en apparence un projet solo, ce jeu n'aurait jamais vu le jour sans le bouquin de Nowan sur la soundblaster ni sans l'assembleur A86 de Parmy. Il n'aurait pas été fun sans les Bilou/Badman de Pierrick, ni sans le personnage "tentacle bob" de Tbob, ni sans les mods de mon frère. Il n'aurait pas gagné la 100k sans les routines de compression de Kris, ni sans la voiture de Gino. Il n'aurait pas eu de sens si Pierrick n'avait pas lâché à Romu "tu te rends compte qu'il a fait ça en 100% assembleur !?"

download and play in DosBOX

Tuesday, June 01, 2010

AA : early gameplay draft

Vous vous souvenez de la présentation "onirique" d'Apple Assault la veille de mon aniversaire ? J'ai remis la main sur un petit croquis nocturne dans le carnet qui contient les précieuses mesures de ma cuisine. Je vous en dirais bien plus, mais ma fée m'attend pour descendre chez I<ea ... il faut vraiment qu'on change de cuisine.

Remember how the Apple Assault gameplay came to my dreams ? I eventually sketched up the idea that night, but then the sketchpad has been burried down, used to plan my new IRL-kitchen, moved to Sweden and back. Today, it's about time I make a decisive move towards that "new kitchen" thing before *deline gets a hand on frypans... So the sketch got dug up, just when I was using a scanner. Voilà. Here it is online. enjoy it.

PS: oh, btw, it looks like the sketch has later been used to help thinking about dyngobs and their management...