mardi, juillet 23, 2013

Games you get Great at.

Back in the 80's, Great Giana Sisters is probably the best game I've played on my C64. If you allow yourself to go beyond the likelihood with Super Mario Bros on NES, you'll discover a challenge that is well-tuned and that appeal you to improve your skills -- a dimension that is imho too much abandoned nowaydays.

that damn'd fish!
The game is designed with no save state, but with "warp blocks" that are invisibles and that will throw you further ahead in the game. This is quite unlike the "warp zone" of SMB1 in that here you have several secrets to discover and to remember. If you fail to activate one on your way, it will turn into a different experience, so the game is not only made speed-run-able, but also diverse in this way.

With repeated re-plays of the game from the start (but usually less than one minute to beat one level), you quickly realise that even with a decent skill level, you'll often fail on the very same jump. Difficulty comes from the need to properly identify hitboxes and manoeuvre your character on tighter timing.

I started playing back the game with the ambition to beat it without cheating back in late 2008, when Mr. Sid released it as a Nintendo DS homebrew. Only then I realised that the "curious items" between the homing fireballs and the 1-UP offered unique ways to undermine some challenges. Do this jump in level 11 look near-impossible ? Well, if you're wet (raindrop powerup -- which you lose on picking a 1-UP and lacks visual feedback), the fire won't burn you. That makes it a whole lot easier (on the C64, only a game engine bug allowed us to cross that screen).

Once I realised that, my challenged changed. If I wanted to get a chance to beat the game, I need to get and hold the raindrop when I'm playing level 11. That essentially means *playing perfectly all the levels before*. If I just fall for that tricky jump in level 4, I'll lose all my power-ups, and I'll never be able to find enough power-up blocks before I reach level 11 again -- esp. since the block just next to my respawn point will be empty >_<. This is something that feels completely alien in a platformer nowadays, where you can almost always revisit at will levels you've beaten once (and thus stock power-ups at will). Then, it turned obvious that I could undermined "that damn'd fish in level 22" if I could "simply" find out how many power-up blocks I need to skip so that I have a "clock" to freeze the fish when I reach that place.

This, friends, was the original Great Giana Sisters, and when my 11-year-old nephew discovered it, he kept playing it for roughly 1 hour and a half, although by then, he hardly managed to beat level 2. Stay tuned for part 2 on "Twisted Dreams (PSN)".

http://critical-gaming.com/blog/2010/12/31/about-that-indie-feel-pt2.html
Likely, if you played Super Mario Bros on NES, most of these "dangerous places" look not so dangerous to you. That's because you've grown up in a game that helps you, not in a game that hates you. When SMB game engine detect that you can't keep jumping because there's something on your path, it doesn't just stop you to your doom: it tries harder, checking whether aligning you on the next tile wouldn't help. This makes the game logic a bit more complex, but it compensates the lack of complex collision system and the crudeness of rectangular hitboxes.

(Trop chaud pour la version française. Revenez demain)


vendredi, juillet 19, 2013

Bilou Origins

Je vous emmène dans le temps ... 20 ans en arrière. Je suis un gamin de 14 ans et je viens de terminer de programmer le niveau 2 de Calimero en EPBASIC. Cet après-midi-là, mon frère revient à la maison sur-excité: un nouveau gars dans sa classe -- Piek -- fait des jeux vidéos et de la musique techno. Il a assisté à une formidable démonstration des capacité de l'Amstrad CPC grâce auquel Piek a réalisé un jeu de plate-forme autour d'un personnage rondouillard nommé "bubule". La suite a déjà été racontée et va conduire à Bilou tel que nous le connaissons aujourd'hui.

One week ago, this was all that was left from the seminal 
CPC game that led to Bilou as we knew it.

Pour ma part, il m'aura fallu bien du temps avant d'entrer dans le grenier où Piek range son ordi. Et quand j'y arrive, il est trop tard: la cassette sur laquelle se trouvait le projet "Bubule" est irrémédiablement perdue. Je n'aurai donc de ce petit (?) jeu que les images que je m'étais construites dans ma tête. Une sorte de mélange entre Space Panic et Rick Dangerous avec les personnages 8x8 pixels que Piek avait retracé au marqueur pour me servir de base dans la conversion dans un jeu de labyrinthe pour CGA 4 couleurs.

