Friday, August 23, 2013

Sheets for AnimEDS.

The set of animations for the school zone is quite full now (here, you don't see the spongebop, for instance).
Some of them could be dropped in specific levels, but I just don't want to lose things I've crafted so carefully, especially if I know I might use them later on.

So, just like you have "sheets" of sprites in SEDS, there will be some "sheets" of animations in AnimEDS asap. I love thinking of "sheets" for that because i) the DS display is too small to show them all and ii) scrolling through linear large set has never felt comfortable when working with RSD game-maker.

On dirait bien que j'ai quand-même rempli le jeu d'animations auquel AnimEDS me donnait droit. Je vais donc introduire des 'planches d'animation' tout comme il y a eu des 'planches de sprites' dans SEDS. J'aime bien penser en terme de planches. Ca s'adapte assez bien à l'espace limité de l'écran DS et c'est plus confortable que les interminables listes déroulantes de l'éditeur RSD.

Ce n'est pas forcément la chose la plus urgente à faire là-maintenant, mais le fait que la page soit pleine n'aide pas à ajouter des choses comme "Bilou-dans-l'encrier", "la gomme tournée dans l'autre sens" ou "le crayon assommé". Du coup ...

RSD map editor: you had to scroll
in a flat list to get another tile.
Random thoughts:
  • there are 8 columns per sheet, and less than 8 lines. That suggest using octal numbers for animations in game script could mean 226 is natevly translated into "page 2, row 2, column 6".
  • [done] We'll need a way to move things around pages. It would be useful to consider the last two lines as belonging to a sticky page (e.g. page 7) that can be used as buffer space to move things between "structured" pages.
  • [done] We'll need an input to dismiss one animation completely.
  • [done] preserve ongoing animation while switching page
  • [done] keep an "undo" for deleted animation, recall them pressing "DELETE" again.
  • [wish] sticky page remains sticky across loads (implies content wouldn't be saved :-/)
  • [done] avoid additional issues with LEDS' monsters rendering.
  • [done] some random replacement still occur, apparently when coming back from the editor window
  • [fixme] restoring deleted animation on another slot randomly makes source slot show an animation again.
  • [wish] find some way to flip to the next/prev sheet (preferably without the stylus). 
  • [wish] I can live with pendat's hands not having pendats colors on the thumbnail, but body's color reflecting the real choice could be important for level editor.
  • [wish] flipped limbs rendered flipped on the thumbnail.
It might not be the most critical thing to do to progress on the project, but it might also be that none of the monsters have progressed this summer because this sheet is full. No room for Bilou-in-inkjet... No room for swapped bopping eraser ... No room for stunned pendat ...

Thursday, August 22, 2013

runbox 0.8 then LEDS ...

That's the result of summer re-factory: runme can now be used to navigate the content offline, launching levels and tools, and pre-viewing pictures and musics (although some more regression testing on those last features would be welcome). The top-screen show me where I am, what the current filter pattern is (e.g. SC*.MAP) or the selected file once a file has been selected.

Now, I'd like to make Level Editor to benefit from these improvement as well. The "map filename" mechanism has been fairly disturbing lately. It lacks contextual re-naming/cloning of one map as already wished back in March.

So yeah, LEDS time again, but on the front end rather than on the back end.
  • [reverted] Having 'dirname' and 'typed text' on the top-screen MetaWindow is not such a good idea in LEDS: it makes noise on the level editor and could potentially corrupt the level.
  • [done] I'd need a "mapname" widget (not merely a button) that embeds file name, size (current or suggested) crop, drop and re-name sub-buttons.
  • [done] update cmd filename too, and make sure that new mapname is reflected in the saved cmd file.
  • [won't] Maybe GuiEvent should be completed with a BLUR event, when someone clicks another widget. RELEASE is "stroke started inside an object and ends outside", and complements CLICK ("stroke started inside and ending inside") but we have no complement to TOUCH ("new stroke starting inside.") -- but that might interfere with W_DIRECTORY events generated in the "PICKMAP" context >_<


Wednesday, August 21, 2013

10 minutes a day.

Sometimes I can't help looking backwards and tell to myslef "Doh! It's k weeks (months?) since I said that would be my next target, and I'm still far away from it! What the heck have I done with my time during those weeks?" ... That usually happen in times like now, when IRL stuff are crowding in my agenda -- either at the office or at home -- and barely leave me 10-minute sessions (2 of them if I'm lucky) to progress on my homebrew projects.

But don't we all have moments when we wish we had more time available ? Or would better control the way we spend our time ?

Wednesday, August 14, 2013

Widgets come and go.

Hmm ... allow me to use one post as a documentation-to-self for a feature of the GuiEngine that I haven't used a lot, yet: the ability to dynamically control widgets showing up on screen.

  • one static widgets list per window
  • nbWidgets may tune how far you can go in that list
  • wstart indicates where you start reading from.
  • add(x,y,Widget) populate the list, normally in the Window's CTOR.
  • setmark() inserts a terminator in the list.
  • setmark(HOP_TO_ZERO) inserts a "goto" item that forces the list to be read from the start. This is allowed only when wstart>nbWidgets, which implies that you must reset nbWidget to the position returned by the earlier setmark(). I'm not happy with this constraint.
When one wants a (set of) widget(s) to be optional, the prefered approach is to place it after a terminator and followed by a HOP_TO_ZERO to further process the "permanent" widgets. That also gives those "tabbed/pop-up" widget precedence over permanent widgets.


if (wstart==nbox) {
    wstart=0; box->hide();
    ge.release();
} else {
    wstart=nbox; box->render();
    ge.focus(box);
}
Note that visibility of the 'pop-up' widget needs to be manually adjusted with render()/hide() and that we need to force the Gui Engine to lose widget focus to make it work. In setup, the current location of the optional widget (here box) needs to be captured (in nbox):

add(64,0,(box=new BoxWidget(...))->attach(...));
setmark(HOP_TO_ZERO);
nbox=nbWidgets--;
If you want the 'pop-up widget' to be hidden when you'll enter that window again, you'll have to complete your Window::release() method with a conditional test:


if (wstart==nbox) {
      box->hide();
      wstart=0; 
}

Thursday, August 08, 2013

RunME needs a fix.

Mid-summer has been fairily hostile to game/tool development, unfortunately... I'm stuck on level editor progress because I can't easily ensure levels I edit are working properly, as RunME struggle to launch them. The best I could do while *deline was exploring the joy of the sea-side was some documentation of RunME so that the following fixes could be performed:
  • [done] file/directory selection information should get its own space on top-screen
  • [done] not only the FILE*, but also the extension name (file type) should be accesible from the L+A launcher button.
  • [done] beam-in files in the last directory used for beam-out.  [todo] currently, only typing a new mask on the "alphanum keypad" will activate that directory.
  • [todo] buttons (SEDS/edit) shouldn't overlap.
  • [todo] ensure we can move back to SEDS/LEDS/download mode at all time.
  • [done] don't try connecting when there's no sink on a given slot
  • allow beam-out to be cancelled.
  • [wish] global_connectAP and wfcWindow::autoconnect should belong to WiFi widget. 
  • [done] IP address and [wish] SSID shown on the top screen once the connection is established.
  • [wish] allow .spr files to become autoexec.spr even though they're too large to fit our 256K buffer.  
  • [todo] spritesheet loaded with L+A in RAM should be able to display their colours, despite the "extra palettes" setup.
  • [done] a way to try again the WFC connection settings from the "access point selection" list, as they may contain WEP keys, too.
  • [wish] enter WEP key in AP selection list.  
  • [wish] use Window.active flag if "clicking on other screen's button" is a bug rather than a feature.
^ UI/transfers -- level running v
  • [done] fix the 'unregister XFER' loop bug.
  • [done] proper cleanup when 'returning' to beaming activities from a test.
  • [todo] avoid InspectorWidget/LoadingWindow interference (active areas not reacting anymore, beam-in offers cluttering the display)
  • [done] report hero/ennemy/none class in InspectorWidget.
  • [todo] control log display, clear and end-of-test from Inpector widget. 
  • [think] special InspectorWidget display mode on (breakpoint collision), showing both colliding GOBs' state *before evaluation occurs*, with the ability to step to the next frame (after collision occurs)
  • [done] double-check .spr and .xm loading support: no jamming allowed.
  • [fix?] how could die() end up showing blank screens (when leaving the running game)?
That makes a NeoCompo entry very unlikely this year, unfortunately.
But at least, it gave me time to sit down and think about what mechanics could nicely complement JUMP in the full-blown adventure game.

post-trauma-edit: I just picked Surt's tileset I used for LEDS release 0.1 with the hope that I could use it to prepare a "tutorial map" and ship LEDS for NeoCompo ... result? I quite certainly screwed'up my school0.map (and will have to recover it from some git) with parts of the tuto map because I hadn't changed *that* filename in "tuto.cmd" ...
When I tried to save back the map under "tuto1.map", the map got all cleared ... Unfortunately, LEDS is not ready for shipping to the world and an extended 4-days week-end won't help even though I'd decide to invest all those free hours in a compo rush, I'm afraid.

Tuesday, July 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.

Je n'ai pas énormément joué à Super Mario Bros, étant gamin. Par contre, j'ai passé un nombre d'heure indécent sur le mario-like Great Giana Sisters. Que ceux qui ont eu la chance de jouer au SMB d'origine ne repoussent pas trop vite ce titre: c'est bien un jeu original et pas un simple clone. Et son challenge est tout à fait digne d'intérêt. Encore aujourd'hui, il nous titille à améliorer notre technique pour arriver à progresser de plus en plus loin dans le jeu.

Giana Sisters est un de ces jeux conçus avant l'introduction des sauvegardes, mais en contrepartie, les développeurs ont caché dans le jeu tout une série de 'point de téléportation' pour nous permettre de prendre quelques raccourcis. Jusqu'à ce qu'on parvienne à activer ces warp-blocks à coup sûr, le jeu devient donc beaucoup plus varié, avec des embranchements de gameplay. 

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.

J'ai repris mes tentatives de finir le jeu en 2008, sur le portage Nintendo DS de Mr. Sid. Et ce n'est qu'à ce moment que j'ai réalisé que les "items bizarres' entre les boules de feu à tête chercheuse et le 1-UP offrent chacun un moyen unique de saper certains challenges un peu extrême du jeu. Un saut vers un tonneau enflammé paraît trop difficile ? ce sera un jeu d'enfant avec l'item "goute d'eau" qui rend Giana inifugée.

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).

