Vai al contenuto
Agustina Fassina
Progetti

Librarian's Challenge

Un gioco browser rilassante in Phaser 3 in cui ordini i libri sullo scaffale. 100 livelli, catalogo con tag LGBTQ+ e demo live.

Scaffali di biblioteca con libri colorati in fase di ordinamento nel gioco Librarian's Challenge
Stack
  • Phaser 3
  • JavaScript
  • HTML5
  • WebGL
  • Docker
Inizio

Uno scaffale in disordine, una biblioteca tranquilla, un solo compito: rimettere i libri in ordine.

Librarian’s Challenge è un piccolo gioco 2D nel browser su Phaser 3. Niente framework, niente bundler. L’ho fatto per staccare: trascini i titoli al posto giusto mentre la regola di ordinamento continua a cambiare.

Giocalo live: game-library.agustinafassina.com

Cosa fai

Trascini i libri negli slot. Ogni livello introduce una regola (titolo, autore, genere, anno, o un mix) e lo scaffale cresce da pochi libri a decine su più pagine. Le challenge opzionali con tempo o mosse limitate aggiungono un po’ di pressione. Fallisci il bonus e puoi comunque finire il livello. Voluto: pressione senza rompere il loop calmo.

  • 100 livelli, da 4 a 67 libri (LEVELS.md)
  • Mouse e touch, incluso trascinare al bordo per cambiare pagina con il libro in mano
  • Progresso in localStorage: livelli sbloccati, best score, stats guest
  • UI EN / ES da Settings
  • Catalogo Books per cercare e filtrare per tag dal menu

Catalogo con tag LGBTQ+

Il gameplay può usare un catalogo offline locale (data/books.json, circa 70 titoli) oppure, se abilitato, scaricare libri reali da una API .NET companion via ricerca Google per tag. I tag includono LGBTIQ+, queer, lesbian, gay, bisexual, trans, non-binary, intersex, feminism e activism. Volevo scaffali con storie che contano, non solo filler.

In produzione useApiBooks resta false così la demo pubblica si gioca senza spedire una API key. Se l’API cade o CORS blocca, torna al JSON locale e i livelli continuano.

Come è costruito

Pezzo Scelta
Engine Phaser 3.80.1, vendored (niente CDN a runtime)
Moduli ES modules nativi: scene, rules, storage, i18n
Render Canvas WebGL (Phaser.AUTO, fallback Canvas2D), Scale.FIT
Dati fetch per levels/books; API opzionale + feedback Formspree
Deploy Docker + nginx, reverse proxy su VPS Hetzner con HTTPS

Le rules vivono in js/utils/rules.js. Lo string rule di ogni livello mappa su sort keys, getExpectedOrder() costruisce l’ordine corretto e evaluateOrder() valuta ogni slot. Uno smoke test Playwright apre ?test=1 e autosolve tutti i livelli così solvability e salvataggio del progresso restano onesti.

Repository

Demo: https://game-library.agustinafassina.com/