Les choses auraient pu en rester là, mais la semaine dernière, Piek a repris son QBX.EXE et son notebook ... Cette fois, plus question d'une reprise d'un obscur jeu de kung-fu ... Cette fois, c'est ... [télécharger Bilou Origins.zip] !
Je clique ... je lance DOSBOX ... Un écran-titre digne de Giana Sisters plante le décor: tous les fameux monstres -- le sauteur, la boule rouge -- dont mon frère m'avait parlé sont au rendez vous.

Je monte l'émulation à 128000 cycles et j'appuie sur ENTER ...  

My friend Piek just sent me some QBX package named "Bilou Origins". 20 years later, at last, I'm able to get an idea of what was the first game starring the blue ball now known as "Bilou" that excited my brother so much back in time. Using the raw power of our modern computers to emulate scrolling in a BASIC that never supported such a thing, Pierrick used his natural abilty to simplify problems to provide a 4+1-levels (so far) trip into a world of nostalgia.



Simplest level editor. ENTER toggles cursors, SPACE edits.
 Le premier contact surprend. Un chateau façon Mario, des ponts, et un personnage qui ne s'arrête plus de courir quand on a appuyé sur la flèche vers l'avant. Tirant parti de son système de scrolling au maximum, Piek est parti dans un mode de jeu assez différent, sans échelles, où il faut enchainer les sauts proprement pour atteindre la fin du niveau.
A côté du jeu lui-même, un petit "MAP.BAS" me titille ... oui: c'est l'éditeur de niveau. Moins de 40 tuiles pour construire cette petite merveille de rétro-gaming.

While the CPC game was mostly flip-screen adventure, possibly drawing inspiration from Lode Runner, Bilou Origins feels more like a rush game, since releasing the arrow key doesn't mean Bilou stops running. You'll have to carefully air-control your jumps so that you clear those gaps between partly-bridged platforms that ultimately lead to the (spiky) yellow castle. Beware the purple jumper, that cannot be defeated, and the mind-changing green dude, who could turn back just when you expect him to keep moving straight ahead.


Piek calls the PPP Team to help ... new levels, tiles ... I hope they'll be at least 6 to come and provide their own 4 levels + 1 castle, so that the quest can be completed this summer and we can ship "Bilou Origins" for PCs


Alors que je galère pour donner vie au niveau imaginé par la suite sur DS, voici donc probablement le jeu-anniversaire ultime ... Donnez-nous les vacances pour y ajouter quelques petits trucs rigolos -- des boss, des power-ups, ce genre de choses -- et on vous laisse vous aussi découvrir "le tout premier Bilou, revenu d'entre les bad sectors".

mardi, juillet 16, 2013

Yearling

Last year's "holiday todo list" is thus finally completed. The last touches to SpongeBop's behaviour were introduced mid-June, multi-palette support was released in March, ink hurts (when configured in that way) and (of course), we do have compound-animation for Bilou since September 1st, 2012, and I fixed much more than just the "landing bug".

What's up for this year's holiday ? I've got pendats animation (well, not the full set of actions, just the simple walk) and a first draft of verso-the-eraser. I just have used the last 70$ of NeoCompo prize to order a replacement part for my fridge (15°C cooling is not funny), and I still have much drilling and sawing to do outdoor to make the garden kids-friendly.


Si sur le devant de la scène je prend enfin le temps de mettre en ligne toutes ces réflexions sur le gameplay de Mario World, en coulisses, la révision de l'éditeur de niveau atteint le stade "tests intensifs". L'objectif ? Pouvoir enfin ajouter de manière fiable des monstres, encore des monstres, et pouvoir les lier les uns aux autres (indispensable pour SpongeBop) sans devoir passer par le PC et son éditeur de texte ... Mais le reste (clonage de niveau, wizards, etc) devra attendre: la Neo Compo 2013 approche à grands pas et j'aimerais pouvoir y présenter une première version de Deep Ink Pit ... si libntxm veut bien ... et la VTJ aussi.

The critical item to get started on a "deep ink pit" map right now is the level editor, which must be capable of cloning monsters that are attached to other monsters without messing up the level commands. It's still in "testing and fixing" stage, though. Then, I'll need something that makes the ink moving up ... that will involve a custom effect of some sort, as that's not something the state machines will easily handle.