Ça manque de feedback visuel pour qu'on puisse s'en rendre compte sans youtube et sans wiki, mais c'est particulièrement bien trouvé. Et ayant pris conscience de ça, mon objectif a été révisé: pour avoir une chance de terminer le jeu, il faut d'abord que je parvienne à coup sûr à obtenir la goutte d'eau avant le fatidique niveau 11 et que je la garde jusque là. Ce qui grosso-modo réclame un sans-faute. Si jamais je tombe dans l'eau au saut un peu serré du niveau 4, je perdrai tous mes power-ups et je devrai recommencer à partir du disque de rock. Je n'aurai aucune chance de les faire évoluer à nouveau jusqu'à "goutte d'eau" avant le 11. On est bien loin du design moderne (post-SMW) où les niveaux peuvent être revisités à volonté).

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.

Dans le même ordre d'idées, le "poisson du diable" du niveau 22 devient beaucoup plus simple à passer si j'ai le power-up "réveil" qui gèle sur place tous les monstres pour un moment. Enfin, ça c'est la théorie. Il reste un élément essentiel à rappeler à ceux qui ont surtout joué au titre de Nintendo: ici les coins sont durs. Sauter du couloir-à-diamants jusqu'au par dessus l'eau dans le niveau 4 par exemple, peut sembler cool, mais si votre sprite à le malheur de se cogner ne serait-ce que d'un pixel au coin du mur, il se remettra immédiatement à tomber. SMB, dans ce genre de situation, "poussait" un peu Mario pour contourner le bloc. Au joueur de contre-carrer ça par un virage en l'air s'il était sur un rebord comme montré dans Giana, mais au moins il continue à monter. Le timing de son mouvement n'est pas source de surprises.

Friday, July 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".