I hadn't got much luck with musics so far: Both Piek's and Piet's tune play weirdly on the Nintendo DS... Deep ink pit will feature yet another song and if that one doesn't work properly either, fixes/level-up will be required on libntxm.

Will this be completed for NeoCompo 2013's deadline ?


Oh, btw, translation of Saturday's post is at last completed. 

samedi, juillet 13, 2013

Level interplay

onAu beau milieu d'une forteresse (ou d'un chateau ?) de Super Mario World, je tombe sur ce genre de situation: Idéalement, il me faudrait passer en une fois ces sauts, et si je loupe mon coup, je me retrouve en réalité enfermé par des blocs invisibles. Une porte me ramènera alors en arrière pour que je puisse réessayer. 
Somewhere deep in a Fortress, a feeling of dejà-vu. Falling into a pit seems easily recovered, but as I jump to escape, I find myself actually trapped by invisible coin blocks. It's tempting to establish the link between this situation and the more common under-way that brings you back to a "bad luck, try again" spring. There's a significant difference, though: thanks to the presence of the invisible blocks, the player who failed once can undermine the challenge and avoid failing a second time by transforming the level to her advantage. 

Ce serait tentant de se dire "bah oui, c'est fréquent. Combien de fois on a pas vu un niveau avec sauts difficiles et un sol pour me rattraper, un bumper pour recommencer plutôt qu'une mare de lave ? Pas de quoi en faire un plat. En réalité c'est plus subtil que ça: ici, le deuxième passage sera simplifié par le pont que le joueur a créé en tentant de sortir du trou à son premier passage! On module donc de nouveau la difficulté du jeu à travers ses actions.

The next question is "do we actually need invisible blocks for this to work ?" There are other approaches that would work equally well. A Keen-like switch could enable a additional platform ... or just Rayman-like magic and you're done. Quite true. Yet, I find something elegant in how the invisible blocks managed to trap you while you thought you'd easily escape and *meanwhile* unwillingly undermine the challenge. True, the [?]-block is purely abstract, but the function it has is marvellously fitting the use of JUMP here ...
"Pas besoin de blocs-question pour ça!" ... peut-être pas. Dans Keen, un interrupteur aurait fait l'affaire alors que dans Rayman ... bah, y'a des trucs qui apparaissent et qui disparaissent à tout bout de champs, de toute façon. Un de plus ou un de moins, quelle différence ? De nouveau, ce n'est pas tout à fait pareil. Avec la version Keen, le joueur n'essaie pas de sortir du trou quand il active le switch. C'est une action différente. Dans la version Rayman, il n'a même pas le choix: le défi s'auto-détruit qu'il l'ait souhaité ou non. Il y a quelque-chose d'architecturellement élégant dans la façon dont le bloc-question permet ce type de piège (tout en étant au départ prévu pour tout autre chose)
C'est une recette qui date au moins de SMB3 où un saut raté est compensé par un bloc invisible au bord du mur pour permettre l'escalade... et qui dans tant d'autres situations permet au joueur de transformer le niveau au fil de son passage en offrant un certain niveau d'interaction avec des éléments inanimés.

I tried to find other platformers that had equivalently powerful item in their design. Many were ruled out (James Pond, Giana, Mickey) because they simply duplicated Mario's block. Then you've got a collection of platform/action games (Duke Nukem 2, Keen, Shantae, Nikita) where you wouldn't use such an item because JUMP is not such an important mechanic.

My best suggestion so far is thus the bouncing plum of Rayman (PSX), which provided interesting, organic way to transform challenges, but also a high degree of interplay (you can ride it either when it's resting or when it's bouncing) and reaction to gravity (it will not easily climb up hills). The fact that it may even transform ennemies is the ultimate plus: Rayman 1 wouldn't have been the same (and would have lost lots of its fun) if the plums were removed.


A défaut de bloc-questions, le premier Rayman offre un élément-inanimé-interactif bien intéressant avec les "prunes sauteuses". Plate-forme y compris pour traverser l'eau (fatale à Rayman), mais qui rebondit moins haut si Rayman reste dessus. Elle peut avancer lorsqu'on lui donne de la pèche, mais sur une pente, elle accélère/ralentit pour repartir dans le sens de la pente. Comble du raffinement, elle peut transformer certains ennemis en plate-forme mobile. Avec un élément de ce genre dans le niveau, on peut se mettre à l'affût des combinaisons inédites alors que même Rayman Origins reste relativement plat à cet égard pour autant que je m'en souvienne.

A late public voting saved Commander Keen 2/3's Vorta-Cola can. Although it offers only half the interplay of the [?]-block, it is a platform when you walk on it, but you can collect it from the side or from below.

(J'avais en tête qu'on pouvait marcher sur les cannettes de soda dans Keen 1, ce qui en faisait aussi un élément de "niveau transformable" dans un jeu ou la majorité des modifications passent par des switchs -- pas de magie ou d'invisibilité dans le monde de Billy Blaze -- mais c'était dans les épisodes 2 et 3: le Vorta-cola.)



jeudi, juillet 11, 2013

SMW -- try a more difficult quest

1992, un samedi matin. Je cours dans les rayons du GB pour atteindre la Maxithèque et me mettre le plus vite possible dans la file pour la manette de la Super NES ... Coup de bol, il n'y a personne cette fois-ci. Je choppe le pad et je démarre le niveau de Super Mario World. Mais à ma grande surprise, il n'y a pas de bloc-question avec un champi dans le niveau cette fois-ci ... Et un peu plus loin, je tombe dans un trou. Un trou ? Eh, y'avait pas de trou dans ce niveau, la semaine dernière !

Avec des scéances de 15-20 minutes par semaine (en cas de game over, il faut passer la manette au suivant dans la file. Si mon père passe en disant "ça suffit, assez de jeu vidéo pour cette semaine" aussi), ce n'est que plus tard que je réaliserai la présence des "Switch Palace" et que je comprendrai que je jouais cette fois sur une partie toute fraîche ou aucun super-joueur n'avait activé ces switches pour moi.

We cannot seriously pretend that switch palaces in Super Mario World are *hidden*. One is straight on the map, the next two are explicitly mentioned in the castle just past the vanilla dome ... They feel more like an admission exam for the player. "Good, now that you've understood the core mechanics and reached the half of the game, let's make sure you're teased up to the point that you'll hunt for those palaces on your next Game Over".

On serait en droit de se demander "si ces switches rendent le jeu plus simple, pourquoi sont-ils cachés?" Cachés? vraiment ? Voyons, le switch jaune est visible au niveau du premier chateau et accessible dès le début du jeu. Le switch vert au bout d'un tuyau dans une caverne, mais passer par un tuyau pour trouver un secret, ça devrait être un réflexe pour un joueur de Mario!

Even the access to those palaces is fairly straightforward. One pipe or one P-switch, and voilà: you're in the palace. Comparatively, Star Road accesses are available sit within secret shortcuts and require mastering of the mechanics to be opened. Comparatively, even unlocking the (last) blue switch palace is easier than beating the level where the entry stand (not mentioning opening the path to the first Star Road access :P)

Troisième switch, il va falloir cette fois ouvrir le passage avec un interrupteur, mais le joueur aura été titillé avec deux chemins a priori impossibles qui s'ouvriront une fois le switch activé. Un peu de maîtrise s'avère nécessaire puisqu'il faudra transporter le switch puis la clé, mais soyons honnêtes: tout ça figure de rigolade à côté des secrets qu'il faut percer pour sortir des maisons-fantôme. Et pour être sûr, une fois le chateau suivant atteint (on doit être grosso-modo à la moitié du jeu), on vous demandera de but en blanc "avez-vous déjà trouvé les switches rouge et vert?".

The real deal is not about *finding* those switch palaces. The real deal is about *daring not to enable them*. Have you just reached Bowser valley thinking that Super Mario World has nothing more to offer and is "just for kids". Uh hu ? Do you have what it takes to come here with no switch enabled ? No safety net over deep pits ? No barriers to protect you from being stomped ? No convenient power-up dispenser just before the boss' door ? Truly, those switch palace are a "easy-normal-hard" difficulty selection in disguise.

Soyons clairs, je pense qu'il est quasi-impossible d'arriver à la vallée de Bowser sans se douter de l'existence des switches tant il y a d'indices quant à leur existence. En revanche pour Julien qui arriverait au chateau en se disant "boah, c'est trop facile!", l'utilisation de tous ces blocs colorés dans les derniers chateaux offre un message clair: "trop facile? essaye donc de refaire le jeu sans activer les switches, qu'on rigole". Et voilà donc un Mario qui dispose d'un large pannel de niveau de difficulté différent -- chose unique dans la série, sauf erreur de ma part.

Voyons ... ce serait un peu comme si certains interrupteurs planqués dans les recoins obscurs de la machine infernale de Keen Commander permettaient de couper le courant aux monstres et aux obstacles les plus critiques. Au lieu d'une sélection du niveau de difficulté via un menu, c'est en procédant au sabotage du jeu qu'on en saperait aussi le niveau de difficulté. J'aime.

PS: un passage secret difficile dans SMW, c'est plutôt quelque-chose comme ça (je l'avais trouvé grâce aux sauvegardes de l'émulateur, mais je ne m'y suis pas encore risqué dans le "vrai jeu").

mercredi, juillet 10, 2013

Refactoring level loading in LEDS


If you want monsters in a level with libgeds, a .map file isn't enough. You need to provide a companion .cmd GameScript file that contain commands parsed by the engine to instanciate dynamic object, set rules that guide them, etc. Most of that content is left unmodified when you edit your map: only some 'GameOBject number U will start with behaviour B at coordinates (X,Y)' is modified. So far, I thus only extracted those coordinates into Monster objects and would use the updated Monster list to patch the .cmd file when you click [save]. Yes, I really mean patching. Scanning the original file, and deciding for each line whether I keep it as is or replace it with something coming from monster[i].writeback().

But the approach couldn't work properly when we start inserting new gobs that mess up the line numbering in the ouptut. Plus, it is excessively limited, while I'd like to be able to include more features in the level editor (such as linking spons with pins, picking the background image, etc.)

The new approach thus keeps a complete copy of the .cmd file in memory, divided in blocks. Each block holds lines that should be edited together, like the full configuration for one monster, the settings for one plane, etc. I'm almost done. All that's left to fix is spacing in generated lines.

I quite liked how the former version of LEDS had some "controller" class (WelcomeWindow) that provided an empty vector to LevelModel so that it'd fill it with the objects the view (MonstersManager) would use. Unfortunately, in the new version, the relationship between code blocks and in-editor structures (like the Monster instances) got more complex, and a flat vector no longer works well. The new Block class offers the ability for any part of the code to crawl through the sequence of Block instances that were generated while parsing the level's cmd file. Unfortunately, this dependency between LevelModel and MonstersManager has turned implicit while it was nicely explicit before.

There's just one design decision I wish I could validate with a magic crystal ball. Any line on a GameScript that starts with a 'g' is now packed into a GobBlock unless that GobBlock refuses it (if so, a new GobBlock is created). That means the gob%.focus had to be changed into focus=gob%, for instance. Not exactly what I'd recommend in any serious project, but the syntax of GameScript is fairly simple and should not receive further significant extensions.

jeudi, juillet 04, 2013

Special!


Youpie! Ma fée m'a retrouvé mon GBA micro avec Super Mario World dedans ^_^. Et à reprendre ce jeu-là, je me rends compte que je m'étais assez fourvoyé sur le compte du monde "Spécial". Je le considérais comme le passage secret ultime, d'une difficulté crasse, qui ne raccourci rien et qui mêne à un objectif bizarre et pas drôle: la transformation de toutes les couleurs du jeu (plus terne) et le remplacement des tortues par des "faux mario"... Wéé ...

A l'époque, j'avais du mal à passer le deuxième monde du jeu, et je n'avais plus aucune chance de terminer un niveau en une vie une fois arrivé dans la forêt illusoire.

At last! for the first time since '96, I can enjoy Super Mario World -- and now use some Super Papa Bros. time to study its design. I made a hidden reference to the "Special" world of SMW in a recent post, where I presented it as a poor type of reward for dedicated exploration of the game's secret: I simply saw it as insanely hard levels that led to a mysterious switch that replace all monster graphics with out-of-topic ones. I realized since then that the reward wasn't that much about the destination of the Special world but rather about the journey through Special world.

Maintenant que j'ai atteint un niveau un peu correct (jusqu'au chateau avant la vallée de Bowser sans game over), les choses m'apparaissent différemment. Quand je jette un oeil au niveau tubular sur Youtube, la réaction c'est "wow! excellent! tout un niveau où on flotte comme un ballon!". Puis deux niveaux plus loin "Haha! ici, ils ne se sont pas privé avec les tortues jaunes et bleues! ça doit être la fête avec son Yoshi!" En fait, le monde spécial ne mène pas à une "récompense": il *est* la récompense pour le joueur suffisament entrainé. Des niveaux où les concepteurs du jeu ont cette fois laissé libre cours à leur fantaisie et construit des niveaux possibles sur base des éléments peu fréquent dans le jeu, sans tenir compte des contraintes habituelles du genre "on vous promet qu'il est possible de terminer le niveau en 1 vie même si vous ne l'aviez jamais vu avant".

I got the enlightenment while watching some Special speedruns on Youtube while my GBA had actually disappeared in the sub(sofa)-space, just after (barely) beating Gnarly level. I had always remembered Tubular as complete madness, where you have no place to land and things got thrown at you all over the place. That was missing the fact that Tubular is actually about turning Super Mario into a kind of shoot-m-up level where you're ballooning and have to locate the next hidden balloon among the [?] blocks on tight timing. In the rest of the game, taking a balloon is optional, and when deadly, you get a free 1-UP ahead of the danger.

Donc oui, c'est dur (parce qu'on pousse en avant les nuances du gameplay et les
techniques avancées), et il faudra de la mémorisation pour venir à bout de certains niveaux. Mais on est en réalité bien plus proche des "mondes cachés" de Donkey Kong Country que je ne l'aurais cru...Mondes cachés qui étaient également basés sur le détournement des règles établies dans le jeu avec "ici, jungle des pneus qui tuent" ou "le niveau où tu vas jouer avec tous les copains-animaux".

Just like Lost World of DKC2 -- which I loved a lot and made me start DKC3 with only one question: how do I get to the Lost World this time -- Special World is about doing the forbidden, breaking the rules and going wild. It's about making the rare Blue and Yellow Koopa common for a couple of levels so that having Yoshi around turns into a sort of fancy fair in Awesome. It's about doing mad spin-jump on a platform maze in Way Cool. 

Et les koopa-mask, alors ? Pourquoi cette ridicule transformation de tous les monstres ? Apporte-t'elle quelque-chose au gameplay ?
Peut-être bien. Pour arriver à la fin du monde Special, il faut un fameux nombre d'heure de jeu sur un mario. A ce nombre d'heures, on lit inconsciemment un écran. En vision périphérique, on sait déjà qu'un personnage est un koopa, un parakoopa ou une plante pirhana. Plus besoin d'y réfléchir: ça vient d'instinct, comme de porter la main à son sabre laser si on croise Darth Vador. Et tout d'un coup, on va dire au joueur "eh, Julien, tu crois que tu y arriverais si tu ne pouvais pas compter sur tes années d'entrainement à jouer à Mario ? Eh bien c'est ce qu'on va voir. On mélange les cartes! Pire, ils vont tous te ressembler au point que tu devras te concentrer ne serait-ce que pour savoir où tu es vraiment!".

But then, why offering those curious "koopa mask" to the Super-Player that beats the Special World ? What does it bring ? It's not even truly fun (imho). After reading Kirby Kid's definition of "a mix up", it becomes clearer in my mind. Having picked Mario's head shape is not accidental: it's deliberate. Mario's head has been progressively hard-wired into the player's mind as "me". And now Nintendo's designers change the rule and "me" becomes your worst ennemy! Rather than reading "pick me up!", the empty koopa[mask] shell reads "me". Instead of reading "Jump! I'm gonna kill you", the shell that bounced and comes back reads "me" again. Picking the Koopa for that purpose isn't an accident either: it's the monster that has the most interplay with Mario. So that 'season switch' isn't merely about "replacing the graphics": it's truly a "hard mode" hidden within the game, that resets your habits and puts you in a somewhat parallel world where you cannot trust your eyes.

Oui, c'est bel et bien un "mode hard" caché au sein du jeu.